[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