Geometry Nodes: Join curve attributes when realizing instances

Previously the code assumed that curve instances had no attributes.
This is true when the data came from curve objects, which don't support
attributes currently, but it isn't necessarily true when retrieving curves
from evaluated geometry sets.
This commit is contained in:
Hans Goudey 2021-06-22 11:35:00 -05:00
parent f3eecfe386
commit 0b15353baa
Notes: blender-bot 2023-02-14 06:37:09 +01:00
Referenced by issue #89344, Join curve attributes when realizing instances
1 changed files with 14 additions and 12 deletions

View File

@ -550,7 +550,7 @@ static void join_attributes(Span<GeometryInstanceGroup> set_groups,
}
}
static CurveEval *join_curve_splines(Span<GeometryInstanceGroup> set_groups)
static CurveEval *join_curve_splines_and_builtin_attributes(Span<GeometryInstanceGroup> set_groups)
{
Vector<SplinePtr> new_splines;
for (const GeometryInstanceGroup &set_group : set_groups) {
@ -562,7 +562,7 @@ static CurveEval *join_curve_splines(Span<GeometryInstanceGroup> set_groups)
const CurveEval &source_curve = *set.get_curve_for_read();
for (const SplinePtr &source_spline : source_curve.splines()) {
for (const float4x4 &transform : set_group.transforms) {
SplinePtr new_spline = source_spline->copy();
SplinePtr new_spline = source_spline->copy_without_attributes();
new_spline->transform(transform);
new_splines.append(std::move(new_spline));
}
@ -577,15 +577,6 @@ static CurveEval *join_curve_splines(Span<GeometryInstanceGroup> set_groups)
new_curve->add_spline(std::move(new_spline));
}
for (SplinePtr &spline : new_curve->splines()) {
/* Spline instances should have no custom attributes, since they always come
* from original objects which currently do not support custom attributes.
*
* This is only true as long as a #GeometrySet cannot be instanced directly. */
BLI_assert(spline->attributes.data.totlayer == 0);
UNUSED_VARS_NDEBUG(spline);
}
new_curve->attributes.reallocate(new_curve->splines().size());
return new_curve;
}
@ -664,12 +655,23 @@ static void join_instance_groups_volume(Span<GeometryInstanceGroup> set_groups,
static void join_instance_groups_curve(Span<GeometryInstanceGroup> set_groups, GeometrySet &result)
{
CurveEval *curve = join_curve_splines(set_groups);
CurveEval *curve = join_curve_splines_and_builtin_attributes(set_groups);
if (curve == nullptr) {
return;
}
CurveComponent &dst_component = result.get_component_for_write<CurveComponent>();
dst_component.replace(curve);
Map<std::string, AttributeKind> attributes;
geometry_set_gather_instances_attribute_info(
set_groups,
{GEO_COMPONENT_TYPE_CURVE},
{"position", "radius", "tilt", "cyclic", "resolution"},
attributes);
join_attributes(set_groups,
{GEO_COMPONENT_TYPE_CURVE},
attributes,
static_cast<GeometryComponent &>(dst_component));
}
GeometrySet geometry_set_realize_mesh_for_modifier(const GeometrySet &geometry_set)