forked from bartvdbraak/blender
BLI_rand: Add BLI_rng_get_float_unit_v3, was static rayshade func
This commit is contained in:
parent
a6e8137983
commit
faf529d036
@ -49,6 +49,7 @@ void BLI_rng_srandom(struct RNG *rng, unsigned int seed);
|
|||||||
int BLI_rng_get_int(struct RNG *rng);
|
int BLI_rng_get_int(struct RNG *rng);
|
||||||
double BLI_rng_get_double(struct RNG *rng);
|
double BLI_rng_get_double(struct RNG *rng);
|
||||||
float BLI_rng_get_float(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);
|
void BLI_rng_shuffle_array(struct RNG *rng, void *data, int elemSize, int numElems);
|
||||||
|
|
||||||
/** Note that skipping is as slow as generating n numbers! */
|
/** 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 */
|
/** Return a pseudo-random number N where 0.0f<=N<1.0f */
|
||||||
float BLI_frand(void);
|
float BLI_frand(void);
|
||||||
|
void BLI_frand_unit_v3(float v[3]);
|
||||||
|
|
||||||
/** Return a pseudo-random (hash) float from an integer value */
|
/** Return a pseudo-random (hash) float from an integer value */
|
||||||
float BLI_hash_frand(unsigned int seed);
|
float BLI_hash_frand(unsigned int seed);
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#include "MEM_guardedalloc.h"
|
#include "MEM_guardedalloc.h"
|
||||||
|
|
||||||
@ -117,6 +118,21 @@ float BLI_rng_get_float(RNG *rng)
|
|||||||
return (float) BLI_rng_get_int(rng) / 0x80000000;
|
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)
|
void BLI_rng_shuffle_array(RNG *rng, void *data, int elemSize, int numElems)
|
||||||
{
|
{
|
||||||
int i = numElems;
|
int i = numElems;
|
||||||
@ -173,6 +189,11 @@ float BLI_frand(void)
|
|||||||
return BLI_rng_get_float(&theBLI_rng);
|
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)
|
float BLI_hash_frand(unsigned int seed)
|
||||||
{
|
{
|
||||||
RNG rng;
|
RNG rng;
|
||||||
|
@ -1672,18 +1672,6 @@ static void ray_trace_shadow_tra(Isect *is, ShadeInput *origshi, int depth, int
|
|||||||
|
|
||||||
|
|
||||||
/* aolight: function to create random unit sphere vectors for total random sampling */
|
/* aolight: function to create random unit sphere vectors for total random sampling */
|
||||||
static void RandomSpherical(RNG *rng, float v[3])
|
|
||||||
{
|
|
||||||
float r;
|
|
||||||
v[2] = 2.f*BLI_rng_get_float(rng)-1.f;
|
|
||||||
if ((r = 1.f - v[2]*v[2])>0.f) {
|
|
||||||
float a = 6.283185307f*BLI_rng_get_float(rng);
|
|
||||||
r = sqrt(r);
|
|
||||||
v[0] = r * cosf(a);
|
|
||||||
v[1] = r * sinf(a);
|
|
||||||
}
|
|
||||||
else v[2] = 1.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* calc distributed spherical energy */
|
/* calc distributed spherical energy */
|
||||||
static void DS_energy(float *sphere, int tot, float vec[3])
|
static void DS_energy(float *sphere, int tot, float vec[3])
|
||||||
@ -1729,7 +1717,7 @@ void init_ao_sphere(World *wrld)
|
|||||||
/* init */
|
/* init */
|
||||||
fp= wrld->aosphere;
|
fp= wrld->aosphere;
|
||||||
for (a=0; a<tot; a++, fp+= 3) {
|
for (a=0; a<tot; a++, fp+= 3) {
|
||||||
RandomSpherical(rng, fp);
|
BLI_rng_get_float_unit_v3(rng, fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (iter--) {
|
while (iter--) {
|
||||||
@ -1780,7 +1768,7 @@ static float *sphere_sampler(int type, int resol, int thread, int xs, int ys, in
|
|||||||
|
|
||||||
vec= sphere;
|
vec= sphere;
|
||||||
for (a=0; a<tot; a++, vec+=3) {
|
for (a=0; a<tot; a++, vec+=3) {
|
||||||
RandomSpherical(rng, vec);
|
BLI_rng_get_float_unit_v3(rng, vec);
|
||||||
}
|
}
|
||||||
|
|
||||||
BLI_rng_free(rng);
|
BLI_rng_free(rng);
|
||||||
|
Loading…
Reference in New Issue
Block a user