Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc28
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_point_instance.cc55
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_point_separate.cc17
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc5
4 files changed, 54 insertions, 51 deletions
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_component_instances(const GeometryComponent &component,
@@ -186,12 +189,12 @@ static void copy_attribute_from_component_instances(const GeometryComponent &com
}
static void copy_attributes_to_output(Span<GeometryInstanceGroup> set_groups,
- Map<std::string, AttributeInfo> &result_attributes_info,
+ Map<std::string, AttributeKind> &result_attributes_info,
const StringRef mask_attribute_name,
PointCloudComponent &out_component_a,
PointCloudComponent &out_component_b)
{
- for (Map<std::string, AttributeInfo>::Item entry : result_attributes_info.items()) {
+ for (Map<std::string, AttributeKind>::Item entry : result_attributes_info.items()) {
const StringRef attribute_name = entry.key;
/* The output domain is always #ATTR_DOMAIN_POINT, since we are creating a point cloud. */
const CustomDataType output_data_type = entry.value.data_type;
@@ -250,7 +253,7 @@ static void geo_node_point_separate_exec(GeoNodeExecParams params)
params.set_output("Geometry 2", std::move(out_set_b));
}
- Vector<GeometryInstanceGroup> set_groups = BKE_geometry_set_gather_instances(geometry_set);
+ Vector<GeometryInstanceGroup> set_groups = bke::geometry_set_gather_instances(geometry_set);
int instances_len = 0;
for (const GeometryInstanceGroup &set_group : set_groups) {
@@ -266,9 +269,11 @@ static void geo_node_point_separate_exec(GeoNodeExecParams params)
component_a.replace(create_point_cloud(positions_a));
component_a.replace(create_point_cloud(positions_b));
- Map<std::string, AttributeInfo> result_attributes_info;
- gather_attribute_info(result_attributes_info, GeometryComponentType::Mesh, set_groups, {});
- gather_attribute_info(result_attributes_info, GeometryComponentType::PointCloud, set_groups, {});
+ Map<std::string, AttributeKind> result_attributes_info;
+ bke::gather_attribute_info(result_attributes_info,
+ {GeometryComponentType::Mesh, GeometryComponentType::PointCloud},
+ set_groups,
+ {});
copy_attributes_to_output(
set_groups, result_attributes_info, mask_attribute_name, component_a, component_b);
diff --git a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
index 8d1e1064256..81736d1afbf 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
@@ -28,6 +28,9 @@
#include "UI_interface.h"
#include "UI_resources.h"
+using blender::bke::AttributeKind;
+using blender::bke::GeometryInstanceGroup;
+
static bNodeSocketTemplate geo_node_points_to_volume_in[] = {
{SOCK_GEOMETRY, N_("Geometry")},
{SOCK_FLOAT, N_("Density"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX},
@@ -189,7 +192,7 @@ static void initialize_volume_component_from_points(const GeometrySet &geometry_
Vector<float3> positions;
Vector<float> radii;
- Vector<GeometryInstanceGroup> set_groups = BKE_geometry_set_gather_instances(geometry_set_in);
+ Vector<GeometryInstanceGroup> set_groups = bke::geometry_set_gather_instances(geometry_set_in);
for (const GeometryInstanceGroup &set_group : set_groups) {
const GeometrySet &set = set_group.geometry_set;