[Bf-blender-cvs] [f0c9c7c2000] temp-geometry-nodes-instances-api-v2: Fix conflicts and build error from merge

Hans Goudey noreply at git.blender.org
Thu Mar 18 04:30:26 CET 2021


Commit: f0c9c7c2000406ca695eb431fa740c5a1ab21a47
Author: Hans Goudey
Date:   Fri Feb 26 17:10:51 2021 -0600
Branches: temp-geometry-nodes-instances-api-v2
https://developer.blender.org/rBf0c9c7c2000406ca695eb431fa740c5a1ab21a47

Fix conflicts and build error from merge

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

M	source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
M	source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
M	source/blender/nodes/geometry/nodes/node_geo_point_separate.cc
M	source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
index a15bc784a55..1bc280c4bb7 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
@@ -29,6 +29,7 @@
 #include "BKE_attribute_math.hh"
 #include "BKE_bvhutils.h"
 #include "BKE_deform.h"
+#include "BKE_geometry_set_instances.hh"
 #include "BKE_mesh.h"
 #include "BKE_mesh_runtime.h"
 #include "BKE_pointcloud.h"
@@ -38,6 +39,9 @@
 
 #include "node_geometry_util.hh"
 
+using blender::bke::AttributeKind;
+using blender::bke::GeometryInstanceGroup;
+
 static bNodeSocketTemplate geo_node_point_distribute_in[] = {
     {SOCK_GEOMETRY, N_("Geometry")},
     {SOCK_FLOAT, N_("Distance Min"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 100000.0f, PROP_NONE},
@@ -108,9 +112,9 @@ static int sample_mesh_surface(const Mesh &mesh,
     const int v0_index = mesh.mloop[v0_loop].v;
     const int v1_index = mesh.mloop[v1_loop].v;
     const int v2_index = mesh.mloop[v2_loop].v;
-    const float3 v0_pos = transform * mesh.mvert[v0_index].co;
-    const float3 v1_pos = transform * mesh.mvert[v1_index].co;
-    const float3 v2_pos = transform * mesh.mvert[v2_index].co;
+    const float3 v0_pos = transform * float3(mesh.mvert[v0_index].co);
+    const float3 v1_pos = transform * float3(mesh.mvert[v1_index].co);
+    const float3 v2_pos = transform * float3(mesh.mvert[v2_index].co);
 
     float looptri_density_factor = 1.0f;
     if (density_factors != nullptr) {
@@ -337,12 +341,12 @@ BLI_NOINLINE static void interpolate_attribute(const Mesh &mesh,
 BLI_NOINLINE static void interpolate_existing_attributes(
     Span<GeometryInstanceGroup> sets,
     Span<int> group_start_indices,
-    Map<std::string, AttributeInfo> &attributes,
+    Map<std::string, AttributeKind> &attributes,
     GeometryComponent &component,
     Span<Vector<float3>> bary_coords_array,
     Span<Vector<int>> looptri_indices_array)
 {
-  for (Map<std::string, AttributeInfo>::Item entry : attributes.items()) {
+  for (Map<std::string, AttributeKind>::Item entry : attributes.items()) {
     StringRef attribute_name = entry.key;
     const CustomDataType output_data_type = entry.value.data_type;
     /* The output domain is always #ATTR_DOMAIN_POINT, since we are creating a point cloud. */
@@ -476,7 +480,7 @@ BLI_NOINLINE static void compute_special_attributes(Span<GeometryInstanceGroup>
 BLI_NOINLINE static void add_remaining_point_attributes(
     Span<GeometryInstanceGroup> sets,
     Span<int> group_start_indices,
-    Map<std::string, AttributeInfo> &attributes,
+    Map<std::string, AttributeKind> &attributes,
     GeometryComponent &component,
     Span<Vector<float3>> bary_coords_array,
     Span<Vector<int>> looptri_indices_array)
@@ -511,7 +515,7 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params)
 
   const int seed = params.get_input<int>("Seed");
 
-  Vector<GeometryInstanceGroup> sets = BKE_geometry_set_gather_instances(geometry_set);
+  Vector<GeometryInstanceGroup> sets = bke::geometry_set_gather_instances(geometry_set);
   int instances_len = 0;
   for (GeometryInstanceGroup set_group : sets) {
     instances_len += set_group.transforms.size();
@@ -542,7 +546,7 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params)
       switch (distribute_method) {
         case GEO_NODE_POINT_DISTRIBUTE_RANDOM: {
           const FloatReadAttribute density_factors = component.attribute_get_for_read<float>(
-              density_attribute_name, ATTR_DOMAIN_POINT, 1.0f);
+              density_attribute_name, ATTR_DOMAIN_CORNER, 1.0f);
           initial_points_len += sample_mesh_surface(mesh,
                                                     transform,
                                                     density,
@@ -582,7 +586,7 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params)
       const MeshComponent &component = *set.get_component_for_read<MeshComponent>();
       const Mesh &mesh = *component.get_for_read();
       const FloatReadAttribute density_factors = component.attribute_get_for_read<float>(
-          density_attribute_name, ATTR_DOMAIN_POINT, 1.0f);
+          density_attribute_name, ATTR_DOMAIN_CORNER, 1.0f);
 
       for (const int UNUSED(i_set_instance) : set_group.transforms.index_range()) {
         Vector<float3> &positions = positions_array[i_instance];
@@ -631,9 +635,9 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params)
       geometry_set_out.get_component_for_write<PointCloudComponent>();
   point_component.replace(pointcloud);
 
-  Map<std::string, AttributeInfo> attributes;
-  gather_attribute_info(
-      attributes, GeometryComponentType::Mesh, sets, {"position", "normal", "id"});
+  Map<std::string, AttributeKind> attributes;
+  bke::gather_attribute_info(
+      attributes, {GeometryComponentType::Mesh}, sets, {"position", "normal", "id"});
   add_remaining_point_attributes(sets,
                                  group_start_indices,
                                  attributes,
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 27dacd45a68..669b5ee4614 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
@@ -168,13 +168,15 @@ static Array<std::optional<InstancedData>> get_instanced_data(const GeoNodeExecP
   return instances_data;
 }
 
-static void add_instances_from_component_transforms(InstancesComponent &instances,
-                                                    const GeometryComponent &src_geometry,
-                                                    const GeoNodeExecParams &params,
-                                                    Span<float4x4> transforms)
+static void add_instances_from_geometry_component(InstancesComponent &instances,
+                                                  const GeometryComponent &src_geometry,
+                                                  const GeoNodeExecParams &params)
 {
   const AttributeDomain domain = ATTR_DOMAIN_POINT;
-  const int size = src_geometry.attribute_domain_size(domain) * transforms.size();
+
+  const int domain_size = src_geometry.attribute_domain_size(domain);
+  Array<std::optional<InstancedData>> instances_data = get_instanced_data(
+      params, src_geometry, domain_size);
 
   Float3ReadAttribute positions = src_geometry.attribute_get_for_read<float3>(
       "position", domain, {0, 0, 0});
@@ -184,18 +186,11 @@ static void add_instances_from_component_transforms(InstancesComponent &instance
       "scale", domain, {1, 1, 1});
   Int32ReadAttribute ids = src_geometry.attribute_get_for_read<int>("id", domain, -1);
 
-  /* HANS-TODO: This is quite broken, don't do this here. And really, why fill an array... */
-  Array<std::optional<InstancedData>> instances_data = get_instanced_data(
-      params, src_geometry, size);
-
-  for (const float4x4 &transform : transforms) {
-    for (const int i : IndexRange(size)) {
-      if (instances_data[i].has_value()) {
-        float4x4 instance_transform;
-        loc_eul_size_to_mat4(instance_transform.values, positions[i], rotations[i], scales[i]);
-        instance_transform = transform * instance_transform;
-        instances.add_instance(*instances_data[i], instance_transform, ids[i]);
-      }
+  for (const int i : IndexRange(domain_size)) {
+    if (instances_data[i].has_value()) {
+      float transform[4][4];
+      loc_eul_size_to_mat4(transform, positions[i], rotations[i], scales[i]);
+      instances.add_instance(*instances_data[i], transform, ids[i]);
     }
   }
 }
@@ -203,24 +198,20 @@ static void add_instances_from_component_transforms(InstancesComponent &instance
 static void geo_node_point_instance_exec(GeoNodeExecParams params)
 {
   GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
-
   GeometrySet geometry_set_out;
-  InstancesComponent &instances = geometry_set_out.get_component_for_write<InstancesComponent>();
 
-  Vector<GeometryInstanceGroup> set_groups = BKE_geometry_set_gather_instances(geometry_set);
-  for (const GeometryInstanceGroup &set_group : set_groups) {
-    const GeometrySet &set = set_group.geometry_set;
+  /* TODO: This node should be able to instance on the input instances component
+   * rather than making the entire input geometry set real. */
+  geometry_set = geometry_set_realize_instances(geometry_set);
 
-    if (set.has<MeshComponent>()) {
-      add_instances_from_component_transforms(
-          instances, *set.get_component_for_read<MeshComponent>(), params, set_group.transforms);
-    }
-    if (set.has<PointCloudComponent>()) {
-      add_instances_from_component_transforms(instances,
-                                              *set.get_component_for_read<PointCloudComponent>(),
-                                              params,
-                                              set_group.transforms);
-    }
+  InstancesComponent &instances = geometry_set_out.get_component_for_write<InstancesComponent>();
+  if (geometry_set.has<MeshComponent>()) {
+    add_instances_from_geometry_component(
+        instances, *geometry_set.get_component_for_read<MeshComponent>(), params);
+  }
+  if (geometry_set.has<PointCloudComponent>()) {
+    add_instances_from_geometry_component(
+        instances, *geometry_set.get_component_for_read<PointCloudComponent>(), params);
   }
 
   params.set_output("Geometry", std::move(geometry_set_out));
diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc b/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc
index dd587b6bea9..09ed2b87f5b 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_separate.cc
@@ -37,6 +37,9 @@ static bNodeSocketTemplate geo_node_point_instance_out[] = {
     {-1, ""},
 };
 
+using blender::bke::AttributeKind;
+using blender::bke::GeometryInstanceGroup;
+
 namespace blender::nodes {
 
 static void gather_positions_from_compo

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list