[Bf-blender-cvs] [e7364533041] temp-geometry-nodes-instances-api-v2: Support instances in the point instance node
Hans Goudey
noreply at git.blender.org
Sat Feb 6 16:21:24 CET 2021
Commit: e73645330412acff28d723f5fb893c94cd9b358a
Author: Hans Goudey
Date: Sat Feb 6 09:21:14 2021 -0600
Branches: temp-geometry-nodes-instances-api-v2
https://developer.blender.org/rBe73645330412acff28d723f5fb893c94cd9b358a
Support instances in the point instance node
This can use a read-only input since it just creates new data
===================================================================
M source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
===================================================================
diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
index 3bd8c355124..c89cfca656c 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
@@ -153,7 +153,8 @@ static Array<std::optional<InstancedData>> get_instanced_data(const GeoNodeExecP
static void add_instances_from_geometry_component(InstancesComponent &instances,
const GeometryComponent &src_geometry,
- const GeoNodeExecParams ¶ms)
+ const GeoNodeExecParams ¶ms,
+ const float4x4 &transform)
{
const AttributeDomain domain = ATTR_DOMAIN_POINT;
@@ -171,9 +172,10 @@ static void add_instances_from_geometry_component(InstancesComponent &instances,
for (const int i : IndexRange(domain_size)) {
if (instances_data[i].has_value()) {
- float transform[4][4];
- loc_eul_size_to_mat4(transform, positions[i], rotations[i], scales[i]);
- instances.add_instance(*instances_data[i], transform, ids[i]);
+ float4x4 instance_transform;
+ loc_eul_size_to_mat4(instance_transform.values, positions[i], rotations[i], scales[i]);
+ instance_transform = transform * instance_transform;
+ instances.add_instance(*instances_data[i], instance_transform, ids[i]);
}
}
}
@@ -184,14 +186,14 @@ static void geo_node_point_instance_exec(GeoNodeExecParams params)
GeometrySet geometry_set_out;
InstancesComponent &instances = geometry_set_out.get_component_for_write<InstancesComponent>();
- if (geometry_set.has<MeshComponent>()) {
- add_instances_from_geometry_component(
- instances, *geometry_set.get_component_for_read<MeshComponent>(), params);
- }
- if (geometry_set.has<PointCloudComponent>()) {
- add_instances_from_geometry_component(
- instances, *geometry_set.get_component_for_read<PointCloudComponent>(), params);
- }
+
+ /* Note that the matrix multiplication for the non-instances components could be avoided. */
+ BKE_geometry_set_foreach_component_recursive(
+ geometry_set, [&](const GeometryComponent &component, Span<float4x4> transforms) {
+ for (const float4x4 &transform : transforms) {
+ add_instances_from_geometry_component(instances, component, params, transform);
+ }
+ });
params.set_output("Geometry", std::move(geometry_set_out));
}
More information about the Bf-blender-cvs
mailing list