[Bf-blender-cvs] [763ebc31566] geometry-nodes: Geometry Nodes: use attribute name inputs in point instance node

Jacques Lucke noreply at git.blender.org
Fri Nov 20 18:48:30 CET 2020


Commit: 763ebc315660ef04f98fc4822302a43e723d0e76
Author: Jacques Lucke
Date:   Fri Nov 20 18:47:55 2020 +0100
Branches: geometry-nodes
https://developer.blender.org/rB763ebc315660ef04f98fc4822302a43e723d0e76

Geometry Nodes: use attribute name inputs in point instance node

This will probably not stay exactly like this, because it looks a bit ugly.
Adding this now, because it increases flexibility a lot and allows me
to test the attribute api a bit more.

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

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 c6840190046..f2255980027 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
@@ -25,6 +25,9 @@
 static bNodeSocketTemplate geo_node_point_instance_in[] = {
     {SOCK_GEOMETRY, N_("Geometry")},
     {SOCK_OBJECT, N_("Object")},
+    {SOCK_STRING, N_("Position Attribute")},
+    {SOCK_STRING, N_("Rotation Attribute")},
+    {SOCK_STRING, N_("Scale Attribute")},
     {-1, ""},
 };
 
@@ -35,18 +38,38 @@ static bNodeSocketTemplate geo_node_point_instance_out[] = {
 
 namespace blender::nodes {
 
+static void set_default_string(bNode *node, const int socket_index, StringRef str)
+{
+  bNodeSocket *socket = static_cast<bNodeSocket *>(BLI_findlink(&node->inputs, socket_index));
+  bNodeSocketValueString *value = static_cast<bNodeSocketValueString *>(socket->default_value);
+  str.copy(value->value);
+}
+
+static void geo_node_point_instance_init(bNodeTree *UNUSED(tree), bNode *node)
+{
+  set_default_string(node, 2, "Position");
+  set_default_string(node, 3, "Rotation");
+  set_default_string(node, 4, "Scale");
+}
+
 static void add_instances_from_geometry_component(InstancesComponent &instances,
                                                   const GeometryComponent &src_geometry,
-                                                  Object *object)
+                                                  Object *object,
+                                                  const GeoNodeExecParams &params)
 {
+  const std::string position_attribute = params.get_input<std::string>("Position Attribute");
+  const std::string rotation_attribute = params.get_input<std::string>("Rotation Attribute");
+  const std::string scale_attribute = params.get_input<std::string>("Scale Attribute");
+
   Float3ReadAttribute positions = src_geometry.attribute_get_for_read<float3>(
-      "Position", ATTR_DOMAIN_POINT, {0, 0, 0});
-  FloatReadAttribute radii = src_geometry.attribute_get_for_read<float>(
-      "Radius", ATTR_DOMAIN_POINT, 1.0f);
+      position_attribute, ATTR_DOMAIN_POINT, {0, 0, 0});
+  Float3ReadAttribute rotations = src_geometry.attribute_get_for_read<float3>(
+      rotation_attribute, ATTR_DOMAIN_POINT, {0, 0, 0});
+  Float3ReadAttribute scales = src_geometry.attribute_get_for_read<float3>(
+      scale_attribute, ATTR_DOMAIN_POINT, {1, 1, 1});
 
   for (const int i : IndexRange(positions.size())) {
-    const float radius = radii[i];
-    instances.add_instance(object, positions[i], {0, 0, 0}, {radius, radius, radius});
+    instances.add_instance(object, positions[i], rotations[i], scales[i]);
   }
 }
 
@@ -62,11 +85,11 @@ static void geo_point_instance_exec(GeoNodeExecParams params)
     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>(), object);
+          instances, *geometry_set.get_component_for_read<MeshComponent>(), object, params);
     }
     if (geometry_set.has<PointCloudComponent>()) {
       add_instances_from_geometry_component(
-          instances, *geometry_set.get_component_for_read<PointCloudComponent>(), object);
+          instances, *geometry_set.get_component_for_read<PointCloudComponent>(), object, params);
     }
   }
 
@@ -82,6 +105,7 @@ void register_node_type_geo_point_instance()
 
   geo_node_type_base(&ntype, GEO_NODE_POINT_INSTANCE, "Point Instance", 0, 0);
   node_type_socket_templates(&ntype, geo_node_point_instance_in, geo_node_point_instance_out);
+  node_type_init(&ntype, blender::nodes::geo_node_point_instance_init);
   ntype.geometry_node_execute = blender::nodes::geo_point_instance_exec;
   nodeRegisterType(&ntype);
 }



More information about the Bf-blender-cvs mailing list