Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2016-04-05 00:02:43 +0300
committerCampbell Barton <ideasman42@gmail.com>2016-04-05 00:38:57 +0300
commit82b0a9e36900c8aeb374078bd4cb3a7d7f8295e6 (patch)
treea3fc9e26f72de53c47de2637e52164a24a875f6f /source/blender/python
parent65f279b7705a14ffdbd79f1835504344af40c283 (diff)
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.
Diffstat (limited to 'source/blender/python')
-rw-r--r--source/blender/python/intern/CMakeLists.txt2
-rw-r--r--source/blender/python/intern/bpy_driver.c27
-rw-r--r--source/blender/python/intern/bpy_rna_driver.c79
-rw-r--r--source/blender/python/intern/bpy_rna_driver.h33
4 files changed, 135 insertions, 6 deletions
diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt
index fa7c94025f7..2715d2c5992 100644
--- a/source/blender/python/intern/CMakeLists.txt
+++ b/source/blender/python/intern/CMakeLists.txt
@@ -71,6 +71,7 @@ set(SRC
bpy_rna_anim.c
bpy_rna_array.c
bpy_rna_callback.c
+ bpy_rna_driver.c
bpy_rna_id_collection.c
bpy_traceback.c
bpy_util.c
@@ -99,6 +100,7 @@ set(SRC
bpy_rna.h
bpy_rna_anim.h
bpy_rna_callback.h
+ bpy_rna_driver.h
bpy_rna_id_collection.h
bpy_traceback.h
bpy_util.h
diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c
index dd1b4eae61b..f9c0982a4c3 100644
--- a/source/blender/python/intern/bpy_driver.c
+++ b/source/blender/python/intern/bpy_driver.c
@@ -42,10 +42,13 @@
#include "BKE_fcurve.h"
#include "BKE_global.h"
+#include "bpy_rna_driver.h" /* for pyrna_driver_get_variable_value */
+
#include "bpy_driver.h"
extern void BPY_update_rna_module(void);
+#define USE_RNA_AS_PYOBJECT
/* for pydrivers (drivers using one-line Python expressions to express relationships between targets) */
PyObject *bpy_pydriver_Dict = NULL;
@@ -262,12 +265,24 @@ float BPY_driver_exec(ChannelDriver *driver, const float evaltime)
driver_vars = PyDict_New();
for (dvar = driver->variables.first, i = 0; dvar; dvar = dvar->next) {
PyObject *driver_arg = NULL;
- float tval = 0.0f;
-
- /* try to get variable value */
- tval = driver_get_variable_value(driver, dvar);
- driver_arg = PyFloat_FromDouble((double)tval);
-
+
+ /* support for any RNA data */
+#ifdef USE_RNA_AS_PYOBJECT
+ if (dvar->type == DVAR_TYPE_SINGLE_PROP) {
+ driver_arg = pyrna_driver_get_variable_value(driver, &dvar->targets[0]);
+
+ if (driver_arg == NULL) {
+ driver_arg = PyFloat_FromDouble(0.0);
+ }
+ }
+ else
+#endif
+ {
+ /* try to get variable value */
+ float tval = driver_get_variable_value(driver, dvar);
+ driver_arg = PyFloat_FromDouble((double)tval);
+ }
+
/* try to add to dictionary */
/* if (PyDict_SetItemString(driver_vars, dvar->name, driver_arg)) { */
if (PyDict_SetItem(driver_vars, PyTuple_GET_ITEM(expr_vars, i++), driver_arg) < 0) {
diff --git a/source/blender/python/intern/bpy_rna_driver.c b/source/blender/python/intern/bpy_rna_driver.c
new file mode 100644
index 00000000000..482508a8d85
--- /dev/null
+++ b/source/blender/python/intern/bpy_rna_driver.c
@@ -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;
+}
diff --git a/source/blender/python/intern/bpy_rna_driver.h b/source/blender/python/intern/bpy_rna_driver.h
new file mode 100644
index 00000000000..8deac2e4384
--- /dev/null
+++ b/source/blender/python/intern/bpy_rna_driver.h
@@ -0,0 +1,33 @@
+/*
+ * ***** 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 *****
+ */
+
+#ifndef __BPY_RNA_DRIVER_H__
+#define __BPY_RNA_DRIVER_H__
+
+/** \file blender/python/intern/bpy_rna_driver.h
+ * \ingroup pythonintern
+ */
+
+struct ChannelDriver;
+struct DriverTarget;
+
+PyObject *pyrna_driver_get_variable_value(struct ChannelDriver *driver, struct DriverTarget *dtar);
+
+#endif /* __BPY_RNA_DRIVER_H__ */