[Bf-blender-cvs] [d7d853193e7] temp-geometry-nodes-instances-api-v2: Support collection instances, completely break transforms

Hans Goudey noreply at git.blender.org
Sun Feb 7 07:14:19 CET 2021


Commit: d7d853193e71ca47deb265e493d5b54dcbbd233f
Author: Hans Goudey
Date:   Sun Feb 7 00:14:13 2021 -0600
Branches: temp-geometry-nodes-instances-api-v2
https://developer.blender.org/rBd7d853193e71ca47deb265e493d5b54dcbbd233f

Support collection instances, completely break transforms

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

M	source/blender/blenkernel/intern/geometry_set.cc
M	source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc

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

diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc
index 9ebf8067983..06c25049682 100644
--- a/source/blender/blenkernel/intern/geometry_set.cc
+++ b/source/blender/blenkernel/intern/geometry_set.cc
@@ -597,6 +597,7 @@ static GeometrySet object_get_geometry_set_for_read(const Object &object)
       mesh_component.copy_vertex_group_names_from_object(object);
     }
   }
+
   /* TODO: Cover the case of pointclouds without modifiers,
    * they may not be covered by the #geometry_set_eval case above. */
   /* TODO: Add volume support. */
@@ -611,31 +612,47 @@ static GeometrySet object_get_geometry_set_for_read(const Object &object)
 /** \name Geometry Set Gather Recursive Instances
  * \{ */
 
-static void collect_geometry_set_recursive(const GeometrySet &geometry_set,
+static void geometry_set_collect_recursive(const GeometrySet &geometry_set,
                                            const float4x4 &transform,
                                            Vector<GeometryInstanceGroup> &r_sets);
 
-static void collect_collection_geometry_set_recursive(const Collection &collection,
+static void geometry_set_collect_recursive_collection(const Collection &collection,
+                                                      const float4x4 &transform,
+                                                      Vector<GeometryInstanceGroup> &r_sets);
+
+static void geometry_set_collect_recursive_object(const Object &object,
+                                                  const float4x4 &transform,
+                                                  Vector<GeometryInstanceGroup> &r_sets)
+{
+  GeometrySet instance_geometry_set = object_get_geometry_set_for_read(object);
+  const float4x4 object_transform = transform * object.obmat; /* TODO: Validate this. */
+  geometry_set_collect_recursive(instance_geometry_set, object_transform, r_sets);
+
+  if (object.type == OB_EMPTY) {
+    const Collection *collection_instance = object.instance_collection;
+    if (collection_instance != nullptr) {
+      geometry_set_collect_recursive_collection(*collection_instance, object_transform, r_sets);
+    }
+  }
+}
+
+static void geometry_set_collect_recursive_collection(const Collection &collection,
                                                       const float4x4 &transform,
                                                       Vector<GeometryInstanceGroup> &r_sets)
 {
   LISTBASE_FOREACH (const CollectionObject *, collection_object, &collection.gobject) {
     BLI_assert(collection_object->ob != nullptr);
     const Object &object = *collection_object->ob;
-    GeometrySet instance_geometry_set = object_get_geometry_set_for_read(object);
-
-    /* TODO: This seems to work-- validate this. */
-    const float4x4 instance_transform = transform * object.obmat;
-    collect_geometry_set_recursive(instance_geometry_set, instance_transform, r_sets);
+    geometry_set_collect_recursive_object(object, transform, r_sets);
   }
   LISTBASE_FOREACH (const CollectionChild *, collection_child, &collection.children) {
     BLI_assert(collection_child->collection != nullptr);
     const Collection &collection = *collection_child->collection;
-    collect_collection_geometry_set_recursive(collection, transform, r_sets);
+    geometry_set_collect_recursive_collection(collection, transform, r_sets);
   }
 }
 
-static void collect_geometry_set_recursive(const GeometrySet &geometry_set,
+static void geometry_set_collect_recursive(const GeometrySet &geometry_set,
                                            const float4x4 &transform,
                                            Vector<GeometryInstanceGroup> &r_sets)
 {
@@ -649,19 +666,17 @@ static void collect_geometry_set_recursive(const GeometrySet &geometry_set,
     Span<InstancedData> instances = instances_component.instanced_data();
     for (const int i : instances.index_range()) {
       const InstancedData &data = instances[i];
-      const float4x4 &instance_transform = transforms[i];
+      const float4x4 &instance_transform = transform * transforms[i];
 
       if (data.type == INSTANCE_DATA_TYPE_OBJECT) {
         BLI_assert(data.data.object != nullptr);
         const Object &object = *data.data.object;
-        const float4x4 object_transform = transform * instance_transform * object.obmat;
-        GeometrySet instance_geometry_set = object_get_geometry_set_for_read(object);
-        collect_geometry_set_recursive(instance_geometry_set, object_transform, r_sets);
+        geometry_set_collect_recursive_object(object, instance_transform, r_sets);
       }
       else if (data.type == INSTANCE_DATA_TYPE_COLLECTION) {
         BLI_assert(data.data.collection != nullptr);
         const Collection &collection = *data.data.collection;
-        collect_collection_geometry_set_recursive(collection, instance_transform, r_sets);
+        geometry_set_collect_recursive_collection(collection, instance_transform, r_sets);
       }
     }
   }
@@ -682,7 +697,7 @@ Vector<GeometryInstanceGroup> BKE_geometry_set_gather_instances(const GeometrySe
   float4x4 unit_transform;
   unit_m4(unit_transform.values);
 
-  collect_geometry_set_recursive(geometry_set, unit_transform, result_vector);
+  geometry_set_collect_recursive(geometry_set, unit_transform, result_vector);
 
   return result_vector;
 }
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc
index 67aaa54c197..a9c530545d7 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_proximity.cc
@@ -194,6 +194,10 @@ static void geo_node_attribute_proximity_exec(GeoNodeExecParams params)
 
   geometry_set_realize_instances_for_write(geometry_set);
 
+  /* HANS-TODO: This isn't required. This node should be rewritten to handle instances
+   * for the target geometry set. */
+  geometry_set_realize_instances_for_write(geometry_set_target);
+
   if (geometry_set.has<MeshComponent>()) {
     attribute_calc_proximity(
         geometry_set.get_component_for_write<MeshComponent>(), geometry_set_target, params);



More information about the Bf-blender-cvs mailing list