[Bf-blender-cvs] [0b15353baa5] master: Geometry Nodes: Join curve attributes when realizing instances

Hans Goudey noreply at git.blender.org
Tue Jun 22 18:35:08 CEST 2021


Commit: 0b15353baa5c7c5b57ccb5dff8ef0fdf0d8beb5d
Author: Hans Goudey
Date:   Tue Jun 22 11:35:00 2021 -0500
Branches: master
https://developer.blender.org/rB0b15353baa5c7c5b57ccb5dff8ef0fdf0d8beb5d

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.

===================================================================

M	source/blender/blenkernel/intern/geometry_set_instances.cc

===================================================================

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)



More information about the Bf-blender-cvs mailing list