[Bf-blender-cvs] [d0cf25259d3] temp-point-distribution-refactor-experiment: take density factors into account

Jacques Lucke noreply at git.blender.org
Tue Jan 12 21:27:33 CET 2021


Commit: d0cf25259d35901c09ba7732a0fb82393b08c777
Author: Jacques Lucke
Date:   Tue Jan 12 20:49:11 2021 +0100
Branches: temp-point-distribution-refactor-experiment
https://developer.blender.org/rBd0cf25259d35901c09ba7732a0fb82393b08c777

take density factors into account

===================================================================

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 d6e29946bf0..31170f8acba 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
@@ -177,20 +177,20 @@ BLI_NOINLINE static KDTree_3d *build_kdtree(Span<float3> positions)
   return kdtree;
 }
 
-BLI_NOINLINE static void create_elimination_mask_for_close_points(
-    Span<float3> positions, const float minimum_distance, MutableSpan<bool> r_elimination_mask)
+BLI_NOINLINE static void update_elimination_mask_for_close_points(
+    Span<float3> positions, const float minimum_distance, MutableSpan<bool> elimination_mask)
 {
   KDTree_3d *kdtree = build_kdtree(positions);
 
   for (const int i : positions.index_range()) {
-    if (r_elimination_mask[i]) {
+    if (elimination_mask[i]) {
       continue;
     }
 
     struct CallbackData {
       int index;
       MutableSpan<bool> elimination_mask;
-    } callback_data = {i, r_elimination_mask};
+    } callback_data = {i, elimination_mask};
 
     BLI_kdtree_3d_range_search_cb(
         kdtree,
@@ -208,6 +208,40 @@ BLI_NOINLINE static void create_elimination_mask_for_close_points(
   BLI_kdtree_3d_free(kdtree);
 }
 
+BLI_NOINLINE static void update_elimination_mask_based_on_density_mask(
+    const Mesh &mesh,
+    const FloatReadAttribute &density_mask,
+    Span<float3> bary_coords,
+    Span<int> looptri_indices,
+    MutableSpan<bool> elimination_mask)
+{
+  Span<MLoopTri> looptris = get_mesh_looptris(mesh);
+  for (const int i : bary_coords.index_range()) {
+    if (elimination_mask[i]) {
+      continue;
+    }
+
+    const MLoopTri &looptri = looptris[looptri_indices[i]];
+    const float3 bary_coord = bary_coords[i];
+
+    const int v0_index = mesh.mloop[looptri.tri[0]].v;
+    const int v1_index = mesh.mloop[looptri.tri[1]].v;
+    const int v2_index = mesh.mloop[looptri.tri[2]].v;
+
+    const float v0_density_factor = std::max(0.0f, density_mask[v0_index]);
+    const float v1_density_factor = std::max(0.0f, density_mask[v1_index]);
+    const float v2_density_factor = std::max(0.0f, density_mask[v2_index]);
+
+    const float probablity = v0_density_factor * bary_coord.x + v1_density_factor * bary_coord.y +
+                             v2_density_factor * bary_coord.z;
+
+    const float hash = BLI_hash_int_01(bary_coord.hash());
+    if (hash > probablity) {
+      elimination_mask[i] = true;
+    }
+  }
+}
+
 BLI_NOINLINE static void eliminate_points_based_on_mask(Span<bool> elimination_mask,
                                                         Vector<float3> &positions,
                                                         Vector<float3> &bary_coords,
@@ -263,7 +297,9 @@ static Vector<float3> stable_random_scatter_with_minimum_distance(
   Vector<int> looptri_indices;
   initial_uniform_distribution(mesh, max_density, seed, positions, bary_coords, looptri_indices);
   Array<bool> elimination_mask(positions.size(), false);
-  create_elimination_mask_for_close_points(positions, minimum_distance, elimination_mask);
+  update_elimination_mask_for_close_points(positions, minimum_distance, elimination_mask);
+  update_elimination_mask_based_on_density_mask(
+      mesh, density_factors, bary_coords, looptri_indices, elimination_mask);
   eliminate_points_based_on_mask(elimination_mask, positions, bary_coords, looptri_indices);
 
   const int tot_output_points = positions.size();



More information about the Bf-blender-cvs mailing list