[Bf-blender-cvs] [5fc8222] object_nodes: Basic randomization node, producing PRNG values based on either int or float input.

Lukas Tönne noreply at git.blender.org
Thu Dec 10 09:41:36 CET 2015


Commit: 5fc8222babe60b218b854b4651814c84c0a23983
Author: Lukas Tönne
Date:   Thu Dec 10 09:40:50 2015 +0100
Branches: object_nodes
https://developer.blender.org/rB5fc8222babe60b218b854b4651814c84c0a23983

Basic randomization node, producing PRNG values based on either int or float input.

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

M	release/scripts/nodes/common_nodes.py
M	release/scripts/nodes/geometry_nodes.py
M	source/blender/blenlib/BLI_rand.h
M	source/blender/blenlib/intern/rand.c
M	source/blender/blenvm/bvm/bvm_eval.cc
M	source/blender/blenvm/bvm/bvm_eval_math.h
M	source/blender/blenvm/bvm/bvm_opcode.h
M	source/blender/blenvm/compile/bvm_nodegraph.cc

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

diff --git a/release/scripts/nodes/common_nodes.py b/release/scripts/nodes/common_nodes.py
index 4fa8d50..810bcac 100644
--- a/release/scripts/nodes/common_nodes.py
+++ b/release/scripts/nodes/common_nodes.py
@@ -439,6 +439,52 @@ class GetScaleNode(CommonNodeBase, ObjectNode):
         compiler.map_output(0, node.outputs[0])
 
 
+class RandomNode(CommonNodeBase, ObjectNode):
+    '''Produce random values'''
+    bl_idname = 'ObjectRandomNode'
+    bl_label = 'Random'
+
+    def _enable_input(self, index):
+        for i, s in enumerate(self.inputs):
+            s.enabled = (i == index)
+
+    seed = IntProperty(name="Seed", default=0, subtype='UNSIGNED')
+
+    _mode_items = [
+        ('INT', 'Integer', 'Use integer input', 0, 0),
+        ('FLOAT', 'Float', 'Use floating point input', 0, 1),
+        ]
+    def _mode_update(self, context):
+        if self.mode == 'INT':
+            self._enable_input(0)
+        elif self.mode == 'FLOAT':
+            self._enable_input(1)
+    mode = EnumProperty(name="Mode", description="Type of input value", items=_mode_items,
+                        default='INT', update=_mode_update)
+
+    def draw_buttons(self, context, layout):
+        layout.prop(self, "mode")
+        layout.prop(self, "seed")
+
+    def init(self, context):
+        self.inputs.new('NodeSocketInt', "Value")
+        self.inputs.new('NodeSocketFloat', "Value")
+        self.outputs.new('NodeSocketInt', "Random")
+        self.outputs.new('NodeSocketFloat', "Random")
+        self._enable_input(0)
+
+    def compile(self, compiler):
+        if self.mode == 'INT':
+            node = compiler.add_node("INT_TO_RANDOM")
+            compiler.map_input(0, node.inputs[1])
+        elif self.mode == 'FLOAT':
+            node = compiler.add_node("FLOAT_TO_RANDOM")
+            compiler.map_input(1, node.inputs[1])
+        node.inputs[0].set_value(self.seed)
+        compiler.map_output(0, node.outputs[0])
+        compiler.map_output(1, node.outputs[1])
+
+
 class TextureCloudsNode(CommonNodeBase, ObjectNode):
     '''Clouds texture'''
     bl_idname = 'ObjectTextureCloudsNode'
@@ -509,7 +555,7 @@ class TextureVoronoiNode(CommonNodeBase, ObjectNode):
         compiler.map_input(0, node_scale.inputs[0])
         compiler.map_input(1, node_scale.inputs[1])
         compiler.link(node_scale.outputs[0], node.inputs["position"])
-        
+
         compiler.map_input(2, node.inputs["minkowski_exponent"])
         compiler.map_input(3, node.inputs["w1"])
         compiler.map_input(4, node.inputs["w2"])
diff --git a/release/scripts/nodes/geometry_nodes.py b/release/scripts/nodes/geometry_nodes.py
index 13ec2c3..b998a97 100644
--- a/release/scripts/nodes/geometry_nodes.py
+++ b/release/scripts/nodes/geometry_nodes.py
@@ -268,6 +268,7 @@ def register():
             NodeItem("ObjectGetEulerNode"),
             NodeItem("ObjectGetAxisAngleNode"),
             NodeItem("ObjectGetScaleNode"),
+            NodeItem("ObjectRandomNode"),
             ]),
         GeometryNodeCategory("GEO_TEXTURE", "Texture", items=[
             NodeItem("ObjectTextureCloudsNode"),
diff --git a/source/blender/blenlib/BLI_rand.h b/source/blender/blenlib/BLI_rand.h
index 7b84ddd..c86c9ae 100644
--- a/source/blender/blenlib/BLI_rand.h
+++ b/source/blender/blenlib/BLI_rand.h
@@ -74,6 +74,7 @@ float   BLI_frand(void) ATTR_WARN_UNUSED_RESULT;
 void    BLI_frand_unit_v3(float v[3]);
 
 /** Return a pseudo-random (hash) float from an integer value */
+int		BLI_hash_rand(unsigned int seed) ATTR_WARN_UNUSED_RESULT;
 float	BLI_hash_frand(unsigned int seed) ATTR_WARN_UNUSED_RESULT;
 
 /** Shuffle an array randomly using the given seed.
diff --git a/source/blender/blenlib/intern/rand.c b/source/blender/blenlib/intern/rand.c
index 66c568a..1b42ab7 100644
--- a/source/blender/blenlib/intern/rand.c
+++ b/source/blender/blenlib/intern/rand.c
@@ -245,6 +245,14 @@ void BLI_frand_unit_v3(float v[3])
 	BLI_rng_get_float_unit_v3(&theBLI_rng, v);
 }
 
+int BLI_hash_rand(unsigned int seed)
+{
+	RNG rng;
+
+	BLI_rng_srandom(&rng, seed);
+	return BLI_rng_get_int(&rng);
+}
+
 float BLI_hash_frand(unsigned int seed)
 {
 	RNG rng;
diff --git a/source/blender/blenvm/bvm/bvm_eval.cc b/source/blender/blenvm/bvm/bvm_eval.cc
index 9787110..62bfe1f 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -664,7 +664,24 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const Function *
 				eval_op_mix_rgb(stack, mode, offset_col_a, offset_col_b, offset_fac, offset_r);
 				break;
 			}
-				
+			
+			case OP_INT_TO_RANDOM: {
+				int seed = fn->read_int(&instr);
+				StackIndex offset = fn->read_stack_index(&instr);
+				StackIndex offset_irandom = fn->read_stack_index(&instr);
+				StackIndex offset_frandom = fn->read_stack_index(&instr);
+				eval_op_int_to_random(stack, (uint64_t)seed, offset, offset_irandom, offset_frandom);
+				break;
+			}
+			case OP_FLOAT_TO_RANDOM: {
+				int seed = fn->read_int(&instr);
+				StackIndex offset = fn->read_stack_index(&instr);
+				StackIndex offset_irandom = fn->read_stack_index(&instr);
+				StackIndex offset_frandom = fn->read_stack_index(&instr);
+				eval_op_float_to_random(stack, (uint64_t)seed, offset, offset_irandom, offset_frandom);
+				break;
+			}
+			
 			case OP_TEX_PROC_VORONOI: {
 				int distance_metric = fn->read_int(&instr);
 				int color_type = fn->read_int(&instr);
diff --git a/source/blender/blenvm/bvm/bvm_eval_math.h b/source/blender/blenvm/bvm/bvm_eval_math.h
index bf8a1f2..fa1e640 100644
--- a/source/blender/blenvm/bvm/bvm_eval_math.h
+++ b/source/blender/blenvm/bvm/bvm_eval_math.h
@@ -34,10 +34,12 @@
 
 extern "C" {
 #include "BLI_math.h"
+#include "BLI_rand.h"
 }
 
 #include "bvm_eval_common.h"
 
+#include "bvm_util_hash.h"
 #include "bvm_util_math.h"
 
 namespace bvm {
@@ -418,6 +420,28 @@ static void eval_op_mul_matrix44_float4(float *stack, StackIndex offset_a, Stack
 	stack_store_float4(stack, offset_r, r);
 }
 
+static void eval_op_int_to_random(float *stack, uint64_t seed, StackIndex offset, StackIndex offset_irandom, StackIndex offset_frandom)
+{
+	union { uint32_t u; int x; } c;
+	c.x = stack_load_int(stack, offset);
+	
+	uint32_t r = BLI_hash_rand(hash_combine(c.u, seed));
+	
+	stack_store_int(stack, offset_irandom, (int)r);
+	stack_store_float(stack, offset_frandom, (float)r / (0xFFFFFFFF));
+}
+
+static void eval_op_float_to_random(float *stack, uint64_t seed, StackIndex offset, StackIndex offset_irandom, StackIndex offset_frandom)
+{
+	union { uint32_t u; float x; } c;
+	c.x = stack_load_float(stack, offset);
+	
+	uint32_t r = BLI_hash_rand(hash_combine(c.u, seed));
+	
+	stack_store_int(stack, offset_irandom, (int)r);
+	stack_store_float(stack, offset_frandom, (float)r / (0xFFFFFFFF));
+}
+
 } /* namespace bvm */
 
 #endif /* __BVM_EVAL_MATH_H__ */
diff --git a/source/blender/blenvm/bvm/bvm_opcode.h b/source/blender/blenvm/bvm/bvm_opcode.h
index 3d4996c..d3dc35b 100644
--- a/source/blender/blenvm/bvm/bvm_opcode.h
+++ b/source/blender/blenvm/bvm/bvm_opcode.h
@@ -109,6 +109,9 @@ enum OpCode {
 	
 	OP_MIX_RGB,
 	
+	OP_INT_TO_RANDOM,
+	OP_FLOAT_TO_RANDOM,
+	
 	OP_TEX_PROC_VORONOI,
 	OP_TEX_PROC_BLEND,
 	OP_TEX_PROC_MAGIC,
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.cc b/source/blender/blenvm/compile/bvm_nodegraph.cc
index 4089c39..f05bcf8 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.cc
+++ b/source/blender/blenvm/compile/bvm_nodegraph.cc
@@ -1134,6 +1134,9 @@ OpCode get_opcode_from_node_type(const string &node)
 	
 	NODETYPE(MIX_RGB);
 	
+	NODETYPE(INT_TO_RANDOM);
+	NODETYPE(FLOAT_TO_RANDOM);
+	
 	NODETYPE(TEX_PROC_VORONOI);
 	NODETYPE(TEX_PROC_CLOUDS);
 	
@@ -1356,6 +1359,18 @@ static void register_opcode_node_types()
 	nt->add_input("color2", BVM_FLOAT4, float4(0.0f, 0.0f, 0.0f, 1.0f));
 	nt->add_output("color", BVM_FLOAT4);
 	
+	nt = NodeGraph::add_function_node_type("INT_TO_RANDOM");
+	nt->add_input("seed", BVM_INT, 0, INPUT_CONSTANT);
+	nt->add_input("value", BVM_INT, 0);
+	nt->add_output("irandom", BVM_INT);
+	nt->add_output("frandom", BVM_FLOAT);
+	
+	nt = NodeGraph::add_function_node_type("FLOAT_TO_RANDOM");
+	nt->add_input("seed", BVM_INT, 0, INPUT_CONSTANT);
+	nt->add_input("value", BVM_FLOAT, 0);
+	nt->add_output("irandom", BVM_INT);
+	nt->add_output("frandom", BVM_FLOAT);
+	
 	nt = NodeGraph::add_function_node_type("TEX_PROC_VORONOI");
 	nt->add_input("distance_metric", BVM_INT, 0, INPUT_CONSTANT);
 	nt->add_input("color_type", BVM_INT, 0, INPUT_CONSTANT);




More information about the Bf-blender-cvs mailing list