[Bf-blender-cvs] [d40048b01ad] temp-lineart-contained: LineArt: Using object list for baking job

YimingWu noreply at git.blender.org
Fri Mar 12 14:28:18 CET 2021


Commit: d40048b01ad9124ab2b34280ce834eb8ee221762
Author: YimingWu
Date:   Fri Mar 12 21:28:02 2021 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rBd40048b01ad9124ab2b34280ce834eb8ee221762

LineArt: Using object list for baking job

===================================================================

M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
M	source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c

===================================================================

diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index 945f8c4c533..7998bd6db14 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -2395,11 +2395,6 @@ static LineartRenderLine *lineart_triangle_intersect(LineartRenderBuffer *rb,
   result->tl = rt;
   result->tr = testing;
 
-  /** TODO: Use bit flags similar to transparency_mask to select intersection pairs, or to use rt
-   * address as rt's are continuously allocated in memory for each object. object_ref is removed.
-   */
-  /* result->object_ref = rt->object_ref;. */
-
   LineartRenderLineSegment *rls = lineart_mem_aquire(&rb->render_data_pool,
                                                      sizeof(LineartRenderLineSegment));
   BLI_addtail(&result->segments, rls);
@@ -3748,7 +3743,6 @@ static void lineart_gpencil_generate(LineartRenderBuffer *rb,
                 int sindex = 0, vindex;
                 LISTBASE_FOREACH (LineartRenderLineChainItem *, rlci, &rlc->chain) {
                   vindex = rlci->index;
-                  /* XXX: Here doesn't have post-modifier dvert!. */
                   if (vindex >= me->totvert) {
                     break;
                   }
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
index 1f4c03adbd5..9d0787c4be1 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
@@ -45,6 +45,7 @@
 
 #include "UI_resources.h"
 
+#include "MOD_gpencil_lineart.h"
 #include "MOD_lineart.h"
 
 #include "lineart_intern.h"
@@ -73,9 +74,6 @@ static void clear_strokes(Object *ob, GpencilModifierData *md, int frame)
 
 static bool bake_strokes(Object *ob, Depsgraph *dg, GpencilModifierData *md, int frame)
 {
-  if (md->type != eGpencilModifierType_Lineart) {
-    return false;
-  }
   LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
   bGPdata *gpd = ob->data;
 
@@ -130,7 +128,7 @@ typedef struct LineartBakeJob {
 
   /* C or ob must have one != NULL. */
   bContext *C;
-  Object *ob;
+  LinkNode *objects;
   Scene *scene;
   Depsgraph *dg;
   int frame;
@@ -141,59 +139,47 @@ typedef struct LineartBakeJob {
   bool overwrite_frames;
 } LineartBakeJob;
 
-static bool lineart_gpencil_bake_single_target(LineartBakeJob *bj, Object *ob)
+static bool lineart_gpencil_bake_single_target(LineartBakeJob *bj, Object *ob, int frame)
 {
   bool touched = false;
-  if (ob->type != OB_GPENCIL) {
+  if (ob->type != OB_GPENCIL || G.is_break) {
     return false;
   }
-  for (int frame = bj->frame_begin; frame <= bj->frame_end; frame += bj->frame_increment) {
-
-    BKE_scene_frame_set(bj->scene, frame);
-    BKE_scene_graph_update_for_newframe(bj->dg);
-
-    if (bj->overwrite_frames) {
-      LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
-        clear_strokes(ob, md, frame);
-      }
-    }
 
+  if (bj->overwrite_frames) {
     LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
-      if (bake_strokes(ob, bj->dg, md, frame)) {
-        touched = true;
-      }
+      clear_strokes(ob, md, frame);
     }
+  }
 
-    if (G.is_break) {
-      return touched;
+  LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
+    if (bake_strokes(ob, bj->dg, md, frame)) {
+      touched = true;
     }
-
-    *bj->progress = (float)(frame - bj->frame_begin) / (bj->frame_end - bj->frame_begin);
   }
+
   return touched;
 }
 
 static void lineart_gpencil_guard_modifiers(LineartBakeJob *bj, bool guard_set, bool hide_modifier)
 {
-  CTX_DATA_BEGIN (bj->C, Object *, ob, visible_objects) {
-    if (ob->type == OB_GPENCIL) {
-      LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
-        if (md->type == eGpencilModifierType_Lineart) {
-          LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
-          if (guard_set) {
-            lmd->flags |= LRT_GPENCIL_IS_BAKING;
-          }
-          else {
-            lmd->flags &= (~LRT_GPENCIL_IS_BAKING);
-          }
-          if (hide_modifier) {
-            md->mode &= ~(eGpencilModifierMode_Realtime | eGpencilModifierMode_Render);
-          }
+  for (LinkNode *l = bj->objects; l; l = l->next) {
+    Object *ob = l->link;
+    LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
+      if (md->type == eGpencilModifierType_Lineart) {
+        LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
+        if (guard_set) {
+          lmd->flags |= LRT_GPENCIL_IS_BAKING;
+        }
+        else {
+          lmd->flags &= (~LRT_GPENCIL_IS_BAKING);
+        }
+        if (hide_modifier) {
+          md->mode &= ~(eGpencilModifierMode_Realtime | eGpencilModifierMode_Render);
         }
       }
     }
   }
-  CTX_DATA_END;
 }
 
 static void lineart_gpencil_bake_startjob(void *customdata,
@@ -208,23 +194,30 @@ static void lineart_gpencil_bake_startjob(void *customdata,
 
   lineart_gpencil_guard_modifiers(bj, true, false);
 
-  if (bj->ob) {
-    /* Which means only bake one line art gpencil object, specified by bj->ob. */
-    if (lineart_gpencil_bake_single_target(bj, bj->ob)) {
-      DEG_id_tag_update((struct ID *)bj->ob->data, ID_RECALC_GEOMETRY);
-      WM_event_add_notifier(bj->C, NC_GPENCIL | ND_DATA | NA_EDITED, bj->ob);
+  for (int frame = bj->frame_begin; frame <= bj->frame_end; frame += bj->frame_increment) {
+
+    if (G.is_break) {
+      G.is_break = false;
+      break;
     }
-  }
-  else {
-    CTX_DATA_BEGIN (bj->C, Object *, ob, visible_objects) {
-      if (lineart_gpencil_bake_single_target(bj, ob)) {
+
+    BKE_scene_frame_set(bj->scene, frame);
+    BKE_scene_graph_update_for_newframe(bj->dg);
+
+    for (LinkNode *l = bj->objects; l; l = l->next) {
+      Object *ob = l->link;
+      if (lineart_gpencil_bake_single_target(bj, ob, frame)) {
         DEG_id_tag_update((struct ID *)ob->data, ID_RECALC_GEOMETRY);
         WM_event_add_notifier(bj->C, NC_GPENCIL | ND_DATA | NA_EDITED, ob);
       }
     }
-    CTX_DATA_END;
+
+    *bj->progress = (float)(frame - bj->frame_begin) / (bj->frame_end - bj->frame_begin);
   }
 
+  /* This need to be reset manually. */
+  G.is_break = false;
+
   /* Restore original frame. */
   BKE_scene_frame_set(bj->scene, bj->frame_orig);
   BKE_scene_graph_update_for_newframe(bj->dg);
@@ -239,7 +232,12 @@ static void lineart_gpencil_bake_endjob(void *customdata)
   WM_set_locked_interface(CTX_wm_manager(bj->C), false);
 
   WM_main_add_notifier(NC_SCENE | ND_FRAME, bj->scene);
-  WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, bj->ob);
+
+  for (LinkNode *l = bj->objects; l; l = l->next) {
+    WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, (Object *)l->link);
+  }
+
+  BLI_linklist_free(bj->objects, NULL);
 }
 
 static int lineart_gpencil_bake_common(bContext *C,
@@ -249,14 +247,28 @@ static int lineart_gpencil_bake_common(bContext *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) {
+    Object *ob = CTX_data_active_object(C);
+    if (!ob || ob->type != OB_GPENCIL) {
       WM_report(RPT_ERROR, "No active object or active object isn't a GPencil object.");
       return OPERATOR_FINISHED;
     }
+    BLI_linklist_prepend(&bj->objects, ob);
+  }
+  else {
+    /* CTX_DATA_BEGIN is not available for interating in objects while using the Job system. */
+    CTX_DATA_BEGIN (C, Object *, ob, visible_objects) {
+      if (ob->type == OB_GPENCIL) {
+        LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
+          if (md->type == eGpencilModifierType_Lineart) {
+            BLI_linklist_prepend(&bj->objects, ob);
+          }
+        }
+      }
+    }
+    CTX_DATA_END;
   }
+  bj->C = C;
   Scene *scene = CTX_data_scene(C);
   bj->scene = scene;
   bj->dg = CTX_data_depsgraph_pointer(C);
@@ -269,7 +281,7 @@ static int lineart_gpencil_bake_common(bContext *C,
   if (do_background) {
     wmJob *wm_job = WM_jobs_get(CTX_wm_manager(C),
                                 CTX_wm_window(C),
-                                CTX_data_scene(C),
+                                scene,
                                 "Line Art",
                                 WM_JOB_PROGRESS,
                                 WM_JOB_TYPE_LINEART);
@@ -291,6 +303,7 @@ static int lineart_gpencil_bake_common(bContext *C,
     float pseduo_progress;
     lineart_gpencil_bake_startjob(bj, NULL, NULL, &pseduo_progress);
 
+    BLI_linklist_free(bj->objects, NULL);
     MEM_freeN(bj);
 
     return OPERATOR_FINISHED;
@@ -333,11 +346,10 @@ static int lineart_gpencil_bake_strokes_commom_modal(bContext *C,
   return OPERATOR_PASS_THROUGH;
 }
 
-static int lineart_gpencil_clear_strokes_exec(bContext *C, wmOperator *op)
+static void lineart_gpencil_clear_strokes_exec_common(Object *ob)
 {
-  Object *ob = CTX_data_active_object(C);
   if (ob->type != OB_GPENCIL) {
-    return OPERATOR_CANCELLED;
+    return;
   }
   LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
     if (md->type != eGpencilModifierType_Lineart) {
@@ -351,39 +363,32 @@ static int lineart_gpencil_clear_strokes_exec(bContext *C, wmOperator *op)
       continue;
     }
     BKE_gpencil_free_frames(gpl);
+
+    md->mode |= eGpencilModifierMode_Realtime | eGpencilModifierMode_Render;
   }
+  DEG_id_tag_update((struct ID *)ob->data, ID_RECALC_GEOMETRY);
+}
 
-  BKE_report(op->reports, RPT_INFO, "Line art cleared for this target.");
+static int lineart_gpencil_clear_strokes_exec(bContext *C, wmOperator *op)
+{
+  Object *ob = CTX_data_active_object(C);
+
+  lineart_gpencil_clear_strokes_exec_common(ob);
 
-  DEG_id_tag_update((struct ID *)ob->data, ID_RECALC_GEOMETRY);
   WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, ob);
+
   return OPERATOR_FINISHED;
 }
 static int lineart_gpencil_clear_strokes_all_exec

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list