[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