diff options
author | Hans Goudey <h.goudey@me.com> | 2021-06-22 19:35:00 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2021-06-22 19:35:00 +0300 |
commit | 0b15353baa5c7c5b57ccb5dff8ef0fdf0d8beb5d (patch) | |
tree | 416b869f766b15974dd4ef2ca0ca2f86e2a6c283 /source/blender/blenkernel | |
parent | f3eecfe386098cf0a18df7ff4d8ffda9a43e9495 (diff) |
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.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/intern/geometry_set_instances.cc | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/source/blender/blenkernel/intern/geometry_set_instances.cc b/source/blender/blenkernel/intern/geometry_set_instances.cc index 791a8d219df..0aea57d1a45 100644 --- a/source/blender/blenkernel/intern/geometry_set_instances.cc +++ b/source/blender/blenkernel/intern/geometry_set_instances.cc @@ -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) |