Fix: GPv3: Some modifiers not working with non-poly curves

Some modifiers expect the curves to be of type `POLY`.
For such modifiers we need to resample the curves to the
evaluated points so that the modifiers work as expected.

Resolves #129859.

Pull Request: https://projects.blender.org/blender/blender/pulls/129860
This commit is contained in:
YimingWu
2024-11-05 16:35:16 +01:00
committed by YimingWu
parent 551e87c4fd
commit 46b89b2aa4
15 changed files with 34 additions and 1 deletions

View File

@@ -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<GreasePencilArmatureModifierData &>(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,

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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);

View File

@@ -154,7 +154,9 @@ static void deform_drawing(const ModifierData &md,
bke::greasepencil::Drawing &drawing)
{
const auto &mmd = reinterpret_cast<const GreasePencilHookModifierData &>(md);
modifier::greasepencil::ensure_no_bezier_curves(drawing);
bke::CurvesGeometry &curves = drawing.strokes_for_write();
if (curves.points_num() == 0) {
return;
}

View File

@@ -101,6 +101,7 @@ static void modify_curves(ModifierData *md,
Drawing &drawing)
{
const auto *lmd = reinterpret_cast<GreasePencilLatticeModifierData *>(md);
modifier::greasepencil::ensure_no_bezier_curves(drawing);
bke::CurvesGeometry &curves = drawing.strokes_for_write();
IndexMaskMemory mask_memory;

View File

@@ -110,6 +110,7 @@ static void deform_drawing(const ModifierData &md,
{
const GreasePencilLengthModifierData &mmd =
reinterpret_cast<const GreasePencilLengthModifierData &>(md);
modifier::greasepencil::ensure_no_bezier_curves(drawing);
bke::CurvesGeometry &curves = drawing.strokes_for_write();
if (curves.points_num() == 0) {

View File

@@ -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) {

View File

@@ -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;
}

View File

@@ -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<int> points_by_curve = curves.points_by_curve();
const Span<MDeformVert> dverts = curves.deform_verts();

View File

@@ -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()) {

View File

@@ -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;

View File

@@ -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<int> one_cut = VArray<int>::ForSingle(1, subdivided_curves.points_num());

View File

@@ -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<FrameDrawingInfo> 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

View File

@@ -82,4 +82,6 @@ Vector<FrameDrawingInfo> 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