diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc b/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc index b8d3855fe2e..0dffa1510c6 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc @@ -107,6 +107,7 @@ static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphCont static void modify_curves(ModifierData &md, const ModifierEvalContext &ctx, Drawing &drawing) { auto &amd = reinterpret_cast(md); + modifier::greasepencil::ensure_no_bezier_curves(drawing); bke::CurvesGeometry &curves = drawing.strokes_for_write(); /* The influence flag is where the "invert" flag is stored, diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_build.cc b/source/blender/modifiers/intern/MOD_grease_pencil_build.cc index 29202623444..ce8bf853ac6 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_build.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_build.cc @@ -550,6 +550,7 @@ static void build_drawing(const GreasePencilBuildModifierData &mmd, const int current_time, const float scene_fps) { + modifier::greasepencil::ensure_no_bezier_curves(drawing); bke::CurvesGeometry &curves = drawing.strokes_for_write(); if (curves.points_num() == 0) { diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc b/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc index 10cbd2aa007..0d6b61d8a4f 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc @@ -328,6 +328,7 @@ static void modify_drawing(const GreasePencilDashModifierData &dmd, const PatternInfo &pattern_info, bke::greasepencil::Drawing &drawing) { + modifier::greasepencil::ensure_no_bezier_curves(drawing); const bke::CurvesGeometry &src_curves = drawing.strokes(); if (src_curves.curve_num == 0) { return; diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc b/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc index a3999aded04..62a48bceb8f 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc @@ -630,6 +630,8 @@ static void modify_drawing(const GreasePencilEnvelopeModifierData &emd, { const EnvelopeInfo info = get_envelope_info(emd, ctx); + modifier::greasepencil::ensure_no_bezier_curves(drawing); + IndexMaskMemory mask_memory; const IndexMask curves_mask = modifier::greasepencil::get_filtered_stroke_mask( ctx.object, drawing.strokes(), emd.influence, mask_memory); diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc b/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc index 0bd55772275..ebcdb674924 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc @@ -154,7 +154,9 @@ static void deform_drawing(const ModifierData &md, bke::greasepencil::Drawing &drawing) { const auto &mmd = reinterpret_cast(md); + modifier::greasepencil::ensure_no_bezier_curves(drawing); bke::CurvesGeometry &curves = drawing.strokes_for_write(); + if (curves.points_num() == 0) { return; } diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc b/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc index 70f708759fd..62fb26bb92c 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc @@ -101,6 +101,7 @@ static void modify_curves(ModifierData *md, Drawing &drawing) { const auto *lmd = reinterpret_cast(md); + modifier::greasepencil::ensure_no_bezier_curves(drawing); bke::CurvesGeometry &curves = drawing.strokes_for_write(); IndexMaskMemory mask_memory; diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_length.cc b/source/blender/modifiers/intern/MOD_grease_pencil_length.cc index c7c460463ea..4c4e458fcdf 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_length.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_length.cc @@ -110,6 +110,7 @@ static void deform_drawing(const ModifierData &md, { const GreasePencilLengthModifierData &mmd = reinterpret_cast(md); + modifier::greasepencil::ensure_no_bezier_curves(drawing); bke::CurvesGeometry &curves = drawing.strokes_for_write(); if (curves.points_num() == 0) { diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc b/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc index 4ebe2c369ba..845b2f43ead 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc @@ -98,6 +98,7 @@ static void deform_drawing(const GreasePencilNoiseModifierData &mmd, const int start_frame_number, bke::greasepencil::Drawing &drawing) { + modifier::greasepencil::ensure_no_bezier_curves(drawing); bke::CurvesGeometry &strokes = drawing.strokes_for_write(); bke::MutableAttributeAccessor attributes = strokes.attributes_for_write(); if (strokes.points_num() == 0) { diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc b/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc index 06d11cf91ac..0c257032915 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc @@ -178,6 +178,8 @@ static void modify_drawing(const GreasePencilOutlineModifierData &omd, bke::greasepencil::Drawing &drawing, const float4x4 &viewmat) { + modifier::greasepencil::ensure_no_bezier_curves(drawing); + if (drawing.strokes().curve_num == 0) { return; } diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc b/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc index fed519849ef..0176e499ddc 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc @@ -141,6 +141,7 @@ static void modify_drawing(const GreasePencilShrinkwrapModifierData &smd, const ModifierEvalContext &ctx, bke::greasepencil::Drawing &drawing) { + modifier::greasepencil::ensure_no_bezier_curves(drawing); bke::CurvesGeometry &curves = drawing.strokes_for_write(); const OffsetIndices points_by_curve = curves.points_by_curve(); const Span dverts = curves.deform_verts(); diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_simplify.cc b/source/blender/modifiers/intern/MOD_grease_pencil_simplify.cc index 4b62d88f523..6d1af43d5d4 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_simplify.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_simplify.cc @@ -100,8 +100,10 @@ static void simplify_drawing(const GreasePencilSimplifyModifierData &mmd, const Object &ob, bke::greasepencil::Drawing &drawing) { - IndexMaskMemory memory; + modifier::greasepencil::ensure_no_bezier_curves(drawing); const bke::CurvesGeometry &curves = drawing.strokes(); + + IndexMaskMemory memory; const IndexMask strokes = modifier::greasepencil::get_filtered_stroke_mask( &ob, curves, mmd.influence, memory); if (strokes.is_empty()) { diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc b/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc index f8514329be0..28672ce80cb 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc @@ -109,6 +109,7 @@ static void deform_drawing(const ModifierData &md, return; } + modifier::greasepencil::ensure_no_bezier_curves(drawing); bke::CurvesGeometry &curves = drawing.strokes_for_write(); if (curves.points_num() == 0) { return; diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc b/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc index 96b5c097249..6de91360cb3 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc @@ -86,6 +86,7 @@ static void subdivide_drawing(ModifierData &md, Object &ob, bke::greasepencil::D &ob, drawing.strokes_for_write(), mmd.influence, memory); if (use_catmull_clark) { + modifier::greasepencil::ensure_no_bezier_curves(drawing); bke::CurvesGeometry subdivided_curves = drawing.strokes(); for ([[maybe_unused]] const int level_i : IndexRange(mmd.level)) { VArray one_cut = VArray::ForSingle(1, subdivided_curves.points_num()); diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_util.cc b/source/blender/modifiers/intern/MOD_grease_pencil_util.cc index c3253175d59..6a86ac04c48 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_util.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_util.cc @@ -31,6 +31,8 @@ #include "UI_interface.hh" +#include "GEO_resample_curves.hh" + namespace blender::modifier::greasepencil { using bke::greasepencil::Drawing; @@ -383,4 +385,16 @@ Vector get_drawing_infos_by_frame(GreasePencil &grease_pencil, return drawing_infos; } +void ensure_no_bezier_curves(Drawing &drawing) +{ + const bke::CurvesGeometry &curves = drawing.strokes(); + IndexMaskMemory memory; + const IndexMask bezier_selection = curves.indices_for_curve_type(CURVE_TYPE_BEZIER, memory); + if (bezier_selection.is_empty()) { + return; + } + drawing.strokes_for_write() = geometry::resample_to_evaluated(curves, bezier_selection); + drawing.tag_topology_changed(); +} + } // namespace blender::modifier::greasepencil diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_util.hh b/source/blender/modifiers/intern/MOD_grease_pencil_util.hh index 4b374f85b4a..aa729da428c 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_util.hh +++ b/source/blender/modifiers/intern/MOD_grease_pencil_util.hh @@ -82,4 +82,6 @@ Vector get_drawing_infos_by_frame(GreasePencil &grease_pencil, const IndexMask &layer_mask, int frame); +void ensure_no_bezier_curves(bke::greasepencil::Drawing &drawing); + } // namespace blender::modifier::greasepencil