Blender V4.3
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
11#include <Python.h>
12
13#include "MEM_guardedalloc.h"
14
15#include "DNA_anim_types.h"
16
17#include "BLI_utildefines.h"
18
19#include "BKE_fcurve_driver.h"
20
21#include "RNA_access.hh"
22
23#include "bpy_rna.hh"
24
25#include "bpy_rna_driver.hh" /* own include */
26
27PyObject *pyrna_driver_get_variable_value(const AnimationEvalContext *anim_eval_context,
28 ChannelDriver *driver,
29 DriverVar *dvar,
30 DriverTarget *dtar)
31{
33 PropertyRNA *prop = nullptr;
34 int index;
35
37 anim_eval_context, driver, dvar, dtar, true, &ptr, &prop, &index))
38 {
40 /* object only */
41 if (!prop) {
43 }
44
45 /* object, property & index */
46 if (index >= 0) {
47 return pyrna_array_index(&ptr, prop, index);
48 }
49
50 /* object & property (enum) */
51 if (RNA_property_type(prop) == PROP_ENUM) {
52 /* Note that enum's are converted to strings by default,
53 * we want to avoid that, see: #52213 */
54 return PyLong_FromLong(RNA_property_enum_get(&ptr, prop));
55 }
56
57 /* object & property */
58 return pyrna_prop_to_py(&ptr, prop);
59
61 return PyFloat_FromDouble(dtar->fallback_value);
62
65 /* can't resolve path, pass */
66 return nullptr;
67 }
68
69 return nullptr;
70}
71
73{
74 return pyrna_struct_CreatePyObject(&anim_rna->ptr);
75}
76
77bool pyrna_driver_is_equal_anim_rna(const PathResolvedRNA *anim_rna, const PyObject *py_anim_rna)
78{
79 if (BPy_StructRNA_Check(py_anim_rna)) {
80 const PointerRNA *ptr_a = &anim_rna->ptr;
81 const PointerRNA *ptr_b = &(((const BPy_StructRNA *)py_anim_rna)->ptr);
82
83 if ((ptr_a->owner_id == ptr_b->owner_id) && (ptr_a->type == ptr_b->type) &&
84 (ptr_a->data == ptr_b->data))
85 {
86 return true;
87 }
88 }
89 return false;
90}
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
Read Guarded memory(de)allocation.
@ PROP_ENUM
Definition RNA_types.hh:69
PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
Definition bpy_rna.cc:1405
PyObject * pyrna_struct_CreatePyObject(PointerRNA *ptr)
Definition bpy_rna.cc:7694
PyObject * pyrna_array_index(PointerRNA *ptr, PropertyRNA *prop, int index)
#define BPy_StructRNA_Check(v)
Definition bpy_rna.hh:69
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:56
ID * owner_id
Definition RNA_types.hh:40
StructRNA * type
Definition RNA_types.hh:41
void * data
Definition RNA_types.hh:42
PointerRNA * ptr
Definition wm_files.cc:4126