[Bf-blender-cvs] [bacde38b67d] temp-geometry-nodes-fields-prototype: refactor point distribute node
Jacques Lucke
noreply at git.blender.org
Thu Jul 29 21:41:14 CEST 2021
Commit: bacde38b67dcd604823d82368a0235a9828531fb
Author: Jacques Lucke
Date: Thu Jul 29 21:41:01 2021 +0200
Branches: temp-geometry-nodes-fields-prototype
https://developer.blender.org/rBbacde38b67dcd604823d82368a0235a9828531fb
refactor 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 3ba4a8248f9..28f6d9b9368 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,8 @@ 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 Max"), 10.0f, 0.0f, 0.0f, 0.0f, 0.0f, 100000.0f, PROP_NONE},
+ {SOCK_FLOAT, N_("Density Factor"), 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, ""},
};
@@ -94,7 +94,7 @@ static Span<MLoopTri> get_mesh_looptris(const Mesh &mesh)
static void sample_mesh_surface(const Mesh &mesh,
const float4x4 &transform,
const float base_density,
- const VArray<float> *density_factors,
+ const VArray<float> &density,
const int seed,
Vector<float3> &r_positions,
Vector<float3> &r_bary_coords,
@@ -114,19 +114,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[v0_loop]);
+ const float v1_density = std::max(0.0f, density[v1_loop]);
+ const float v2_density = std::max(0.0f, density[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;
@@ -471,45 +468,41 @@ 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 bke::FieldRef<float> &density_field,
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();
+
+ bke::FieldInputs density_field_inputs = density_field->prepare_inputs();
+ Vector<std::unique_ptr<bke::FieldInputValue>> density_field_input_values;
+ prepare_field_inputs(
+ density_field_inputs, component, ATTR_DOMAIN_CORNER, density_field_input_values);
+ bke::FieldOutput density_field_output = density_field->evaluate(IndexRange(mesh.totloop),
+ density_field_inputs);
+ GVArray_Typed<float> density{density_field_output.varray_ref()};
+
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 bke::FieldRef<float> &density_field,
const int seed,
const float minimum_distance,
MutableSpan<Vector<float3>> positions_all,
@@ -527,8 +520,14 @@ static void distribute_points_poisson_disk(Span<GeometryInstanceGroup> set_group
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, nullptr, seed, positions, bary_coords, looptri_indices);
+ sample_mesh_surface(mesh,
+ transform,
+ max_density,
+ VArray_For_Single<float>(1.0f, mesh.totloop),
+ seed,
+ positions,
+ bary_coords,
+ looptri_indices);
instance_start_offsets[i_instance] = initial_points_len;
initial_points_len += positions.size();
@@ -536,11 +535,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). */
@@ -556,8 +550,14 @@ 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);
+
+ bke::FieldInputs density_field_inputs = density_field->prepare_inputs();
+ Vector<std::unique_ptr<bke::FieldInputValue>> density_field_input_values;
+ prepare_field_inputs(
+ density_field_inputs, component, ATTR_DOMAIN_CORNER, density_field_input_values);
+ bke::FieldOutput density_field_output = density_field->evaluate(IndexRange(mesh.totloop),
+ density_field_inputs);
+ GVArray_Typed<float> density{density_field_output.varray_ref()};
for (const int UNUSED(i_set_instance) : set_group.transforms.index_range()) {
Vector<float3> &positions = positions_all[i_instance];
@@ -567,7 +567,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,
bary_coords,
looptri_indices,
elimination_mask.as_mutable_span().slice(offset, positions.size()));
@@ -590,11 +590,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 = params.extract_input<float>("Density Max");
+ bke::FieldRef<float> density_field = params.get_input_field<float>("Density Factor");
- if (density <= 0.0f) {
+ if (density_max <= 0.0f) {
params.set_output("Geometry", GeometrySet());
return;
}
@@ -635,8 +634,8 @@ static void geo_node_point_distribute_exec(GeoNodeExecParams params)
switch (distribute_met
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list