Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Goudey <h.goudey@me.com>2021-06-22 19:35:00 +0300
committerHans Goudey <h.goudey@me.com>2021-06-22 19:35:00 +0300
commit0b15353baa5c7c5b57ccb5dff8ef0fdf0d8beb5d (patch)
tree416b869f766b15974dd4ef2ca0ca2f86e2a6c283
parentf3eecfe386098cf0a18df7ff4d8ffda9a43e9495 (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.
-rw-r--r--source/blender/blenkernel/intern/geometry_set_instances.cc26
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)