[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