BLI_rand : add BLI_halton_3D
authorClément Foucault <foucault.clem@gmail.com>
Tue, 24 Oct 2017 00:01:10 +0000 (02:01 +0200)
committerClément Foucault <foucault.clem@gmail.com>
Fri, 27 Oct 2017 20:49:15 +0000 (22:49 +0200)
source/blender/blenlib/BLI_rand.h
source/blender/blenlib/intern/rand.c

index 0ef971bf41f9edd49ec1a6e9073934f2c265926f..69b23b2473f79a1386e95d139be25366dfcbdfdc 100644 (file)
@@ -106,6 +106,7 @@ int   BLI_rng_thread_rand(RNG_THREAD_ARRAY *rngarr, int thread) ATTR_WARN_UNUSED
 /** Return the _n_th number of the given low-discrepancy sequence. */
 void BLI_halton_1D(unsigned int prime, double offset, int n, double *r);
 void BLI_halton_2D(unsigned int prime[2], double offset[2], int n, double *r);
+void BLI_halton_3D(unsigned int prime[3], double offset[3], int n, double *r);
 void BLI_hammersley_1D(unsigned int n, double *r);
 
 /** Return the whole low-discrepancy sequence up to _n_. */
index a501d38abb76664a2524f82582259005831ad9a7..9ab39dda9d0c2bc002d376d0f832748522aa575f 100644 (file)
@@ -402,6 +402,17 @@ void BLI_halton_2D(unsigned int prime[2], double offset[2], int n, double *r)
        }
 }
 
+void BLI_halton_3D(unsigned int prime[3], double offset[3], int n, double *r)
+{
+       const double invprimes[3] = {1.0 / (double)prime[0], 1.0 / (double)prime[1], 1.0 / (double)prime[2]};
+
+       for (int s = 0; s < n; s++) {
+               for (int i = 0; i < 3; i++) {
+                       r[i] = halton_ex(invprimes[i], &offset[i]);
+               }
+       }
+}
+
 void BLI_halton_2D_sequence(unsigned int prime[2], double offset[2], int n, double *r)
 {
        const double invprimes[2] = {1.0 / (double)prime[0], 1.0 / (double)prime[1]};