[Bf-blender-cvs] [012c8b56ed6] temp-lineart-contained: LineArt: Use job system for baking.
YimingWu
noreply at git.blender.org
Fri Mar 5 15:44:08 CET 2021
Commit: 012c8b56ed679291fd391a445bb1d6e7da073cde
Author: YimingWu
Date: Fri Mar 5 22:12:43 2021 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rB012c8b56ed679291fd391a445bb1d6e7da073cde
LineArt: Use job system for baking.
===================================================================
M release/datafiles/locale
M release/scripts/addons
M release/scripts/addons_contrib
M source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
M source/blender/gpencil_modifiers/intern/lineart/ED_lineart.h
M source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
M source/blender/windowmanager/WM_api.h
M source/tools
===================================================================
diff --git a/release/datafiles/locale b/release/datafiles/locale
index aafea2abb18..8a05b618f03 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit aafea2abb18bb42e7d31a6926b2caba90f4e0316
+Subproject commit 8a05b618f031582c006c6f62b9e60619ab3eef8b
diff --git a/release/scripts/addons b/release/scripts/addons
index 24e756c0da8..67f1fbca148 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit 24e756c0da89bdbf88dc22163ae3b7ef4f1fbb73
+Subproject commit 67f1fbca1482d9d9362a4001332e785c3fd5d230
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
index a140f066ac9..ef6ef414d22 160000
--- a/release/scripts/addons_contrib
+++ b/release/scripts/addons_contrib
@@ -1 +1 @@
-Subproject commit a140f066ac99e1860af38080f008507029a34706
+Subproject commit ef6ef414d22c2578fad99327743b925ab640a99c
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
index fad4d181441..32df51bd614 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
@@ -392,7 +392,7 @@ static void baking_panel_draw(const bContext *UNUSED(C), Panel *panel)
uiItemO(layout,
IFACE_("Bake All Line Art Objects"),
ICON_NONE,
- "OBJECT_OT_lineart_bake_all_strokes");
+ "OBJECT_OT_lineart_bake_strokes_all_gp");
uiItemO(layout, IFACE_("Clear Current Object"), ICON_NONE, "OBJECT_OT_lineart_clear_strokes");
uiItemO(layout, IFACE_("Clear All Objects"), ICON_NONE, "OBJECT_OT_lineart_clear_all_strokes");
}
diff --git a/source/blender/gpencil_modifiers/intern/lineart/ED_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/ED_lineart.h
index e637a3bb321..c5b3c742325 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/ED_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/ED_lineart.h
@@ -579,7 +579,7 @@ struct wmOperatorType;
/* Operator types */
void OBJECT_OT_lineart_bake_strokes(struct wmOperatorType *ot);
-void OBJECT_OT_lineart_bake_all_strokes(struct wmOperatorType *ot);
+void OBJECT_OT_lineart_bake_strokes_all_gp(struct wmOperatorType *ot);
void OBJECT_OT_lineart_clear_strokes(struct wmOperatorType *ot);
void OBJECT_OT_lineart_clear_all_strokes(struct wmOperatorType *ot);
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
index 61faa40336c..628b29e0f34 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
@@ -23,6 +23,8 @@
#include <stdlib.h>
+#include "MEM_guardedalloc.h"
+
#include "BKE_collection.h"
#include "BKE_context.h"
#include "BKE_gpencil.h"
@@ -68,7 +70,6 @@ static void clear_strokes(Object *ob, GpencilModifierData *md, int frame)
BKE_gpencil_layer_frame_delete(gpl, gpf);
}
-// TODO use the job system for baking so that the UI doesn't freeze on big bake tasks.
static void bake_strokes(Object *ob, Depsgraph *dg, GpencilModifierData *md, int frame)
{
if (md->type != eGpencilModifierType_Lineart) {
@@ -118,111 +119,143 @@ static void bake_strokes(Object *ob, Depsgraph *dg, GpencilModifierData *md, int
ED_lineart_destroy_render_data(lmd);
}
-static int lineart_gpencil_bake_all_strokes_invoke(bContext *C,
- wmOperator *op,
- const wmEvent *UNUSED(event))
-{
- Scene *scene = CTX_data_scene(C);
- Depsgraph *dg = CTX_data_depsgraph_pointer(C);
+typedef struct LineartBakeJob {
+ /* C or ob must have one != NULL. */
+ bContext *C;
+ Object *ob;
+ Scene *scene;
+ Depsgraph *dg;
int frame;
- int frame_begin = scene->r.sfra;
- int frame_end = scene->r.efra;
- int frame_orig = scene->r.cfra;
- int frame_increment = scene->r.frame_step;
- bool overwrite_frames = true;
-
- for (frame = frame_begin; frame <= frame_end; frame += frame_increment) {
+ int frame_begin;
+ int frame_end;
+ int frame_orig;
+ int frame_increment;
+ bool overwrite_frames;
+} LineartBakeJob;
+
+static void lineart_gpencil_bake_single_target(LineartBakeJob *bj, Object *ob)
+{
+ for (int frame = bj->frame_begin; frame <= bj->frame_end; frame += bj->frame_increment) {
- BKE_scene_frame_set(scene, frame);
- BKE_scene_graph_update_for_newframe(dg);
+ BKE_scene_frame_set(bj->scene, frame);
+ BKE_scene_graph_update_for_newframe(bj->dg);
+ if (ob->type != OB_GPENCIL) {
+ continue;
+ }
- CTX_DATA_BEGIN (C, Object *, ob, visible_objects) {
- if (ob->type != OB_GPENCIL) {
- continue;
+ if (bj->overwrite_frames) {
+ LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
+ clear_strokes(ob, md, frame);
}
+ }
- if (overwrite_frames) {
- LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
- clear_strokes(ob, md, frame);
- }
- }
+ LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
+ bake_strokes(ob, bj->dg, md, frame);
+ }
+ }
+}
- LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
- bake_strokes(ob, dg, md, frame);
- }
+static void lineart_gpencil_bake_startjob(void *customdata,
+ short *stop,
+ short *do_update,
+ float *progress)
+{
+ LineartBakeJob *bj = (LineartBakeJob *)customdata;
+
+ if (bj->ob) {
+ /* Which means only bake one line art gpencil object, specified by bj->ob. */
+ lineart_gpencil_bake_single_target(bj, bj->ob);
+ }
+ else {
+ CTX_DATA_BEGIN (bj->C, Object *, ob, visible_objects) {
+ lineart_gpencil_bake_single_target(bj, ob);
}
CTX_DATA_END;
}
/* Restore original frame. */
- BKE_scene_frame_set(scene, frame_orig);
- BKE_scene_graph_update_for_newframe(dg);
-
- BKE_report(op->reports, RPT_INFO, "Line Art baking is complete.");
- WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
-
- return OPERATOR_FINISHED;
+ BKE_scene_frame_set(bj->scene, bj->frame_orig);
+ BKE_scene_graph_update_for_newframe(bj->dg);
}
-static int lineart_gpencil_bake_all_strokes_exec(bContext *C, wmOperator *UNUSED(op))
+static void lineart_gpencil_bake_endjob(void *customdata)
{
- Scene *scene = CTX_data_scene(C);
+ LineartBakeJob *bj = customdata;
- /* If confirmed in the dialog, then just turn off the master switch upon finished baking. */
- // scene->lineart.flags &= (~LRT_AUTO_UPDATE);
+ WM_set_locked_interface(CTX_wm_manager(bj->C), false);
- return OPERATOR_FINISHED;
+ WM_main_add_notifier(NC_SCENE | ND_FRAME, bj->scene);
+ WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, bj->ob);
}
-static int lineart_gpencil_bake_strokes_invoke(bContext *C,
- wmOperator *op,
- const wmEvent *UNUSED(event))
+static int lineart_gpencil_bake_common_invoke(bContext *C, wmOperator *op, bool bake_all_targets)
{
- Object *ob = CTX_data_active_object(C);
-
+ LineartBakeJob *bj = MEM_callocN(sizeof(LineartBakeJob), "LineartBakeJob");
+
+ bj->C = C;
+ if (!bake_all_targets) {
+ bj->ob = CTX_data_active_object(C);
+ if (!bj->ob || bj->ob->type != OB_GPENCIL) {
+ WM_report(RPT_ERROR, "No active object or active object isn't a GPencil object.");
+ return OPERATOR_FINISHED;
+ }
+ }
Scene *scene = CTX_data_scene(C);
- Depsgraph *dg = CTX_data_depsgraph_pointer(C);
- int frame;
- int frame_begin = scene->r.sfra;
- int frame_end = scene->r.efra;
- int frame_orig = scene->r.cfra;
- int frame_increment = scene->r.frame_step;
- bool overwrite_frames = true;
+ bj->scene = scene;
+ bj->dg = CTX_data_depsgraph_pointer(C);
+ bj->frame_begin = scene->r.sfra;
+ bj->frame_end = scene->r.efra;
+ bj->frame_orig = scene->r.cfra;
+ bj->frame_increment = scene->r.frame_step;
+ bj->overwrite_frames = true;
- for (frame = frame_begin; frame <= frame_end; frame += frame_increment) {
+ wmJob *wm_job = WM_jobs_get(CTX_wm_manager(C),
+ CTX_wm_window(C),
+ CTX_data_scene(C),
+ "Line Art",
+ WM_JOB_PROGRESS,
+ WM_JOB_TYPE_LINEART);
- BKE_scene_frame_set(scene, frame);
- BKE_scene_graph_update_for_newframe(dg);
- if (ob->type != OB_GPENCIL) {
- continue;
- }
+ WM_jobs_customdata_set(wm_job, bj, MEM_freeN);
+ WM_jobs_timer(wm_job, 0.1, NC_GPENCIL | ND_DATA | NA_EDITED, NC_GPENCIL | ND_DATA | NA_EDITED);
+ WM_jobs_callbacks(
+ wm_job, lineart_gpencil_bake_startjob, NULL, NULL, lineart_gpencil_bake_endjob);
- if (overwrite_frames) {
- LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
- clear_strokes(ob, md, frame);
- }
- }
+ WM_set_locked_interface(CTX_wm_manager(C), true);
- LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
- bake_strokes(ob, dg, md, frame);
- }
- }
+ WM_jobs_start(CTX_wm_manager(C), wm_job);
- /* Restore original frame. */
- BKE_scene_frame_set(scene, frame_orig);
- BKE_scene_graph_update_for_newframe(dg);
+ WM_event_add_modal_handler(C, op);
- BKE_report(op->reports, RPT_INFO, "Line Art baking is complete.");
- WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
+ return OPERATOR_RUNNING_MODAL;
+}
- return OPERATOR_FINISHED;
+static int lineart_gpencil_bake_all_strokes_invoke(bContext *C,
+ wmOperator *op,
+ const wmEvent *UNUSED(event))
+{
+ return lineart_gpencil_bake_common_invoke(C, op, true);
+}
+
+static int lineart_gpencil_bake_strokes_invoke(bContext *C,
+ wmOperator *op,
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list