[Bf-blender-cvs] [84c653fb766] temp-lineart-contained: LineArt: Guard modifiers from depsgraph when baking.

YimingWu noreply at git.blender.org
Fri Mar 12 02:47:08 CET 2021


Commit: 84c653fb76633bf8aea9177bbeea90c7dd7891fb
Author: YimingWu
Date:   Fri Mar 12 09:46:55 2021 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rB84c653fb76633bf8aea9177bbeea90c7dd7891fb

LineArt: Guard modifiers from depsgraph when baking.

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

M	source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
M	source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
M	source/blender/makesdna/DNA_gpencil_modifier_types.h

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

diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
index 7d42e2526b8..30c14631614 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
@@ -129,6 +129,11 @@ static bool isModifierDisabled(GpencilModifierData *md)
     return true;
   }
 
+  /* Preventing calculation in depsgraph when baking frames. */
+  if (lmd->flags & LRT_GPENCIL_IS_BAKING) {
+    return false;
+  }
+
   return false;
 }
 static void generateStrokes(GpencilModifierData *md, Depsgraph *depsgraph, Object *ob)
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
index 25780387b34..12318743284 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
@@ -119,8 +119,6 @@ static bool bake_strokes(Object *ob, Depsgraph *dg, GpencilModifierData *md, int
 
   ED_lineart_destroy_render_data(lmd);
 
-  md->mode &= ~(eGpencilModifierMode_Realtime | eGpencilModifierMode_Render);
-
   return true;
 }
 
@@ -175,6 +173,29 @@ static bool lineart_gpencil_bake_single_target(LineartBakeJob *bj, Object *ob)
   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);
+          }
+        }
+      }
+    }
+  }
+  CTX_DATA_END;
+}
+
 static void lineart_gpencil_bake_startjob(void *customdata,
                                           short *stop,
                                           short *do_update,
@@ -185,6 +206,8 @@ static void lineart_gpencil_bake_startjob(void *customdata,
   bj->do_update = do_update;
   bj->progress = progress;
 
+  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)) {
@@ -205,6 +228,8 @@ static void lineart_gpencil_bake_startjob(void *customdata,
   /* Restore original frame. */
   BKE_scene_frame_set(bj->scene, bj->frame_orig);
   BKE_scene_graph_update_for_newframe(bj->dg);
+
+  lineart_gpencil_guard_modifiers(bj, false, true);
 }
 
 static void lineart_gpencil_bake_endjob(void *customdata)
diff --git a/source/blender/makesdna/DNA_gpencil_modifier_types.h b/source/blender/makesdna/DNA_gpencil_modifier_types.h
index d068374b28f..3d0526aafec 100644
--- a/source/blender/makesdna/DNA_gpencil_modifier_types.h
+++ b/source/blender/makesdna/DNA_gpencil_modifier_types.h
@@ -820,6 +820,7 @@ typedef enum eLineArtGPencilModifierFlags {
   LRT_GPENCIL_INVERT_SOURCE_VGROUP = (1 << 0),
   LRT_GPENCIL_MATCH_OUTPUT_VGROUP = (1 << 1),
   LRT_GPENCIL_SOFT_SELECTION = (1 << 2),
+  LRT_GPENCIL_IS_BAKING = (1 << 3),
 } eLineArtGPencilModifierFlags;
 
 typedef enum eLineartGpencilTransparencyFlags {



More information about the Bf-blender-cvs mailing list