PyDriver support for all RNA property types
Support for driver variables that don't resolve to numbers, eg: objects, bones, curves... etc. Without this, Python expressions to access this data needed to use an absolute path from `bpy.data`, however this is inconvenient, breaks easily (based on naming) and wouldn't set the dependencies correctly.
This commit is contained in:
79
source/blender/python/intern/bpy_rna_driver.c
Normal file
79
source/blender/python/intern/bpy_rna_driver.c
Normal file
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
/** \file blender/python/intern/bpy_rna_driver.c
|
||||
* \ingroup pythonintern
|
||||
*
|
||||
* This file defines utility functions that use the RNA API, from PyDrivers.
|
||||
*/
|
||||
|
||||
#include <Python.h>
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
#include "BKE_fcurve.h"
|
||||
|
||||
#include "RNA_access.h"
|
||||
|
||||
#include "bpy_rna.h"
|
||||
|
||||
#include "bpy_rna_driver.h" /* own include */
|
||||
|
||||
|
||||
/**
|
||||
* A version of #driver_get_variable_value which returns a PyObject.
|
||||
*/
|
||||
PyObject *pyrna_driver_get_variable_value(
|
||||
struct ChannelDriver *driver, struct DriverTarget *dtar)
|
||||
{
|
||||
PyObject *driver_arg = NULL;
|
||||
PointerRNA ptr;
|
||||
PropertyRNA *prop = NULL;
|
||||
int index;
|
||||
|
||||
if (driver_get_variable_property(driver, dtar, &ptr, &prop, &index)) {
|
||||
if (prop) {
|
||||
if (index != -1) {
|
||||
if (index < RNA_property_array_length(&ptr, prop) && index >= 0) {
|
||||
/* object, property & index */
|
||||
driver_arg = pyrna_array_index(&ptr, prop, index);
|
||||
}
|
||||
else {
|
||||
/* out of range, pass */
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* object & property */
|
||||
driver_arg = pyrna_prop_to_py(&ptr, prop);
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* object only */
|
||||
driver_arg = pyrna_struct_CreatePyObject(&ptr);
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* can't resolve path, pass */
|
||||
}
|
||||
|
||||
return driver_arg;
|
||||
}
|
Reference in New Issue
Block a user