[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