[Bf-blender-cvs] [caa942b0333] geometry-nodes: Geometry Nodes: actually create instances in Point Instance node

Jacques Lucke noreply at git.blender.org
Thu Nov 12 13:31:22 CET 2020


Commit: caa942b03334b39869b0d417a5f4c5591c0c0ef0
Author: Jacques Lucke
Date:   Thu Nov 12 13:28:33 2020 +0100
Branches: geometry-nodes
https://developer.blender.org/rBcaa942b03334b39869b0d417a5f4c5591c0c0ef0

Geometry Nodes: actually create instances in Point Instance 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 ba77ed81853..71f59e91ab4 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
@@ -15,12 +15,16 @@
  */
 
 #include "BKE_mesh.h"
+#include "BKE_persistent_data_handle.hh"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
 #include "DNA_pointcloud_types.h"
 
 #include "node_geometry_util.hh"
 
 static bNodeSocketTemplate geo_node_point_instance_in[] = {
     {SOCK_GEOMETRY, N_("Geometry")},
+    {SOCK_OBJECT, N_("Object")},
     {-1, ""},
 };
 
@@ -35,27 +39,31 @@ static void geo_point_instance_exec(bNode *UNUSED(node),
                                     GeoNodeOutputs outputs)
 {
   GeometrySetPtr geometry_set = inputs.extract<GeometrySetPtr>("Geometry");
-
-  if (!geometry_set.has_value() || !geometry_set->has_pointcloud()) {
+  if (!geometry_set.has_value()) {
     outputs.set("Geometry", std::move(geometry_set));
     return;
   }
 
-  /* For now make a mesh from the pointcloud instead of instancing another object / geometry. */
-  const PointCloud *pointcloud = geometry_set->get_pointcloud_for_read();
-
-  if (pointcloud == nullptr) {
-    outputs.set("Geometry", std::move(geometry_set));
-    return;
+  Vector<float3> positions;
+  if (geometry_set->has_pointcloud()) {
+    const PointCloud *pointcloud = geometry_set->get_pointcloud_for_read();
+    positions.extend((const float3 *)pointcloud->co, pointcloud->totpoint);
+  }
+  if (geometry_set->has_mesh()) {
+    const Mesh *mesh = geometry_set->get_mesh_for_read();
+    for (const int i : IndexRange(mesh->totvert)) {
+      positions.append(mesh->mvert[i].co);
+    }
   }
 
-  /* TODO: Carry over attributes from poincloud verts to the instances. */
-  Mesh *mesh_out = BKE_mesh_new_nomain(pointcloud->totpoint, 0, 0, 0, 0);
-  BKE_mesh_from_pointcloud(pointcloud, mesh_out);
+  bke::PersistentObjectHandle object_handle = inputs.extract<bke::PersistentObjectHandle>(
+      "Object");
+  Object *object = inputs.handle_map().lookup(object_handle);
 
-  /* For now, replace any existing mesh in the geometry. */
   make_geometry_set_mutable(geometry_set);
-  geometry_set->replace_mesh(mesh_out);
+  bke::InstancesComponent &instances =
+      geometry_set->get_component_for_write<bke::InstancesComponent>();
+  instances.replace(std::move(positions), object);
 
   outputs.set("Geometry", std::move(geometry_set));
 }



More information about the Bf-blender-cvs mailing list