diff options
Diffstat (limited to 'source/blender')
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 ¶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_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; |