diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc b/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc index cb527ebb332..ec6b1a07389 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc @@ -134,8 +134,8 @@ static void modify_stroke_random(const Object &ob, bke::SpanAttributeWriter radii = attributes.lookup_or_add_for_write_span( "radius", bke::AttrDomain::Point); const MutableSpan positions = curves.positions_for_write(); - const VArray vgroup_weights = *attributes.lookup_or_default( - omd.influence.vertex_group_name, bke::AttrDomain::Point, 1.0f); + const VArray vgroup_weights = modifier::greasepencil::get_influence_vertex_weights( + curves, omd.influence); /* Make sure different modifiers get different seeds. */ const int seed = omd.seed + BLI_hash_string(ob.id.name + 2) + BLI_hash_string(omd.modifier.name); @@ -204,8 +204,8 @@ static void modify_stroke_by_index(const GreasePencilOffsetModifierData &omd, bke::SpanAttributeWriter radii = attributes.lookup_or_add_for_write_span( "radius", bke::AttrDomain::Point); const MutableSpan positions = curves.positions_for_write(); - const VArray vgroup_weights = *attributes.lookup_or_default( - omd.influence.vertex_group_name, bke::AttrDomain::Point, 1.0f); + const VArray vgroup_weights = modifier::greasepencil::get_influence_vertex_weights( + curves, omd.influence); curves_mask.foreach_index(GrainSize(512), [&](const int64_t curve_i) { const IndexRange points = points_by_curve[curve_i]; @@ -237,8 +237,8 @@ static void modify_stroke_by_material(const Object &ob, bke::SpanAttributeWriter radii = attributes.lookup_or_add_for_write_span( "radius", bke::AttrDomain::Point); const MutableSpan positions = curves.positions_for_write(); - const VArray vgroup_weights = *attributes.lookup_or_default( - omd.influence.vertex_group_name, bke::AttrDomain::Point, 1.0f); + const VArray vgroup_weights = modifier::greasepencil::get_influence_vertex_weights( + curves, omd.influence); const VArray stroke_materials = *attributes.lookup_or_default( "material_index", bke::AttrDomain::Curve, 0); @@ -270,8 +270,8 @@ static void modify_stroke_by_layer(const GreasePencilOffsetModifierData &omd, bke::SpanAttributeWriter radii = attributes.lookup_or_add_for_write_span( "radius", bke::AttrDomain::Point); const MutableSpan positions = curves.positions_for_write(); - const VArray vgroup_weights = *attributes.lookup_or_default( - omd.influence.vertex_group_name, bke::AttrDomain::Point, 1.0f); + const VArray vgroup_weights = modifier::greasepencil::get_influence_vertex_weights( + curves, omd.influence); const float factor = get_factor_from_index(omd, layers_num, layer_index); diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc b/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc index 8f2a6f9cfad..a7f88350545 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc @@ -87,10 +87,8 @@ static void modify_stroke_color(const GreasePencilOpacityModifierData &omd, bke::MutableAttributeAccessor attributes = curves.attributes_for_write(); bke::SpanAttributeWriter opacities = attributes.lookup_or_add_for_write_span( "opacity", bke::AttrDomain::Point); - const VArray vgroup_weights = - attributes - .lookup_or_default(omd.influence.vertex_group_name, bke::AttrDomain::Point, 1.0f) - .varray; + const VArray vgroup_weights = modifier::greasepencil::get_influence_vertex_weights( + curves, omd.influence); curves_mask.foreach_index(GrainSize(512), [&](const int64_t curve_i) { const IndexRange points = points_by_curve[curve_i]; @@ -138,9 +136,8 @@ static void modify_fill_color(const GreasePencilOpacityModifierData &omd, /* Fill color opacity per stroke. */ bke::SpanAttributeWriter fill_opacities = attributes.lookup_or_add_for_write_span( "fill_opacity", bke::AttrDomain::Curve); - const StringRef vgroup_name = omd.influence.vertex_group_name; - const VArray vgroup_weights = - attributes.lookup_or_default(vgroup_name, bke::AttrDomain::Point, 1.0f).varray; + const VArray vgroup_weights = modifier::greasepencil::get_influence_vertex_weights( + curves, omd.influence); curves_mask.foreach_index(GrainSize(512), [&](int64_t curve_i) { if (use_vgroup_opacity) { diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc b/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc index 26cb231ed83..d1fae9038f2 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc @@ -174,8 +174,8 @@ static void modify_stroke_color(Object &ob, bke::AttributeAccessor attributes = curves.attributes(); const VArray stroke_materials = *attributes.lookup_or_default( "material_index", bke::AttrDomain::Curve, 0); - const VArray vgroup_weights = *attributes.lookup_or_default( - tmd.influence.vertex_group_name, bke::AttrDomain::Point, 1.0f); + const VArray vgroup_weights = modifier::greasepencil::get_influence_vertex_weights( + curves, tmd.influence); /* Common input color and base factor calculation. */ auto get_material_color = [&](const int64_t curve_i) { @@ -261,8 +261,8 @@ static void modify_fill_color(Object &ob, bke::AttrDomain::Curve); const VArray stroke_materials = *attributes.lookup_or_default( "material_index", bke::AttrDomain::Curve, 0); - const VArray vgroup_weights = *attributes.lookup_or_default( - tmd.influence.vertex_group_name, bke::AttrDomain::Point, 1.0f); + const VArray vgroup_weights = modifier::greasepencil::get_influence_vertex_weights( + curves, tmd.influence); /* Common input color and base factor calculation. */ auto get_material_color = [&](const int64_t curve_i) { diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_util.cc b/source/blender/modifiers/intern/MOD_grease_pencil_util.cc index ac1222c13a8..337e492a628 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_util.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_util.cc @@ -309,6 +309,18 @@ IndexMask get_filtered_stroke_mask(const Object *ob, memory); } +VArray get_influence_vertex_weights(const bke::CurvesGeometry &curves, + const GreasePencilModifierInfluenceData &influence_data) +{ + if (influence_data.vertex_group_name[0] == '\0') { + /* If vertex group is not set, use full weight for all vertices. */ + return VArray::ForSingle(1.0f, curves.point_num); + } + /* Vertex group weights, with zero weight as fallback. */ + return *curves.attributes().lookup_or_default( + influence_data.vertex_group_name, bke::AttrDomain::Point, 0.0f); +} + Vector get_drawings_for_write(GreasePencil &grease_pencil, const IndexMask &layer_mask, const int frame) diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_util.hh b/source/blender/modifiers/intern/MOD_grease_pencil_util.hh index df2578516b7..c1d93f1bf00 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_util.hh +++ b/source/blender/modifiers/intern/MOD_grease_pencil_util.hh @@ -59,6 +59,9 @@ IndexMask get_filtered_stroke_mask(const Object *ob, const GreasePencilModifierInfluenceData &influence_data, IndexMaskMemory &memory); +VArray get_influence_vertex_weights( + const bke::CurvesGeometry &curves, const GreasePencilModifierInfluenceData &influence_data); + Vector get_drawings_for_write(GreasePencil &grease_pencil, const IndexMask &layer_mask, int frame);