[Bf-blender-cvs] [91971093bbb] geometry-nodes: Geometry Nodes: support controlling instance scale in point instancer node

Jacques Lucke noreply at git.blender.org
Wed Nov 18 13:41:44 CET 2020


Commit: 91971093bbb400e0f3446740372f1d80ebb58d17
Author: Jacques Lucke
Date:   Wed Nov 18 13:41:08 2020 +0100
Branches: geometry-nodes
https://developer.blender.org/rB91971093bbb400e0f3446740372f1d80ebb58d17

Geometry Nodes: support controlling instance scale in point instancer node

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

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 c600f383563..24f2ce8591d 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
@@ -38,31 +38,41 @@ static void geo_point_instance_exec(GeoNodeExecParams params)
 {
   GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
 
-  Vector<float3> instance_positions;
-  if (geometry_set.has_pointcloud()) {
-    const PointCloudComponent &pointcloud_component =
-        *geometry_set.get_component_for_read<PointCloudComponent>();
+  bke::PersistentObjectHandle object_handle = params.extract_input<bke::PersistentObjectHandle>(
+      "Object");
+  Object *object = params.handle_map().lookup(object_handle);
+
+  InstancesComponent &instances = geometry_set.get_component_for_write<InstancesComponent>();
+
+  const PointCloudComponent *pointcloud_component =
+      geometry_set.get_component_for_read<PointCloudComponent>();
+  if (pointcloud_component != nullptr) {
     Float3ReadAttribute positions = bke::pointcloud_attribute_get_for_read<float3>(
-        pointcloud_component, "Position", {0, 0, 0});
+        *pointcloud_component, "Position", {0, 0, 0});
+    FloatReadAttribute radii = bke::pointcloud_attribute_get_for_read<float>(
+        *pointcloud_component, "Radius", 1.0f);
+
     for (const int i : IndexRange(positions.size())) {
-      instance_positions.append(positions[i]);
+      const float radius = radii[i];
+      instances.add_instance(object, positions[i], {0, 0, 0}, {radius, radius, radius});
     }
   }
-  if (geometry_set.has_mesh()) {
-    const MeshComponent &mesh_component = *geometry_set.get_component_for_read<MeshComponent>();
+
+  const MeshComponent *mesh_component = geometry_set.get_component_for_read<MeshComponent>();
+  if (mesh_component != nullptr) {
     Float3ReadAttribute positions = bke::mesh_attribute_get_for_read<float3>(
-        mesh_component, "Position", ATTR_DOMAIN_VERTEX, {0, 0, 0});
+        *mesh_component, "Position", ATTR_DOMAIN_VERTEX, {0, 0, 0});
+    FloatReadAttribute radii = bke::mesh_attribute_get_for_read<float>(
+        *mesh_component, "Radius", ATTR_DOMAIN_VERTEX, 1.0f);
+
     for (const int i : IndexRange(positions.size())) {
-      instance_positions.append(positions[i]);
+      const float radius = radii[i];
+      instances.add_instance(object, positions[i], {0, 0, 0}, {radius, radius, radius});
     }
   }
 
-  bke::PersistentObjectHandle object_handle = params.extract_input<bke::PersistentObjectHandle>(
-      "Object");
-  Object *object = params.handle_map().lookup(object_handle);
-
-  InstancesComponent &instances = geometry_set.get_component_for_write<InstancesComponent>();
-  instances.replace(std::move(instance_positions), object);
+  geometry_set.replace_mesh(nullptr);
+  geometry_set.replace_pointcloud(nullptr);
 
   params.set_output("Geometry", std::move(geometry_set));
 }



More information about the Bf-blender-cvs mailing list