[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