[Bf-blender-cvs] [4c5332cae70] functions: new Random Vectors node
Jacques Lucke
noreply at git.blender.org
Wed Dec 18 13:53:40 CET 2019
Commit: 4c5332cae7024eb3594b09c2b001cc30652a8527
Author: Jacques Lucke
Date: Wed Dec 18 12:31:19 2019 +0100
Branches: functions
https://developer.blender.org/rB4c5332cae7024eb3594b09c2b001cc30652a8527
new Random Vectors node
===================================================================
M release/scripts/startup/nodes/function_nodes/noise.py
M source/blender/blenlib/BLI_math_cxx.h
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 4c7dbb78bc2..b438ea88efa 100644
--- a/release/scripts/startup/nodes/function_nodes/noise.py
+++ b/release/scripts/startup/nodes/function_nodes/noise.py
@@ -104,5 +104,39 @@ class RandomVectorNode(bpy.types.Node, FunctionNode):
def duplicate(self, src_node):
self.node_seed = new_node_seed()
+
+class RandomVectorsNode(bpy.types.Node, FunctionNode):
+ bl_idname = "fn_RandomVectorsNode"
+ bl_label = "Random Vectors"
+
+ node_seed: IntProperty(
+ name="Node Seed",
+ )
+
+ mode: EnumProperty(
+ name="Mode",
+ items=random_vector_mode_items,
+ default="UNIFORM_IN_CUBE",
+ )
+
+ def init_props(self):
+ self.node_seed = new_node_seed()
+
+ def declaration(self, builder: NodeBuilder):
+ builder.fixed_input("amount", "Amount", "Integer", default=10)
+ builder.fixed_input("factor", "Factor", "Vector", default=(1, 1, 1))
+ builder.fixed_input("seed", "Seed", "Integer")
+ builder.fixed_output("vectors", "Vectors", "Vector List")
+
+ def draw(self, layout):
+ layout.prop(self, "mode", text="")
+
+ def draw_advanced(self, layout):
+ layout.prop(self, "node_seed")
+
+ 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/blenlib/BLI_math_cxx.h b/source/blender/blenlib/BLI_math_cxx.h
index 0c10a87665d..f5fdae2d0be 100644
--- a/source/blender/blenlib/BLI_math_cxx.h
+++ b/source/blender/blenlib/BLI_math_cxx.h
@@ -225,6 +225,13 @@ struct float3 {
this->z *= scalar;
}
+ void operator*=(float3 other)
+ {
+ this->x *= other.x;
+ this->y *= other.y;
+ this->z *= other.z;
+ }
+
friend float3 operator*(float3 a, float3 b)
{
return {a.x * b.x, a.y * b.y, a.z * b.z};
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 034025d9243..03296564076 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
@@ -485,6 +485,13 @@ static void INSERT_random_vector(VNodeMFNetworkBuilder &builder)
{"use_list__factor", "use_list__seed"}, node_seed, mode);
}
+static void INSERT_random_vectors(VNodeMFNetworkBuilder &builder)
+{
+ uint node_seed = (uint)RNA_int_get(builder.rna(), "node_seed");
+ RandomVectorMode::Enum mode = (RandomVectorMode::Enum)RNA_enum_get(builder.rna(), "mode");
+ builder.set_constructed_matching_fn<MF_RandomVectors>(node_seed, mode);
+}
+
static void INSERT_value(VNodeMFNetworkBuilder &builder)
{
const XOutputSocket &xsocket = builder.xnode().output(0);
@@ -551,6 +558,7 @@ void add_inlined_tree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
mappings.xnode_inserters.add_new("fn_RandomFloatNode", INSERT_random_float);
mappings.xnode_inserters.add_new("fn_RandomFloatsNode", INSERT_random_floats);
mappings.xnode_inserters.add_new("fn_RandomVectorNode", INSERT_random_vector);
+ mappings.xnode_inserters.add_new("fn_RandomVectorsNode", INSERT_random_vectors);
mappings.xnode_inserters.add_new("fn_ValueNode", INSERT_value);
mappings.xnode_inserters.add_new("fn_EmitterTimeInfoNode", INSERT_emitter_time_info);
mappings.xnode_inserters.add_new("fn_SampleObjectSurfaceNode", INSERT_sample_object_surface);
diff --git a/source/blender/functions/intern/multi_functions/mixed.cc b/source/blender/functions/intern/multi_functions/mixed.cc
index 722fc123411..6ee1684001b 100644
--- a/source/blender/functions/intern/multi_functions/mixed.cc
+++ b/source/blender/functions/intern/multi_functions/mixed.cc
@@ -585,7 +585,8 @@ void MF_RandomFloats::call(MFMask mask, MFParams params, MFContext UNUSED(contex
RNG *rng = BLI_rng_new(0);
for (uint i : mask.indices()) {
- MutableArrayRef<float> r_array = r_values.allocate(i, amounts[i]);
+ uint amount = std::max<int>(0, amounts[i]);
+ MutableArrayRef<float> r_array = r_values.allocate(i, amount);
BLI_rng_srandom(rng, seeds[i] + m_seed);
float range = max_values[i] - min_values[i];
@@ -645,6 +646,63 @@ void MF_RandomVector::call(MFMask mask, MFParams params, MFContext UNUSED(contex
BLI_rng_free(rng);
}
+MF_RandomVectors::MF_RandomVectors(uint seed, RandomVectorMode::Enum mode)
+ : m_seed(seed * 45621347), m_mode(mode)
+{
+ MFSignatureBuilder signature = this->get_builder("Random Vectors");
+ signature.single_input<int>("Amount");
+ signature.single_input<float3>("Factor");
+ signature.single_input<int>("Seed");
+ signature.vector_output<float3>("Vectors");
+}
+
+void MF_RandomVectors::call(MFMask mask, MFParams params, MFContext UNUSED(context)) const
+{
+ VirtualListRef<int> amounts = params.readonly_single_input<int>(0, "Amount");
+ VirtualListRef<float3> factors = params.readonly_single_input<float3>(1, "Factor");
+ VirtualListRef<int> seeds = params.readonly_single_input<int>(2, "Seed");
+ GenericVectorArray::MutableTypedRef<float3> r_vectors_array = params.vector_output<float3>(
+ 3, "Vectors");
+
+ RNG *rng = BLI_rng_new(0);
+
+ for (uint index : mask.indices()) {
+ uint amount = std::max<int>(0, amounts[index]);
+ float3 factor = factors[index];
+ uint seed = seeds[index] ^ m_seed;
+
+ MutableArrayRef<float3> r_vectors = r_vectors_array.allocate(index, amount);
+
+ BLI_rng_srandom(rng, seed);
+
+ switch (m_mode) {
+ case RandomVectorMode::SampleInCube: {
+ 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};
+ }
+ break;
+ }
+ case RandomVectorMode::SampleOnSphere: {
+ for (uint i : IndexRange(amount)) {
+ float3 vector;
+ BLI_rng_get_float_unit_v3(rng, vector);
+ r_vectors[i] = vector;
+ }
+ break;
+ }
+ }
+
+ for (float3 &vector : r_vectors) {
+ vector *= factor;
+ }
+ }
+
+ BLI_rng_free(rng);
+}
+
MF_FindNonClosePoints::MF_FindNonClosePoints()
{
MFSignatureBuilder signature = this->get_builder("Remove Close Points");
diff --git a/source/blender/functions/intern/multi_functions/mixed.h b/source/blender/functions/intern/multi_functions/mixed.h
index 2c36de698b7..89b73faf634 100644
--- a/source/blender/functions/intern/multi_functions/mixed.h
+++ b/source/blender/functions/intern/multi_functions/mixed.h
@@ -66,7 +66,7 @@ class MF_RandomFloat final : public MultiFunction {
public:
MF_RandomFloat(uint seed);
- void call(MFMask mask, MFParams parms, MFContext context) const override;
+ void call(MFMask mask, MFParams params, MFContext context) const override;
};
class MF_RandomFloats final : public MultiFunction {
@@ -75,7 +75,7 @@ class MF_RandomFloats final : public MultiFunction {
public:
MF_RandomFloats(uint seed);
- void call(MFMask mask, MFParams parms, MFContext context) const override;
+ void call(MFMask mask, MFParams params, MFContext context) const override;
};
namespace RandomVectorMode {
@@ -92,7 +92,17 @@ class MF_RandomVector final : public MultiFunction {
public:
MF_RandomVector(uint seed, RandomVectorMode::Enum mode);
- void call(MFMask mask, MFParams parms, MFContext context) const override;
+ void call(MFMask mask, MFParams params, MFContext context) const override;
+};
+
+class MF_RandomVectors final : public MultiFunction {
+ private:
+ uint m_seed;
+ RandomVectorMode::Enum m_mode;
+
+ public:
+ MF_RandomVectors(uint seed, RandomVectorMode::Enum mode);
+ void call(MFMask mask, MFParams params, MFContext context) const override;
};
class MF_ContextVertexPosition final : public MultiFunction {
More information about the Bf-blender-cvs
mailing list