[Bf-blender-cvs] [80c3f12c08b] temp-geometry-nodes-instances-api-v2: Support instances in the points to volume node
Hans Goudey
noreply at git.blender.org
Sat Feb 6 16:21:17 CET 2021
Commit: 80c3f12c08b894899f1bcbea544c76388df34f68
Author: Hans Goudey
Date: Sat Feb 6 08:54:18 2021 -0600
Branches: temp-geometry-nodes-instances-api-v2
https://developer.blender.org/rB80c3f12c08b894899f1bcbea544c76388df34f68
Support instances in the points to volume node
===================================================================
M source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
===================================================================
diff --git a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
index b90ef2034a8..c7b36a8989f 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
@@ -129,18 +129,31 @@ static float compute_voxel_size(const GeoNodeExecParams ¶ms,
return voxel_size;
}
-static void gather_point_data_from_component(const GeoNodeExecParams ¶ms,
- const GeometryComponent &component,
- Vector<float3> &r_positions,
- Vector<float> &r_radii)
+static void gather_point_data_from_component_and_transforms(const GeoNodeExecParams ¶ms,
+ const GeometryComponent &component,
+ Vector<float3> &r_positions,
+ Vector<float> &r_radii,
+ Span<float4x4> transforms)
{
- Float3ReadAttribute positions = component.attribute_get_for_read<float3>(
- "position", ATTR_DOMAIN_POINT, {0, 0, 0});
- FloatReadAttribute radii = params.get_input_attribute<float>(
+ ReadAttributePtr positions_attribte = component.attribute_try_get_for_read(
+ "position", ATTR_DOMAIN_POINT, CD_PROP_FLOAT3);
+ if (!positions_attribte) {
+ return;
+ }
+ FloatReadAttribute radii_attribute = params.get_input_attribute<float>(
"Radius", component, ATTR_DOMAIN_POINT, 0.0f);
+ Span<float> radii = radii_attribute.get_span();
+ Span<float3> positions = positions_attribte->get_span<float3>();
+
+ r_positions.reserve(r_positions.size() +
+ component.attribute_domain_size(ATTR_DOMAIN_POINT) * transforms.size());
- r_positions.extend(positions.get_span());
- r_radii.extend(radii.get_span());
+ for (const float4x4 &transform : transforms) {
+ for (const float3 position : positions) {
+ r_positions.append(transform * position);
+ }
+ r_radii.extend(radii);
+ }
}
static void convert_to_grid_index_space(const float voxel_size,
@@ -163,14 +176,14 @@ static void initialize_volume_component_from_points(const GeometrySet &geometry_
Vector<float3> positions;
Vector<float> radii;
- if (geometry_set_in.has<MeshComponent>()) {
- gather_point_data_from_component(
- params, *geometry_set_in.get_component_for_read<MeshComponent>(), positions, radii);
- }
- if (geometry_set_in.has<PointCloudComponent>()) {
- gather_point_data_from_component(
- params, *geometry_set_in.get_component_for_read<PointCloudComponent>(), positions, radii);
- }
+ /* Note that it would be possible to avoid the matrix multiplication
+ * for the first non-instance geometry components. */
+ BKE_geometry_set_foreach_component_recursive(
+ geometry_set_in,
+ [&](const GeometryComponent &component, Span<blender::float4x4> transforms) {
+ gather_point_data_from_component_and_transforms(
+ params, component, positions, radii, transforms);
+ });
const float max_radius = *std::max_element(radii.begin(), radii.end());
const float voxel_size = compute_voxel_size(params, positions, max_radius);
More information about the Bf-blender-cvs
mailing list