[Bf-blender-cvs] [8f3d40820e3] temp-lineart-contained: LineArt: Fix cache nullptr bug.

YimingWu noreply at git.blender.org
Wed Apr 21 13:24:15 CEST 2021


Commit: 8f3d40820e3272cb29362f4608f0606786c4e88a
Author: YimingWu
Date:   Wed Apr 21 19:23:58 2021 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rB8f3d40820e3272cb29362f4608f0606786c4e88a

LineArt: Fix cache nullptr bug.

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

M	source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
M	source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
M	source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
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/MOD_gpencillineart.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
index 5242f3575bd..203f56b11e7 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
@@ -160,6 +160,10 @@ static void generateStrokes(GpencilModifierData *md, Depsgraph *depsgraph, Objec
     MOD_lineart_compute_feature_lines(depsgraph, lmd, &gpd->runtime.lineart_cache);
     MOD_lineart_destroy_render_data(lmd);
   }
+  else {
+    MOD_lineart_chain_clear_picked_flag(gpd->runtime.lineart_cache);
+    lmd->cache = gpd->runtime.lineart_cache;
+  }
 
   generate_strokes_actual(md, depsgraph, ob, gpl, gpf);
 
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index 53dd2033f4a..b2bd22c98ec 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -602,7 +602,7 @@ void MOD_lineart_chain_discard_short(LineartRenderBuffer *rb, const float thresh
 void MOD_lineart_chain_split_angle(LineartRenderBuffer *rb, float angle_threshold_rad);
 
 int MOD_lineart_chain_count(const LineartLineChain *rlc);
-void MOD_lineart_chain_clear_picked_flag(struct LineartRenderBuffer *rb);
+void MOD_lineart_chain_clear_picked_flag(LineartCache *lc);
 
 bool MOD_lineart_compute_feature_lines(struct Depsgraph *depsgraph,
                                        struct LineartGpencilModifierData *lmd,
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
index bee002f8217..afec963f8e9 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
@@ -889,12 +889,12 @@ int MOD_lineart_chain_count(const LineartLineChain *rlc)
   return count;
 }
 
-void MOD_lineart_chain_clear_picked_flag(LineartRenderBuffer *rb)
+void MOD_lineart_chain_clear_picked_flag(LineartCache *lc)
 {
-  if (rb == NULL) {
+  if (lc == NULL) {
     return;
   }
-  LISTBASE_FOREACH (LineartLineChain *, rlc, &rb->chains) {
+  LISTBASE_FOREACH (LineartLineChain *, rlc, &lc->chains) {
     rlc->picked = 0;
   }
 }
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index ce0264b682d..ee21dede4c1 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -3961,13 +3961,8 @@ bool MOD_lineart_compute_feature_lines(Depsgraph *depsgraph,
 
     /* Then we connect chains based on the _proximity_ of their end points in image space, here's
      * the place threshold value gets involved. */
-
-    /* do_geometry_space = true. */
     MOD_lineart_chain_connect(rb);
 
-    /* After chaining, we need to clear flags so we don't confuse GPencil generation calls. */
-    MOD_lineart_chain_clear_picked_flag(rb);
-
     float *t_image = &lmd->chaining_image_threshold;
     /* This configuration ensures there won't be accidental lost of short unchained segments. */
     MOD_lineart_chain_discard_short(rb, MIN2(*t_image, 0.001f) - FLT_EPSILON);
@@ -3978,6 +3973,9 @@ bool MOD_lineart_compute_feature_lines(Depsgraph *depsgraph,
 
     /* Finally transfer the result list into cache. */
     memcpy(&lc->chains, &rb->chains, sizeof(ListBase));
+
+    /* At last, we need to clear flags so we don't confuse GPencil generation calls. */
+    MOD_lineart_chain_clear_picked_flag(lc);
   }
 
   if (G.debug_value == 4000) {
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
index 38ec422595b..ce0001fe4d2 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
@@ -116,6 +116,10 @@ static bool bake_strokes(
     MOD_lineart_compute_feature_lines(dg, lmd, lc);
     MOD_lineart_destroy_render_data(lmd);
   }
+  else {
+    MOD_lineart_chain_clear_picked_flag(gpd->runtime.lineart_cache);
+    lmd->cache = gpd->runtime.lineart_cache;
+  }
 
   MOD_lineart_gpencil_generate(
       lmd->cache,



More information about the Bf-blender-cvs mailing list