[Bf-blender-cvs] [9fa91b87195] functions: support for sampling random vectors in a sphere

Jacques Lucke noreply at git.blender.org
Wed Dec 18 13:53:51 CET 2019


Commit: 9fa91b871956f471bb45f9741fef5f12b95cf3d1
Author: Jacques Lucke
Date:   Wed Dec 18 13:04:45 2019 +0100
Branches: functions
https://developer.blender.org/rB9fa91b871956f471bb45f9741fef5f12b95cf3d1

support for sampling random vectors in a sphere

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

M	release/scripts/startup/nodes/function_nodes/noise.py
M	source/blender/functions/intern/multi_functions/mixed.cc
M	source/blender/functions/intern/multi_functions/mixed.h

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

diff --git a/release/scripts/startup/nodes/function_nodes/noise.py b/release/scripts/startup/nodes/function_nodes/noise.py
index b438ea88efa..5be3becf899 100644
--- a/release/scripts/startup/nodes/function_nodes/noise.py
+++ b/release/scripts/startup/nodes/function_nodes/noise.py
@@ -66,8 +66,9 @@ class RandomFloatsNode(bpy.types.Node, FunctionNode):
         self.node_seed = new_node_seed()
 
 random_vector_mode_items = [
-    ("UNIFORM_IN_CUBE", "Uniform in Cube", "Generate a vector that is somewhere in a cube", "NONE", 0),
-    ("UNIFORM_ON_SPHERE", "Uniform on Sphere", "Generate a vector that is somehwere on the surface of a sphere", 1),
+    ("UNIFORM_IN_CUBE", "Uniform in Cube", "Generate a vector that is somewhere in the volume of a cube", "NONE", 0),
+    ("UNIFORM_ON_SPHERE", "Uniform on Sphere", "Generate a vector that is somewhere on the surface of a sphere", 1),
+    ("UNIFORM_IN_SPHERE", "Uniform in Sphere", "Generate a vector that is somewhere in the volume of a sphere", 2),
 ]
 
 class RandomVectorNode(bpy.types.Node, FunctionNode):
diff --git a/source/blender/functions/intern/multi_functions/mixed.cc b/source/blender/functions/intern/multi_functions/mixed.cc
index bef1d2bed5c..2ee45d2bc83 100644
--- a/source/blender/functions/intern/multi_functions/mixed.cc
+++ b/source/blender/functions/intern/multi_functions/mixed.cc
@@ -627,6 +627,19 @@ MF_RandomVector::MF_RandomVector(uint seed, RandomVectorMode::Enum mode)
   signature.single_output<float3>("Vector");
 }
 
+static float3 rng_get_float3_01(RNG *rng)
+{
+  float x = BLI_rng_get_float(rng);
+  float y = BLI_rng_get_float(rng);
+  float z = BLI_rng_get_float(rng);
+  return {x, y, z};
+}
+
+static float3 rng_get_float3_neg1_1(RNG *rng)
+{
+  return rng_get_float3_01(rng) * 2 - float3(1.0f, 1.0f, 1.0f);
+}
+
 void MF_RandomVector::call(MFMask mask, MFParams params, MFContext UNUSED(context)) const
 {
   VirtualListRef<float3> factors = params.readonly_single_input<float3>(0, "Factor");
@@ -636,20 +649,16 @@ void MF_RandomVector::call(MFMask mask, MFParams params, MFContext UNUSED(contex
   RNG *rng = BLI_rng_new(0);
 
   switch (m_mode) {
-    case RandomVectorMode::SampleInCube: {
+    case RandomVectorMode::UniformInCube: {
       for (uint i : mask.indices()) {
         uint seed = seeds[i] ^ m_seed;
         BLI_rng_srandom(rng, seed);
-        float x = BLI_rng_get_float(rng) - 0.5f;
-        float y = BLI_rng_get_float(rng) - 0.5f;
-        float z = BLI_rng_get_float(rng) - 0.5f;
-        float3 factor = factors[i];
-        float3 vector = float3(x, y, z) * factor;
-        r_vectors[i] = vector;
+        float3 vector = rng_get_float3_neg1_1(rng);
+        r_vectors[i] = vector * factors[i];
       }
       break;
     }
-    case RandomVectorMode::SampleOnSphere: {
+    case RandomVectorMode::UniformOnSphere: {
       for (uint i : mask.indices()) {
         uint seed = seeds[i] ^ m_seed;
         BLI_rng_srandom(rng, seed);
@@ -659,6 +668,18 @@ void MF_RandomVector::call(MFMask mask, MFParams params, MFContext UNUSED(contex
       }
       break;
     }
+    case RandomVectorMode::UniformInSphere: {
+      for (uint i : mask.indices()) {
+        uint seed = seeds[i] ^ m_seed;
+        BLI_rng_srandom(rng, seed);
+        float3 vector;
+        do {
+          vector = rng_get_float3_neg1_1(rng);
+        } while (vector.length_squared() >= 1.0f);
+        r_vectors[i] = vector * factors[i];
+      }
+      break;
+    }
   }
 
   BLI_rng_free(rng);
@@ -694,16 +715,14 @@ void MF_RandomVectors::call(MFMask mask, MFParams params, MFContext UNUSED(conte
     BLI_rng_srandom(rng, seed);
 
     switch (m_mode) {
-      case RandomVectorMode::SampleInCube: {
+      case RandomVectorMode::UniformInCube: {
         for (uint i : IndexRange(amount)) {
-          float x = BLI_rng_get_float(rng) - 0.5f;
-          float y = BLI_rng_get_float(rng) - 0.5f;
-          float z = BLI_rng_get_float(rng) - 0.5f;
-          r_vectors[i] = {x, y, z};
+          float3 vector = rng_get_float3_neg1_1(rng);
+          r_vectors[i] = vector;
         }
         break;
       }
-      case RandomVectorMode::SampleOnSphere: {
+      case RandomVectorMode::UniformOnSphere: {
         for (uint i : IndexRange(amount)) {
           float3 vector;
           BLI_rng_get_float_unit_v3(rng, vector);
@@ -711,6 +730,16 @@ void MF_RandomVectors::call(MFMask mask, MFParams params, MFContext UNUSED(conte
         }
         break;
       }
+      case RandomVectorMode::UniformInSphere: {
+        for (uint i : IndexRange(amount)) {
+          float3 vector;
+          do {
+            vector = rng_get_float3_neg1_1(rng);
+          } while (vector.length_squared() >= 1.0f);
+          r_vectors[i] = vector;
+        }
+        break;
+      }
     }
 
     for (float3 &vector : r_vectors) {
diff --git a/source/blender/functions/intern/multi_functions/mixed.h b/source/blender/functions/intern/multi_functions/mixed.h
index 479f1592fd1..29f290749f5 100644
--- a/source/blender/functions/intern/multi_functions/mixed.h
+++ b/source/blender/functions/intern/multi_functions/mixed.h
@@ -86,8 +86,9 @@ class MF_RandomFloats final : public MultiFunction {
 
 namespace RandomVectorMode {
 enum Enum {
-  SampleInCube,
-  SampleOnSphere,
+  UniformInCube,
+  UniformOnSphere,
+  UniformInSphere,
 };
 }



More information about the Bf-blender-cvs mailing list