[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