[Bf-blender-cvs] [9798d68cc17] geometry-nodes: Geometry Nodes: simplify point instancer node

Jacques Lucke noreply at git.blender.org
Fri Nov 20 17:45:20 CET 2020


Commit: 9798d68cc17153decfba7a27b20468d985f33828
Author: Jacques Lucke
Date:   Fri Nov 20 17:45:12 2020 +0100
Branches: geometry-nodes
https://developer.blender.org/rB9798d68cc17153decfba7a27b20468d985f33828

Geometry Nodes: simplify point instancer node

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

M	source/blender/blenkernel/BKE_geometry_set.hh
M	source/blender/blenkernel/intern/geometry_set.cc
M	source/blender/nodes/geometry/nodes/node_geo_point_instance.cc

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

diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh
index 53efcd5b36f..366477dcc81 100644
--- a/source/blender/blenkernel/BKE_geometry_set.hh
+++ b/source/blender/blenkernel/BKE_geometry_set.hh
@@ -193,6 +193,13 @@ struct GeometrySet {
     return this->has(Component::type);
   }
 
+  void remove(const GeometryComponentType component_type);
+  template<typename Component> void remove()
+  {
+    BLI_STATIC_ASSERT(is_geometry_component_v<Component>, "");
+    return this->remove(Component::type);
+  }
+
   friend std::ostream &operator<<(std::ostream &stream, const GeometrySet &geometry_set);
   friend bool operator==(const GeometrySet &a, const GeometrySet &b);
   uint64_t hash() const;
diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc
index 9d51ae8ded3..7dfc857616f 100644
--- a/source/blender/blenkernel/intern/geometry_set.cc
+++ b/source/blender/blenkernel/intern/geometry_set.cc
@@ -119,6 +119,11 @@ bool GeometrySet::has(const GeometryComponentType component_type) const
   return components_.contains(component_type);
 }
 
+void GeometrySet::remove(const GeometryComponentType component_type)
+{
+  components_.remove(component_type);
+}
+
 std::ostream &operator<<(std::ostream &stream, const GeometrySet &geometry_set)
 {
   stream << "<GeometrySet at " << &geometry_set << ", " << geometry_set.components_.size()
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 10f55ae3ff8..59bfd3d6389 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
@@ -34,6 +34,22 @@ static bNodeSocketTemplate geo_node_point_instance_out[] = {
 };
 
 namespace blender::nodes {
+
+static void add_instances_from_geometry_component(InstancesComponent &instances,
+                                                  const GeometryComponent &src_geometry,
+                                                  const AttributeDomain domain,
+                                                  Object *object)
+{
+  Float3ReadAttribute positions = src_geometry.attribute_get_for_read<float3>(
+      "Position", domain, {0, 0, 0});
+  FloatReadAttribute radii = src_geometry.attribute_get_for_read<float>("Radius", domain, 1.0f);
+
+  for (const int i : IndexRange(positions.size())) {
+    const float radius = radii[i];
+    instances.add_instance(object, positions[i], {0, 0, 0}, {radius, radius, radius});
+  }
+}
+
 static void geo_point_instance_exec(GeoNodeExecParams params)
 {
   GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
@@ -42,38 +58,25 @@ static void geo_point_instance_exec(GeoNodeExecParams params)
       "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 = pointcloud_component->attribute_get_for_read<float3>(
-        "Position", ATTR_DOMAIN_POINT, {0, 0, 0});
-    FloatReadAttribute radii = pointcloud_component->attribute_get_for_read<float>(
-        "Radius", ATTR_DOMAIN_POINT, 1.0f);
-
-    for (const int i : IndexRange(positions.size())) {
-      const float radius = radii[i];
-      instances.add_instance(object, positions[i], {0, 0, 0}, {radius, radius, radius});
+  if (object != nullptr) {
+    InstancesComponent &instances = geometry_set.get_component_for_write<InstancesComponent>();
+    if (geometry_set.has<MeshComponent>()) {
+      add_instances_from_geometry_component(instances,
+                                            *geometry_set.get_component_for_read<MeshComponent>(),
+                                            ATTR_DOMAIN_VERTEX,
+                                            object);
     }
-  }
-
-  const MeshComponent *mesh_component = geometry_set.get_component_for_read<MeshComponent>();
-  if (mesh_component != nullptr) {
-    Float3ReadAttribute positions = mesh_component->attribute_get_for_read<float3>(
-        "Position", ATTR_DOMAIN_VERTEX, {0, 0, 0});
-    FloatReadAttribute radii = mesh_component->attribute_get_for_read<float>(
-        "Radius", ATTR_DOMAIN_VERTEX, 1.0f);
-
-    for (const int i : IndexRange(positions.size())) {
-      const float radius = radii[i];
-      instances.add_instance(object, positions[i], {0, 0, 0}, {radius, radius, radius});
+    if (geometry_set.has<PointCloudComponent>()) {
+      add_instances_from_geometry_component(
+          instances,
+          *geometry_set.get_component_for_read<PointCloudComponent>(),
+          ATTR_DOMAIN_POINT,
+          object);
     }
   }
 
-  geometry_set.replace_mesh(nullptr);
-  geometry_set.replace_pointcloud(nullptr);
-
+  geometry_set.remove<MeshComponent>();
+  geometry_set.remove<PointCloudComponent>();
   params.set_output("Geometry", std::move(geometry_set));
 }
 }  // namespace blender::nodes



More information about the Bf-blender-cvs mailing list