[Bf-blender-cvs] [ceb54718840] functions: improve Random Vector node

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


Commit: ceb5471884011b860b228490d2ca04339ed47b18
Author: Jacques Lucke
Date:   Wed Dec 18 12:11:02 2019 +0100
Branches: functions
https://developer.blender.org/rBceb5471884011b860b228490d2ca04339ed47b18

improve Random Vector node

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

M	release/scripts/startup/nodes/function_nodes/noise.py
M	source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
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 c2c9ed64c4b..4c7dbb78bc2 100644
--- a/release/scripts/startup/nodes/function_nodes/noise.py
+++ b/release/scripts/startup/nodes/function_nodes/noise.py
@@ -65,6 +65,10 @@ class RandomFloatsNode(bpy.types.Node, FunctionNode):
     def duplicate(self, src_node):
         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),
+]
 
 class RandomVectorNode(bpy.types.Node, FunctionNode):
     bl_idname = "fn_RandomVectorNode"
@@ -74,13 +78,25 @@ class RandomVectorNode(bpy.types.Node, FunctionNode):
         name="Node Seed",
     )
 
+    mode: EnumProperty(
+        name="Mode",
+        items=random_vector_mode_items,
+        default="UNIFORM_IN_CUBE",
+    )
+
+    use_list__factor: NodeBuilder.VectorizedProperty()
+    use_list__seed: NodeBuilder.VectorizedProperty()
+
     def init_props(self):
         self.node_seed = new_node_seed()
 
     def declaration(self, builder: NodeBuilder):
-        builder.fixed_input("amplitude", "Amplitude", "Vector", default=(1, 1, 1))
-        builder.fixed_input("seed", "Seed", "Integer")
-        builder.fixed_output("vector", "Vector", "Vector")
+        builder.vectorized_input("factor", "use_list__factor", "Factor", "Factors", "Vector", default=(1, 1, 1))
+        builder.vectorized_input("seed", "use_list__seed", "Seed", "Seeds", "Integer")
+        builder.vectorized_output("vector", ["use_list__factor", "use_list__seed"], "Vector", "Vectors", "Vector")
+
+    def draw(self, layout):
+        layout.prop(self, "mode", text="")
 
     def draw_advanced(self, layout):
         layout.prop(self, "node_seed")
@@ -88,6 +104,5 @@ class RandomVectorNode(bpy.types.Node, FunctionNode):
     def duplicate(self, src_node):
         self.node_seed = new_node_seed()
 
-
 def new_node_seed():
     return random.randint(0, 10000)
diff --git a/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc b/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
index 2ccc6515f3f..034025d9243 100644
--- a/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
+++ b/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
@@ -480,7 +480,9 @@ static void INSERT_random_floats(VNodeMFNetworkBuilder &builder)
 static void INSERT_random_vector(VNodeMFNetworkBuilder &builder)
 {
   uint node_seed = (uint)RNA_int_get(builder.rna(), "node_seed");
-  builder.set_constructed_matching_fn<MF_RandomVector>(node_seed);
+  RandomVectorMode::Enum mode = (RandomVectorMode::Enum)RNA_enum_get(builder.rna(), "mode");
+  builder.set_vectorized_constructed_matching_fn<MF_RandomVector>(
+      {"use_list__factor", "use_list__seed"}, node_seed, mode);
 }
 
 static void INSERT_value(VNodeMFNetworkBuilder &builder)
diff --git a/source/blender/functions/intern/multi_functions/mixed.cc b/source/blender/functions/intern/multi_functions/mixed.cc
index a0c11f5f5c1..722fc123411 100644
--- a/source/blender/functions/intern/multi_functions/mixed.cc
+++ b/source/blender/functions/intern/multi_functions/mixed.cc
@@ -599,29 +599,50 @@ void MF_RandomFloats::call(MFMask mask, MFParams params, MFContext UNUSED(contex
   BLI_rng_free(rng);
 }
 
-MF_RandomVector::MF_RandomVector(uint seed) : m_seed(seed * 56242361)
+MF_RandomVector::MF_RandomVector(uint seed, RandomVectorMode::Enum mode)
+    : m_seed(seed * 56242361), m_mode(mode)
 {
   MFSignatureBuilder signature = this->get_builder("Random Vector");
-  signature.single_input<float3>("Amplitude");
+  signature.single_input<float3>("Factor");
   signature.single_input<int>("Seed");
   signature.single_output<float3>("Vector");
 }
 
 void MF_RandomVector::call(MFMask mask, MFParams params, MFContext UNUSED(context)) const
 {
-  VirtualListRef<float3> amplitudes = params.readonly_single_input<float3>(0, "Amplitude");
+  VirtualListRef<float3> factors = params.readonly_single_input<float3>(0, "Factor");
   VirtualListRef<int> seeds = params.readonly_single_input<int>(1, "Seed");
   MutableArrayRef<float3> r_vectors = params.uninitialized_single_output<float3>(2, "Vector");
 
-  for (uint i : mask.indices()) {
-    uint seed = seeds[i] ^ m_seed;
-    float x = BLI_hash_int_01(seed * 4521341) - 0.5f;
-    float y = BLI_hash_int_01(seed * 4623413) - 0.5f;
-    float z = BLI_hash_int_01(seed * 7826313) - 0.5f;
-    float3 amplitude = amplitudes[i];
-    float3 vector = float3(x, y, z) * amplitude;
-    r_vectors[i] = vector;
+  RNG *rng = BLI_rng_new(0);
+
+  switch (m_mode) {
+    case RandomVectorMode::SampleInCube: {
+      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;
+      }
+      break;
+    }
+    case RandomVectorMode::SampleOnSphere: {
+      for (uint i : mask.indices()) {
+        uint seed = seeds[i] ^ m_seed;
+        BLI_rng_srandom(rng, seed);
+        float3 vector;
+        BLI_rng_get_float_unit_v3(rng, vector);
+        r_vectors[i] = vector * factors[i];
+      }
+      break;
+    }
   }
+
+  BLI_rng_free(rng);
 }
 
 MF_FindNonClosePoints::MF_FindNonClosePoints()
diff --git a/source/blender/functions/intern/multi_functions/mixed.h b/source/blender/functions/intern/multi_functions/mixed.h
index 19ed8912990..2c36de698b7 100644
--- a/source/blender/functions/intern/multi_functions/mixed.h
+++ b/source/blender/functions/intern/multi_functions/mixed.h
@@ -78,12 +78,20 @@ class MF_RandomFloats final : public MultiFunction {
   void call(MFMask mask, MFParams parms, MFContext context) const override;
 };
 
+namespace RandomVectorMode {
+enum Enum {
+  SampleInCube,
+  SampleOnSphere,
+};
+}
+
 class MF_RandomVector final : public MultiFunction {
  private:
   uint m_seed;
+  RandomVectorMode::Enum m_mode;
 
  public:
-  MF_RandomVector(uint seed);
+  MF_RandomVector(uint seed, RandomVectorMode::Enum mode);
   void call(MFMask mask, MFParams parms, MFContext context) const override;
 };



More information about the Bf-blender-cvs mailing list