[Bf-blender-cvs] [b54f406638c] temp-geometry-nodes-distribute-points-cleanup: Use the correct function for the min distance

Dalai Felinto noreply at git.blender.org
Fri Dec 11 02:00:49 CET 2020


Commit: b54f406638cea874f8423b7b943ef8cd4894afd0
Author: Dalai Felinto
Date:   Fri Dec 11 00:46:06 2020 +0100
Branches: temp-geometry-nodes-distribute-points-cleanup
https://developer.blender.org/rBb54f406638cea874f8423b7b943ef8cd4894afd0

Use the correct function for the min distance

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

M	source/blender/nodes/geometry/nodes/node_geo_point_distribute_poisson_disk.cc

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_distribute_poisson_disk.cc b/source/blender/nodes/geometry/nodes/node_geo_point_distribute_poisson_disk.cc
index f13cd8c4d14..36ef1bf6518 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_distribute_poisson_disk.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_distribute_poisson_disk.cc
@@ -91,14 +91,11 @@ static void points_distance_weight_calculate(std::vector<float> *weights,
                                              const size_t point_id,
                                              Vector<float3> const *input_points,
                                              const void *kd_tree,
+                                             const size_t minimum_distance,
                                              const size_t maximum_distance,
-                                             const float3 boundbox,
                                              Heap *heap,
                                              std::vector<HeapNode *> *nodes)
 {
-  const float minimum_distance = 2.0f *
-                                 maximum_poisson_disk_radius(input_points->size(), boundbox);
-
   KDTreeNearest_3d *nearest_point = nullptr;
   int neighbors = BLI_kdtree_3d_range_search(
       (KDTree_3d *)kd_tree, input_points->data()[point_id], &nearest_point, maximum_distance);
@@ -138,11 +135,26 @@ static void points_distance_weight_calculate(std::vector<float> *weights,
   }
 }
 
+/**
+ * Returns the minimum radius fraction used by the default weight function.
+ */
+static float weight_limit_fraction_get(const size_t input_size, const size_t output_size)
+{
+  const float beta = 0.65f;
+  const float gamma = 1.5f;
+  float ratio = float(output_size) / float(input_size);
+  return (1.0f - std::pow(ratio, gamma)) * beta;
+}
+
 static void weighted_sample_elimination(Vector<float3> const *input_points,
                                         Vector<float3> *output_points,
                                         const float maximum_distance,
                                         const float3 boundbox)
 {
+  const size_t minimum_distance = maximum_distance *
+                                  weight_limit_fraction_get(input_points->size(),
+                                                            output_points->size());
+
   void *kd_tree = BLI_kdtree_3d_new(input_points->size());
   {
     std::vector<float3> tiled_points(input_points->data(),
@@ -171,12 +183,25 @@ static void weighted_sample_elimination(Vector<float3> const *input_points,
     }
     BLI_kdtree_3d_balance((KDTree_3d *)kd_tree);
   }
+#else
+  UNUSED_VARS(boundbox);
+  for (size_t i = 0; i < input_points->size(); i++) {
+    BLI_kdtree_3d_insert((KDTree_3d *)kd_tree, i, input_points->data()[i]);
+  }
+  BLI_kdtree_3d_balance((KDTree_3d *)kd_tree);
+#endif
 
   /* Assign weights to each sample. */
   std::vector<float> weights(input_points->size(), 0.0f);
   for (size_t point_id = 0; point_id < weights.size(); point_id++) {
-    points_distance_weight_calculate(
-        &weights, point_id, input_points, kd_tree, maximum_distance, boundbox, nullptr, nullptr);
+    points_distance_weight_calculate(&weights,
+                                     point_id,
+                                     input_points,
+                                     kd_tree,
+                                     minimum_distance,
+                                     maximum_distance,
+                                     nullptr,
+                                     nullptr);
   }
 
   /* Remove the points based on their weight. */
@@ -193,8 +218,14 @@ static void weighted_sample_elimination(Vector<float3> const *input_points,
     size_t point_id = POINTER_AS_INT(BLI_heap_pop_min(heap));
     nodes[point_id] = nullptr;
 
-    points_distance_weight_calculate(
-        &weights, point_id, input_points, kd_tree, maximum_distance, boundbox, heap, &nodes);
+    points_distance_weight_calculate(&weights,
+                                     point_id,
+                                     input_points,
+                                     kd_tree,
+                                     minimum_distance,
+                                     maximum_distance,
+                                     heap,
+                                     &nodes);
 
     sample_size--;
   }



More information about the Bf-blender-cvs mailing list