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:
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user