diff options
Diffstat (limited to 'source/blender/blenkernel/intern/gpencil_modifier.c')
-rw-r--r-- | source/blender/blenkernel/intern/gpencil_modifier.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c index 16386cac029..5ac85ad3aaf 100644 --- a/source/blender/blenkernel/intern/gpencil_modifier.c +++ b/source/blender/blenkernel/intern/gpencil_modifier.c @@ -55,6 +55,7 @@ #include "DEG_depsgraph.h" #include "DEG_depsgraph_query.h" +#include "MOD_gpencil_lineart.h" #include "MOD_gpencil_modifiertypes.h" #include "BLO_read_write.h" @@ -202,6 +203,62 @@ bool BKE_gpencil_has_transform_modifiers(Object *ob) return false; } +GpencilLineartLimitInfo BKE_gpencil_get_lineart_modifier_limits(const Object *ob) +{ + GpencilLineartLimitInfo info = {0}; + bool is_first = true; + LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) { + if (md->type == eGpencilModifierType_Lineart) { + LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md; + if (is_first || (lmd->flags & LRT_GPENCIL_USE_CACHE)) { + info.min_level = MIN2(info.min_level, lmd->level_start); + info.max_level = MAX2(info.max_level, + (lmd->use_multiple_levels ? lmd->level_end : lmd->level_start)); + info.edge_types |= lmd->edge_types; + } + } + } + return info; +} + +void BKE_gpencil_set_lineart_modifier_limits(GpencilModifierData *md, + const GpencilLineartLimitInfo *info, + const bool is_first_lineart) +{ + BLI_assert(md->type == eGpencilModifierType_Lineart); + LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md; + if (is_first_lineart || lmd->flags & LRT_GPENCIL_USE_CACHE) { + lmd->level_start_override = info->min_level; + lmd->level_end_override = info->max_level; + lmd->edge_types_override = info->edge_types; + } + else { + lmd->level_start_override = lmd->level_start; + lmd->level_end_override = lmd->level_end; + lmd->edge_types_override = lmd->edge_types; + } +} + +bool BKE_gpencil_is_first_lineart_in_stack(const Object *ob, const GpencilModifierData *md) +{ + if (md->type != eGpencilModifierType_Lineart) { + return false; + } + LISTBASE_FOREACH (GpencilModifierData *, gmd, &ob->greasepencil_modifiers) { + if (gmd->type == eGpencilModifierType_Lineart) { + if (gmd == md) { + return true; + } + else { + return false; + } + } + } + /* If we reach here it means md is not in ob's modifier stack. */ + BLI_assert(false); + return false; +} + /* apply time modifiers */ static int gpencil_time_modifier( Depsgraph *depsgraph, Scene *scene, Object *ob, bGPDlayer *gpl, int cfra, bool is_render) @@ -771,6 +828,8 @@ void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob) BKE_gpencil_lattice_init(ob); const bool time_remap = BKE_gpencil_has_time_modifiers(ob); + bool is_first_lineart = true; + GpencilLineartLimitInfo info = BKE_gpencil_get_lineart_modifier_limits(ob); LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) { @@ -781,6 +840,11 @@ void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob) continue; } + if (md->type == eGpencilModifierType_Lineart) { + BKE_gpencil_set_lineart_modifier_limits(md, &info, is_first_lineart); + is_first_lineart = false; + } + /* Apply geometry modifiers (add new geometry). */ if (mti && mti->generateStrokes) { mti->generateStrokes(md, depsgraph, ob); @@ -806,6 +870,8 @@ void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob) /* Clear any lattice data. */ BKE_gpencil_lattice_clear(ob); + + MOD_lineart_clear_cache(&gpd->runtime.lineart_cache); } void BKE_gpencil_modifier_blend_write(BlendWriter *writer, ListBase *modbase) |