[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 ¶ms,
- Span<float4x4> transforms)
+static void add_instances_from_geometry_component(InstancesComponent &instances,
+ const GeometryComponent &src_geometry,
+ const GeoNodeExecParams ¶ms)
{
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