diff options
author | Sebastian Parborg <darkdefende@gmail.com> | 2021-03-19 22:56:18 +0300 |
---|---|---|
committer | Sebastian Parborg <darkdefende@gmail.com> | 2021-03-19 23:02:21 +0300 |
commit | fb3e5b7f986e7215c6488c2b93db8559e84cfb98 (patch) | |
tree | 8e0a9f47fe5e448fd74f36b5ba563d067718592f /source/blender/gpencil_modifiers | |
parent | 17a5db7303df52c319ea34cecea25442932cfe03 (diff) |
LineArt: Add missing modifer and sanity checks to bake operator
Previously we could crash because we would not check if the modifier in
question actually was a line art modifier. We also did not query if the
modifier was disabled.
Diffstat (limited to 'source/blender/gpencil_modifiers')
-rw-r--r-- | source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c index 1745551d6af..bd995a5940a 100644 --- a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c +++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c @@ -29,6 +29,7 @@ #include "BKE_context.h" #include "BKE_global.h" #include "BKE_gpencil.h" +#include "BKE_gpencil_modifier.h" #include "BKE_report.h" #include "BKE_scene.h" @@ -50,6 +51,24 @@ #include "lineart_intern.h" +static bool lineart_mod_is_disabled(GpencilModifierData *md) +{ + BLI_assert(md->type == eGpencilModifierType_Lineart); + + const GpencilModifierTypeInfo *info = BKE_gpencil_modifier_get_info(md->type); + + LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md; + + /* Toggle on and off the baked flag as we are only interested in if something else is disabling + * it. We can assume that the guard function has already toggled this on for all modifiers that + * are sent here. */ + lmd->flags &= (~LRT_GPENCIL_IS_BAKED); + bool disabled = info->isDisabled(md, 0); + lmd->flags |= LRT_GPENCIL_IS_BAKED; + + return disabled; +} + static void clear_strokes(Object *ob, GpencilModifierData *md, int frame) { if (md->type != eGpencilModifierType_Lineart) { @@ -74,6 +93,11 @@ static void clear_strokes(Object *ob, GpencilModifierData *md, int frame) static bool bake_strokes(Object *ob, Depsgraph *dg, GpencilModifierData *md, int frame) { + /* Modifier data sanity check. */ + if (lineart_mod_is_disabled(md)) { + return false; + } + LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md; bGPdata *gpd = ob->data; @@ -148,11 +172,16 @@ static bool lineart_gpencil_bake_single_target(LineartBakeJob *bj, Object *ob, i if (bj->overwrite_frames) { LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) { - clear_strokes(ob, md, frame); + if (md->type == eGpencilModifierType_Lineart) { + clear_strokes(ob, md, frame); + } } } LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) { + if (md->type != eGpencilModifierType_Lineart) { + continue; + } if (bake_strokes(ob, bj->dg, md, frame)) { touched = true; } @@ -254,6 +283,7 @@ static int lineart_gpencil_bake_common(bContext *C, LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) { if (md->type == eGpencilModifierType_Lineart) { BLI_linklist_prepend(&bj->objects, ob); + break; } } } |