diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-09-09 11:25:04 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-09-11 11:43:27 +0300 |
commit | a650258158dd7ad8fa9b6cb1b7da749e30ae15c1 (patch) | |
tree | 840b324fbf9739dce8ac50da1acde80e2fb4f140 /source/blender/blenkernel | |
parent | 022de797f1773f512f21cf9038787dd77e0fd5de (diff) |
Python handlers: Pass depsgraph to events where it makes sense
The goal is to make it possible to access evaluated datablocks at a
corresponding context. For example, be able to check evaluated state
if an object used for rendering.
Allows to write scripts in a safe manner for T63548 and T60094.
Reviewers: brecht
Differential Revision: https://developer.blender.org/D5726
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_callbacks.h | 15 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/callbacks.c | 41 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 9 |
3 files changed, 57 insertions, 8 deletions
diff --git a/source/blender/blenkernel/BKE_callbacks.h b/source/blender/blenkernel/BKE_callbacks.h index 380ce30668d..e15cf7fed18 100644 --- a/source/blender/blenkernel/BKE_callbacks.h +++ b/source/blender/blenkernel/BKE_callbacks.h @@ -21,8 +21,10 @@ #ifndef __BKE_CALLBACKS_H__ #define __BKE_CALLBACKS_H__ +struct Depsgraph; struct ID; struct Main; +struct PointerRNA; /** * Common suffix uses: @@ -59,12 +61,21 @@ typedef enum { typedef struct bCallbackFuncStore { struct bCallbackFuncStore *next, *prev; - void (*func)(struct Main *, struct ID *, void *arg); + void (*func)(struct Main *, struct PointerRNA **, const int num_pointers, void *arg); void *arg; short alloc; } bCallbackFuncStore; -void BKE_callback_exec(struct Main *bmain, struct ID *self, eCbEvent evt); +void BKE_callback_exec(struct Main *bmain, + struct PointerRNA **pointers, + const int num_pointers, + eCbEvent evt); +void BKE_callback_exec_null(struct Main *bmain, eCbEvent evt); +void BKE_callback_exec_id(struct Main *bmain, struct ID *id, eCbEvent evt); +void BKE_callback_exec_id_depsgraph(struct Main *bmain, + struct ID *id, + struct Depsgraph *depsgraph, + eCbEvent evt); void BKE_callback_add(bCallbackFuncStore *funcstore, eCbEvent evt); void BKE_callback_global_init(void); diff --git a/source/blender/blenkernel/intern/callbacks.c b/source/blender/blenkernel/intern/callbacks.c index cbecba2efe1..367fed818af 100644 --- a/source/blender/blenkernel/intern/callbacks.c +++ b/source/blender/blenkernel/intern/callbacks.c @@ -25,18 +25,55 @@ #include "MEM_guardedalloc.h" +#include "RNA_types.h" +#include "RNA_access.h" + static ListBase callback_slots[BKE_CB_EVT_TOT] = {{NULL}}; -void BKE_callback_exec(struct Main *bmain, struct ID *self, eCbEvent evt) +void BKE_callback_exec(struct Main *bmain, + struct PointerRNA **pointers, + const int num_pointers, + eCbEvent evt) { ListBase *lb = &callback_slots[evt]; bCallbackFuncStore *funcstore; for (funcstore = lb->first; funcstore; funcstore = funcstore->next) { - funcstore->func(bmain, self, funcstore->arg); + funcstore->func(bmain, pointers, num_pointers, funcstore->arg); } } +void BKE_callback_exec_null(struct Main *bmain, eCbEvent evt) +{ + BKE_callback_exec(bmain, NULL, 0, evt); +} + +void BKE_callback_exec_id(struct Main *bmain, struct ID *id, eCbEvent evt) +{ + PointerRNA id_ptr; + RNA_id_pointer_create(id, &id_ptr); + + PointerRNA *pointers[1] = {&id_ptr}; + + BKE_callback_exec(bmain, pointers, 1, evt); +} + +void BKE_callback_exec_id_depsgraph(struct Main *bmain, + struct ID *id, + struct Depsgraph *depsgraph, + eCbEvent evt) +{ + PointerRNA id_ptr; + RNA_id_pointer_create(id, &id_ptr); + + PointerRNA depsgraph_ptr; + RNA_pointer_create(NULL, &RNA_Depsgraph, depsgraph, &depsgraph_ptr); + + PointerRNA *pointers[2] = {&id_ptr, &depsgraph_ptr}; + + BKE_callback_exec(bmain, pointers, 2, evt); +} + void BKE_callback_add(bCallbackFuncStore *funcstore, eCbEvent evt) { ListBase *lb = &callback_slots[evt]; diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index aa812dff877..cd10713897a 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -1309,7 +1309,7 @@ static void scene_graph_update_tagged(Depsgraph *depsgraph, Main *bmain, bool on bool run_callbacks = DEG_id_type_any_updated(depsgraph); if (run_callbacks) { - BKE_callback_exec(bmain, &scene->id, BKE_CB_EVT_DEPSGRAPH_UPDATE_PRE); + BKE_callback_exec_id(bmain, &scene->id, BKE_CB_EVT_DEPSGRAPH_UPDATE_PRE); } for (int pass = 0; pass < 2; pass++) { @@ -1327,7 +1327,8 @@ static void scene_graph_update_tagged(Depsgraph *depsgraph, Main *bmain, bool on BKE_scene_update_sound(depsgraph, bmain); /* Notify python about depsgraph update. */ if (run_callbacks) { - BKE_callback_exec(bmain, &scene->id, BKE_CB_EVT_DEPSGRAPH_UPDATE_POST); + BKE_callback_exec_id_depsgraph( + bmain, &scene->id, depsgraph, BKE_CB_EVT_DEPSGRAPH_UPDATE_POST); } /* Inform editors about possible changes. */ DEG_ids_check_recalc(bmain, depsgraph, scene, view_layer, false); @@ -1362,7 +1363,7 @@ void BKE_scene_graph_update_for_newframe(Depsgraph *depsgraph, Main *bmain) ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph); /* Keep this first. */ - BKE_callback_exec(bmain, &scene->id, BKE_CB_EVT_FRAME_CHANGE_PRE); + BKE_callback_exec_id(bmain, &scene->id, BKE_CB_EVT_FRAME_CHANGE_PRE); for (int pass = 0; pass < 2; pass++) { /* Update animated image textures for particles, modifiers, gpu, etc, @@ -1384,7 +1385,7 @@ void BKE_scene_graph_update_for_newframe(Depsgraph *depsgraph, Main *bmain) /* Notify editors and python about recalc. */ if (pass == 0) { - BKE_callback_exec(bmain, &scene->id, BKE_CB_EVT_FRAME_CHANGE_POST); + BKE_callback_exec_id_depsgraph(bmain, &scene->id, depsgraph, BKE_CB_EVT_FRAME_CHANGE_POST); } /* Inform editors about possible changes. */ |