Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r--source/blender/blenlib/BLI_rand.h2
-rw-r--r--source/blender/blenlib/intern/rand.c21
2 files changed, 23 insertions, 0 deletions
diff --git a/source/blender/blenlib/BLI_rand.h b/source/blender/blenlib/BLI_rand.h
index 378beff3aa0..20d5f8d8abf 100644
--- a/source/blender/blenlib/BLI_rand.h
+++ b/source/blender/blenlib/BLI_rand.h
@@ -49,6 +49,7 @@ void BLI_rng_srandom(struct RNG *rng, unsigned int seed);
int BLI_rng_get_int(struct RNG *rng);
double BLI_rng_get_double(struct RNG *rng);
float BLI_rng_get_float(struct RNG *rng);
+void BLI_rng_get_float_unit_v3(struct RNG *rng, float v[3]);
void BLI_rng_shuffle_array(struct RNG *rng, void *data, int elemSize, int numElems);
/** Note that skipping is as slow as generating n numbers! */
@@ -62,6 +63,7 @@ int BLI_rand(void);
/** Return a pseudo-random number N where 0.0f<=N<1.0f */
float BLI_frand(void);
+void BLI_frand_unit_v3(float v[3]);
/** Return a pseudo-random (hash) float from an integer value */
float BLI_hash_frand(unsigned int seed);
diff --git a/source/blender/blenlib/intern/rand.c b/source/blender/blenlib/intern/rand.c
index c5b58e5a61b..f6f7c6e2486 100644
--- a/source/blender/blenlib/intern/rand.c
+++ b/source/blender/blenlib/intern/rand.c
@@ -32,6 +32,7 @@
#include <stdlib.h>
#include <string.h>
+#include <math.h>
#include "MEM_guardedalloc.h"
@@ -117,6 +118,21 @@ float BLI_rng_get_float(RNG *rng)
return (float) BLI_rng_get_int(rng) / 0x80000000;
}
+void BLI_rng_get_float_unit_v3(RNG *rng, float v[3])
+{
+ float r;
+ v[2] = (2.0f * BLI_rng_get_float(rng)) - 1.0f;
+ if ((r = 1.0f - (v[2] * v[2])) > 0.0f) {
+ float a = (float)(M_PI * 2.0) * BLI_rng_get_float(rng);
+ r = sqrtf(r);
+ v[0] = r * cosf(a);
+ v[1] = r * sinf(a);
+ }
+ else {
+ v[2] = 1.0f;
+ }
+}
+
void BLI_rng_shuffle_array(RNG *rng, void *data, int elemSize, int numElems)
{
int i = numElems;
@@ -173,6 +189,11 @@ float BLI_frand(void)
return BLI_rng_get_float(&theBLI_rng);
}
+void BLI_frand_unit_v3(float v[3])
+{
+ return BLI_rng_get_float_unit_v3(&theBLI_rng, v);
+}
+
float BLI_hash_frand(unsigned int seed)
{
RNG rng;