diff options
author | Philipp Oeser <info@graphics-engineer.com> | 2022-05-31 11:22:43 +0300 |
---|---|---|
committer | Philipp Oeser <info@graphics-engineer.com> | 2022-06-03 10:45:08 +0300 |
commit | 16d329da284c20e9dcfc0a60dcfc9b6e213ad3e0 (patch) | |
tree | 345994f9f33c4da03ab0520e473e635b6cdd62e8 /source/blender | |
parent | 9babe39de92ea9c5bd16f2ae2f5e5895271799c9 (diff) |
Compositor: add pre/post/cancel handlers and background job info
Main motivation is from T54314 where there was no way to read from a
Viewer image datablock after the compositor has run.
The only solution there was to do a full rerender (which obviously takes
much longer). Adding a handler avoids having to rerender.
This uses new syntax from rBf4456a4d3c97 and also adds "COMPOSITE" as a
job type that can be queried by `bpy.app.is_job_running`.
NOTE: there is another issue when multiple viewers are used and these
get active via RNA (compo execution is not triggered there yet -- unlike
when a viewer is selected in the Editor -- this is an issue of
`ED_node_set_active` vs. only `nodeSetActive`, but this will be tackled
separately)
Maniphest Tasks: T54314
Differential Revision: https://developer.blender.org/D15078
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_callbacks.h | 3 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_edit.cc | 26 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_wm.c | 1 | ||||
-rw-r--r-- | source/blender/python/intern/bpy_app_handlers.c | 4 |
4 files changed, 32 insertions, 2 deletions
diff --git a/source/blender/blenkernel/BKE_callbacks.h b/source/blender/blenkernel/BKE_callbacks.h index d8c67c52edc..8c65214c78e 100644 --- a/source/blender/blenkernel/BKE_callbacks.h +++ b/source/blender/blenkernel/BKE_callbacks.h @@ -100,6 +100,9 @@ typedef enum { BKE_CB_EVT_OBJECT_BAKE_PRE, BKE_CB_EVT_OBJECT_BAKE_COMPLETE, BKE_CB_EVT_OBJECT_BAKE_CANCEL, + BKE_CB_EVT_COMPOSITE_PRE, + BKE_CB_EVT_COMPOSITE_POST, + BKE_CB_EVT_COMPOSITE_CANCEL, BKE_CB_EVT_TOT, } eCbEvent; diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/editors/space_node/node_edit.cc index ab80a44d636..ffc9befc81c 100644 --- a/source/blender/editors/space_node/node_edit.cc +++ b/source/blender/editors/space_node/node_edit.cc @@ -15,6 +15,7 @@ #include "DNA_text_types.h" #include "DNA_world_types.h" +#include "BKE_callbacks.h" #include "BKE_context.h" #include "BKE_global.h" #include "BKE_image.h" @@ -275,6 +276,7 @@ static void compo_startjob(void *cjv, // XXX BIF_store_spare(); /* 1 is do_previews */ + BKE_callback_exec_id(cj->bmain, &scene->id, BKE_CB_EVT_COMPOSITE_PRE); if ((cj->scene->r.scemode & R_MULTIVIEW) == 0) { ntreeCompositExecTree(cj->scene, ntree, &cj->scene->r, false, true, ""); @@ -293,6 +295,22 @@ static void compo_startjob(void *cjv, ntree->progress = nullptr; } +static void compo_canceljob(void *cjv) +{ + CompoJob *cj = (CompoJob *)cjv; + Main *bmain = cj->bmain; + Scene *scene = cj->scene; + BKE_callback_exec_id(bmain, &scene->id, BKE_CB_EVT_COMPOSITE_CANCEL); +} + +static void compo_completejob(void *cjv) +{ + CompoJob *cj = (CompoJob *)cjv; + Main *bmain = cj->bmain; + Scene *scene = cj->scene; + BKE_callback_exec_id(bmain, &scene->id, BKE_CB_EVT_COMPOSITE_POST); +} + /** \} */ } // namespace blender::ed::space_node @@ -339,7 +357,13 @@ void ED_node_composite_job(const bContext *C, struct bNodeTree *nodetree, Scene /* setup job */ WM_jobs_customdata_set(wm_job, cj, compo_freejob); WM_jobs_timer(wm_job, 0.1, NC_SCENE | ND_COMPO_RESULT, NC_SCENE | ND_COMPO_RESULT); - WM_jobs_callbacks(wm_job, compo_startjob, compo_initjob, compo_updatejob, nullptr); + WM_jobs_callbacks_ex(wm_job, + compo_startjob, + compo_initjob, + compo_updatejob, + nullptr, + compo_completejob, + compo_canceljob); WM_jobs_start(CTX_wm_manager(C), wm_job); } diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index 1482c25fb9c..3ff9e6be3ce 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -137,6 +137,7 @@ const EnumPropertyItem rna_enum_wm_job_type_items[] = { {WM_JOB_TYPE_RENDER, "RENDER", 0, "Regular rendering", ""}, {WM_JOB_TYPE_RENDER_PREVIEW, "RENDER_PREVIEW", 0, "Rendering previews", ""}, {WM_JOB_TYPE_OBJECT_BAKE, "OBJECT_BAKE", 0, "Object Baking", ""}, + {WM_JOB_TYPE_COMPOSITE, "COMPOSITE", 0, "Compositing", ""}, {0, NULL, 0, NULL, NULL}, }; diff --git a/source/blender/python/intern/bpy_app_handlers.c b/source/blender/python/intern/bpy_app_handlers.c index 40f4b8af1cc..641727927ec 100644 --- a/source/blender/python/intern/bpy_app_handlers.c +++ b/source/blender/python/intern/bpy_app_handlers.c @@ -66,10 +66,12 @@ static PyStructSequence_Field app_cb_info_fields[] = { {"xr_session_start_pre", "on starting an xr session (before)"}, {"annotation_pre", "on drawing an annotation (before)"}, {"annotation_post", "on drawing an annotation (after)"}, - {"object_bake_pre", "before starting a bake job"}, {"object_bake_complete", "on completing a bake job; will be called in the main thread"}, {"object_bake_cancel", "on canceling a bake job; will be called in the main thread"}, + {"composite_pre", "on a compositing background job (before)"}, + {"composite_post", "on a compositing background job (after)"}, + {"composite_cancel", "on a compositing background job (cancel)"}, /* sets the permanent tag */ #define APP_CB_OTHER_FIELDS 1 |