[Bf-blender-cvs] [9870984c79e] lineart-fn-cached: LineArt: Fix stroke baking crash.

YimingWu noreply at git.blender.org
Tue Jun 15 14:09:23 CEST 2021


Commit: 9870984c79e1aa4309363bee376ce8e4ec66a0ca
Author: YimingWu
Date:   Tue Jun 15 00:16:46 2021 +0800
Branches: lineart-fn-cached
https://developer.blender.org/rB9870984c79e1aa4309363bee376ce8e4ec66a0ca

LineArt: Fix stroke baking crash.

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

M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.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/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index 7d3c75a051d..f45dea0b90b 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -2775,13 +2775,13 @@ static void lineart_destroy_render_data(LineartRenderBuffer *rb)
 
 void MOD_lineart_destroy_render_data(LineartGpencilModifierData *lmd)
 {
-  LineartRenderBuffer *rb = lmd->render_buffer_onetime;
+  LineartRenderBuffer *rb = lmd->render_buffer_ptr;
 
   lineart_destroy_render_data(rb);
 
   if (rb) {
     MEM_freeN(rb);
-    lmd->render_buffer_onetime = NULL;
+    lmd->render_buffer_ptr = NULL;
   }
 
   if (G.debug_value == 4000) {
@@ -2812,7 +2812,7 @@ static LineartRenderBuffer *lineart_create_render_buffer(Scene *scene,
   LineartRenderBuffer *rb = MEM_callocN(sizeof(LineartRenderBuffer), "Line Art render buffer");
 
   lmd->cache = lc;
-  lmd->render_buffer_onetime = rb;
+  lmd->render_buffer_ptr = rb;
   lc->rb_edge_types = LRT_EDGE_FLAG_ALL_TYPE;
 
   if (!scene || !scene->camera || !lc) {
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
index 02a52c40bc0..18ca7fe66be 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
@@ -88,8 +88,12 @@ static void clear_strokes(Object *ob, GpencilModifierData *md, int frame)
   BKE_gpencil_layer_frame_delete(gpl, gpf);
 }
 
-static bool bake_strokes(
-    Object *ob, Depsgraph *dg, LineartCache **lc, GpencilModifierData *md, int frame)
+static bool bake_strokes(Object *ob,
+                         Depsgraph *dg,
+                         LineartCache **lc,
+                         GpencilModifierData *md,
+                         int frame,
+                         bool is_first)
 {
   /* Modifier data sanity check. */
   if (lineart_mod_is_disabled(md)) {
@@ -118,7 +122,7 @@ static bool bake_strokes(
     MOD_lineart_destroy_render_data(lmd);
   }
   else {
-    if (!(lmd->flags & LRT_GPENCIL_USE_CACHE)) {
+    if (is_first || (!(lmd->flags & LRT_GPENCIL_USE_CACHE))) {
       MOD_lineart_compute_feature_lines(dg, lmd, &local_lc);
       MOD_lineart_destroy_render_data(lmd);
     }
@@ -149,9 +153,11 @@ static bool bake_strokes(
 
   if (!(lmd->flags & LRT_GPENCIL_USE_CACHE)) {
     /* Clear local cache. */
-    MOD_lineart_clear_cache(&local_lc);
-    /* Restore the original cache pointer so the modifiers below still have access to the "global"
-     * cache. */
+    if (!is_first) {
+      MOD_lineart_clear_cache(&local_lc);
+    }
+    /* Restore the original cache pointer so the modifiers below still have access to the
+     * "global" cache. */
     lmd->cache = gpd->runtime.lineart_cache;
   }
 
@@ -195,14 +201,16 @@ static bool lineart_gpencil_bake_single_target(LineartBakeJob *bj, Object *ob, i
   GpencilLineartLimitInfo info = {0};
   BKE_gpencil_get_lineart_modifier_limits(ob, &info);
 
-  LineartCache *lc;
+  LineartCache *lc = NULL;
+  bool is_first = true;
   LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
     if (md->type != eGpencilModifierType_Lineart) {
       continue;
     }
     BKE_gpencil_set_lineart_modifier_limits(md, &info);
-    if (bake_strokes(ob, bj->dg, &lc, md, frame)) {
+    if (bake_strokes(ob, bj->dg, &lc, md, frame, is_first)) {
       touched = true;
+      is_first = false;
     }
   }
   MOD_lineart_clear_cache(&lc);
diff --git a/source/blender/makesdna/DNA_gpencil_modifier_types.h b/source/blender/makesdna/DNA_gpencil_modifier_types.h
index f38e30a17d1..3977ad326da 100644
--- a/source/blender/makesdna/DNA_gpencil_modifier_types.h
+++ b/source/blender/makesdna/DNA_gpencil_modifier_types.h
@@ -945,7 +945,7 @@ typedef struct LineartGpencilModifierData {
 
   struct LineartCache *cache;
   /* Keep a pointer to the render buffer so we can call destroy from ModifierData. */
-  struct LineartRenderBuffer *render_buffer_onetime;
+  struct LineartRenderBuffer *render_buffer_ptr;
 
 } LineartGpencilModifierData;



More information about the Bf-blender-cvs mailing list