Blender V5.0
bpy_rna_driver.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10
11#include <Python.h>
12
13#include "DNA_anim_types.h"
14
15#include "BKE_fcurve_driver.h"
16
17#include "RNA_access.hh"
18
19#include "bpy_rna.hh"
20
21#include "bpy_rna_driver.hh" /* own include */
22
23PyObject *pyrna_driver_get_variable_value(const AnimationEvalContext *anim_eval_context,
24 ChannelDriver *driver,
25 DriverVar *dvar,
26 DriverTarget *dtar)
27{
29 PropertyRNA *prop = nullptr;
30 int index;
31
33 anim_eval_context, driver, dvar, dtar, true, &ptr, &prop, &index))
34 {
36 /* object only */
37 if (!prop) {
39 }
40
41 /* object, property & index */
42 if (index >= 0) {
43 return pyrna_array_index(&ptr, prop, index);
44 }
45
46 /* object & property (enum) */
47 if (RNA_property_type(prop) == PROP_ENUM) {
48 /* Note that enum's are converted to strings by default,
49 * we want to avoid that, see: #52213 */
50 return PyLong_FromLong(RNA_property_enum_get(&ptr, prop));
51 }
52
53 /* object & property */
54 return pyrna_prop_to_py(&ptr, prop);
55
57 return PyFloat_FromDouble(dtar->fallback_value);
58
61 /* can't resolve path, pass */
62 return nullptr;
63 }
64
65 return nullptr;
66}
67
69{
70 return pyrna_struct_CreatePyObject(&anim_rna->ptr);
71}
72
73bool pyrna_driver_is_equal_anim_rna(const PathResolvedRNA *anim_rna, const PyObject *py_anim_rna)
74{
75 if (BPy_StructRNA_Check(py_anim_rna)) {
76 const PointerRNA *ptr_a = &anim_rna->ptr;
77 const PointerRNA *ptr_b = &reinterpret_cast<const BPy_StructRNA *>(py_anim_rna)->ptr.value();
78
79 if ((ptr_a->owner_id == ptr_b->owner_id) && (ptr_a->type == ptr_b->type) &&
80 (ptr_a->data == ptr_b->data))
81 {
82 return true;
83 }
84 }
85 return false;
86}
eDriverVariablePropertyResult driver_get_variable_property(const struct AnimationEvalContext *anim_eval_context, struct ChannelDriver *driver, struct DriverVar *dvar, struct DriverTarget *dtar, bool allow_no_index, struct PointerRNA *r_ptr, struct PropertyRNA **r_prop, int *r_index)
@ DRIVER_VAR_PROPERTY_SUCCESS
@ DRIVER_VAR_PROPERTY_FALLBACK
@ DRIVER_VAR_PROPERTY_INVALID_INDEX
@ DRIVER_VAR_PROPERTY_INVALID
@ PROP_ENUM
Definition RNA_types.hh:166
PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
Definition bpy_rna.cc:1445
PyObject * pyrna_struct_CreatePyObject(PointerRNA *ptr)
Definition bpy_rna.cc:8496
PyObject * pyrna_array_index(PointerRNA *ptr, PropertyRNA *prop, int index)
#define BPy_StructRNA_Check(v)
Definition bpy_rna.hh:73
PyObject * pyrna_driver_get_variable_value(const AnimationEvalContext *anim_eval_context, ChannelDriver *driver, DriverVar *dvar, DriverTarget *dtar)
PyObject * pyrna_driver_self_from_anim_rna(PathResolvedRNA *anim_rna)
bool pyrna_driver_is_equal_anim_rna(const PathResolvedRNA *anim_rna, const PyObject *py_anim_rna)
PropertyType RNA_property_type(PropertyRNA *prop)
int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
PointerRNA ptr
Definition RNA_types.hh:153
ID * owner_id
Definition RNA_types.hh:51
StructRNA * type
Definition RNA_types.hh:52
void * data
Definition RNA_types.hh:53
PointerRNA * ptr
Definition wm_files.cc:4238