[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