[Bf-blender-cvs] [adbeabb13c0] temp-geometry-nodes-expandable-geometry-socket-prototype: support array input in point distribute node
Jacques Lucke
noreply at git.blender.org
Fri Aug 6 13:29:05 CEST 2021
Commit: adbeabb13c0b6351bc95f0d641af587dcdcc2b7f
Author: Jacques Lucke
Date: Fri Aug 6 12:40:46 2021 +0200
Branches: temp-geometry-nodes-expandable-geometry-socket-prototype
https://developer.blender.org/rBadbeabb13c0b6351bc95f0d641af587dcdcc2b7f
support array input in point distribute node
===================================================================
M source/blender/nodes/geometry/nodes/node_geo_point_distribute.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 cec1819159e..234bd820074 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
@@ -42,8 +42,7 @@ 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_DISTANCE},
- {SOCK_FLOAT, N_("Density Max"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 100000.0f, PROP_NONE},
- {SOCK_STRING, N_("Density Attribute")},
+ {SOCK_FLOAT, N_("Density"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 100000.0f, PROP_NONE},
{SOCK_INT, N_("Seed"), 0, 0, 0, 0, -10000, 10000},
{-1, ""},
};
@@ -87,12 +86,15 @@ static float3 normal_to_euler_rotation(const float3 normal)
static void sample_mesh_surface(const Mesh &mesh,
const float4x4 &transform,
const float base_density,
- const VArray<float> *density_factors,
+ const Array<float> &density_factors,
const int seed,
Vector<float3> &r_positions,
Vector<float3> &r_bary_coords,
Vector<int> &r_looptri_indices)
{
+ fn::GVArray_For_RepeatedGSpan density_factors_repeated{mesh.totloop, density_factors.as_span()};
+ GVArray_Typed<float> density_factors_varray{density_factors_repeated};
+
const Span<MLoopTri> looptris{BKE_mesh_runtime_looptri_ensure(&mesh),
BKE_mesh_runtime_looptri_len(&mesh)};
@@ -108,19 +110,16 @@ static void sample_mesh_surface(const Mesh &mesh,
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) {
- const float v0_density_factor = std::max(0.0f, density_factors->get(v0_loop));
- const float v1_density_factor = std::max(0.0f, density_factors->get(v1_loop));
- const float v2_density_factor = std::max(0.0f, density_factors->get(v2_loop));
- looptri_density_factor = (v0_density_factor + v1_density_factor + v2_density_factor) / 3.0f;
- }
+ const float v0_density = std::max(0.0f, density_factors_varray[v0_loop]);
+ const float v1_density = std::max(0.0f, density_factors_varray[v1_loop]);
+ const float v2_density = std::max(0.0f, density_factors_varray[v2_loop]);
+ float looptri_density = (v0_density + v1_density + v2_density) / 3.0f;
const float area = area_tri_v3(v0_pos, v1_pos, v2_pos);
const int looptri_seed = BLI_hash_int(looptri_index + seed);
RandomNumberGenerator looptri_rng(looptri_seed);
- const float points_amount_fl = area * base_density * looptri_density_factor;
+ const float points_amount_fl = area * base_density * looptri_density;
const float add_point_probability = fractf(points_amount_fl);
const bool add_point = add_point_probability > looptri_rng.get_float();
const int point_amount = (int)points_amount_fl + (int)add_point;
@@ -419,45 +418,33 @@ BLI_NOINLINE static void add_remaining_point_attributes(
}
static void distribute_points_random(Span<GeometryInstanceGroup> set_groups,
- const StringRef density_attribute_name,
- const float density,
+ const float base_density,
+ const Array<float> &density,
const int seed,
MutableSpan<Vector<float3>> positions_all,
MutableSpan<Vector<float3>> bary_coords_all,
MutableSpan<Vector<int>> looptri_indices_all)
{
- /* If there is an attribute name, the default value for the densities should be zero so that
- * points are only scattered where the attribute exists. Otherwise, just "ignore" the density
- * factors. */
- const bool use_one_default = density_attribute_name.is_empty();
-
int i_instance = 0;
for (const GeometryInstanceGroup &set_group : set_groups) {
const GeometrySet &set = set_group.geometry_set;
const MeshComponent &component = *set.get_component_for_read<MeshComponent>();
- GVArray_Typed<float> density_factors = component.attribute_get_for_read<float>(
- density_attribute_name, ATTR_DOMAIN_CORNER, use_one_default ? 1.0f : 0.0f);
const Mesh &mesh = *component.get_for_read();
+
for (const float4x4 &transform : set_group.transforms) {
Vector<float3> &positions = positions_all[i_instance];
Vector<float3> &bary_coords = bary_coords_all[i_instance];
Vector<int> &looptri_indices = looptri_indices_all[i_instance];
- sample_mesh_surface(mesh,
- transform,
- density,
- &*density_factors,
- seed,
- positions,
- bary_coords,
- looptri_indices);
+ sample_mesh_surface(
+ mesh, transform, base_density, density, seed, positions, bary_coords, looptri_indices);
i_instance++;
}
}
}
static void distribute_points_poisson_disk(Span<GeometryInstanceGroup> set_groups,
- const StringRef density_attribute_name,
- const float density,
+ const float max_density,
+ const Array<float> &density_factors,
const int seed,
const float minimum_distance,
MutableSpan<Vector<float3>> positions_all,
@@ -476,7 +463,7 @@ static void distribute_points_poisson_disk(Span<GeometryInstanceGroup> set_group
Vector<float3> &bary_coords = bary_coords_all[i_instance];
Vector<int> &looptri_indices = looptri_indices_all[i_instance];
sample_mesh_surface(
- mesh, transform, density, nullptr, seed, positions, bary_coords, looptri_indices);
+ mesh, transform, max_density, {1.0f}, seed, positions, bary_coords, looptri_indices);
instance_start_offsets[i_instance] = initial_points_len;
initial_points_len += positions.size();
@@ -484,11 +471,6 @@ static void distribute_points_poisson_disk(Span<GeometryInstanceGroup> set_group
}
}
- /* If there is an attribute name, the default value for the densities should be zero so that
- * points are only scattered where the attribute exists. Otherwise, just "ignore" the density
- * factors. */
- const bool use_one_default = density_attribute_name.is_empty();
-
/* Unlike the other result arrays, the elimination mask in stored as a flat array for every
* point, in order to simplify culling points from the KDTree (which needs to know about all
* points at once). */
@@ -504,8 +486,10 @@ static void distribute_points_poisson_disk(Span<GeometryInstanceGroup> set_group
const GeometrySet &set = set_group.geometry_set;
const MeshComponent &component = *set.get_component_for_read<MeshComponent>();
const Mesh &mesh = *component.get_for_read();
- const GVArray_Typed<float> density_factors = component.attribute_get_for_read<float>(
- density_attribute_name, ATTR_DOMAIN_CORNER, use_one_default ? 1.0f : 0.0f);
+
+ fn::GVArray_For_RepeatedGSpan density_factors_repeated{mesh.totloop,
+ density_factors.as_span()};
+ GVArray_Typed<float> density_factors_varray{density_factors_repeated};
for (const int UNUSED(i_set_instance) : set_group.transforms.index_range()) {
Vector<float3> &positions = positions_all[i_instance];
@@ -515,7 +499,7 @@ static void distribute_points_poisson_disk(Span<GeometryInstanceGroup> set_group
const int offset = instance_start_offsets[i_instance];
update_elimination_mask_based_on_density_factors(
mesh,
- density_factors,
+ density_factors_varray,
bary_coords,
looptri_indices,
elimination_mask.as_mutable_span().slice(offset, positions.size()));
@@ -546,11 +530,10 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params)
static_cast<GeometryNodePointDistributeMode>(params.node().custom1);
const int seed = params.get_input<int>("Seed") * 5383843;
- const float density = params.extract_input<float>("Density Max");
- const std::string density_attribute_name = params.extract_input<std::string>(
- "Density Attribute");
+ const float density_max = 1.0f;
+ const Array<float> density_factors = params.extract_input<Array<float>>("Density");
- if (density <= 0.0f) {
+ if (density_max <= 0.0f) {
set_fallback_output(params);
return;
}
@@ -591,8 +574,8 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params)
switch (distribute_method) {
case GEO_NODE_POINT_DISTRIBUTE_RANDOM: {
distribute_points_random(set_groups,
- density_attribute_name,
- density,
+ density_max,
+ density_factors,
seed,
positions_all,
bary_coords_all,
@@ -602,8 +585,8 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params)
case GEO_NODE_POINT_DISTRIBUTE_POISSON: {
const float minimum_distance = params.extract_input<float>("Distance Min");
distribute_points_poisson_disk(set_groups,
- density_attribute_name,
- density,
+ density_ma
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list