Revision: 56073
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56073
Author:   blendix
Date:     2013-04-15 23:12:40 +0000 (Mon, 15 Apr 2013)
Log Message:
-----------
Random number generator: replace a bunch of usage of the global random number
generator with a local one. It's not thread safe and will not give repeatable
results, so in most cases it should not be used.

Also fixes #34992 where the noise texture of a displacement modifier was not
properly random in opengl animation render, because the seed got reset to a
fixed value by an unrelated function while for final render it changed each
frame.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_boids.h
    trunk/blender/source/blender/blenkernel/BKE_particle.h
    trunk/blender/source/blender/blenkernel/intern/anim.c
    trunk/blender/source/blender/blenkernel/intern/boids.c
    trunk/blender/source/blender/blenkernel/intern/effect.c
    trunk/blender/source/blender/blenkernel/intern/ocean.c
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/blenkernel/intern/smoke.c
    trunk/blender/source/blender/blenlib/BLI_rand.h
    trunk/blender/source/blender/blenlib/intern/jitter.c
    trunk/blender/source/blender/blenlib/intern/rand.c
    trunk/blender/source/blender/bmesh/operators/bmo_edgenet.c
    trunk/blender/source/blender/bmesh/operators/bmo_subdivide.c
    trunk/blender/source/blender/editors/curve/editcurve.c
    trunk/blender/source/blender/editors/gpencil/gpencil_edit.c
    trunk/blender/source/blender/editors/mesh/editmesh_knife.c
    trunk/blender/source/blender/editors/mesh/editmesh_select.c
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/editors/metaball/mball_edit.c
    trunk/blender/source/blender/editors/physics/particle_edit.c
    trunk/blender/source/blender/editors/transform/transform_generics.c
    trunk/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c
    trunk/blender/source/blender/modifiers/intern/MOD_explode.c
    trunk/blender/source/blender/modifiers/intern/MOD_particleinstance.c
    trunk/blender/source/blender/modifiers/intern/MOD_weightvg_util.c
    trunk/blender/source/blender/modifiers/intern/MOD_weightvg_util.h
    trunk/blender/source/blender/modifiers/intern/MOD_weightvgedit.c
    trunk/blender/source/blender/modifiers/intern/MOD_weightvgproximity.c
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/rayshade.c

Modified: trunk/blender/source/blender/blenkernel/BKE_boids.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_boids.h 2013-04-15 21:38:31 UTC 
(rev 56072)
+++ trunk/blender/source/blender/blenkernel/BKE_boids.h 2013-04-15 23:12:40 UTC 
(rev 56073)
@@ -36,6 +36,8 @@
 
 #include "DNA_boid_types.h"
 
+struct RNG;
+
 typedef struct BoidBrainData {
        struct ParticleSimulationData *sim;
        struct ParticleSettings *part;
@@ -47,6 +49,8 @@
        float goal_co[3];
        float goal_nor[3];
        float goal_priority;
+
+       struct RNG *rng;
 } BoidBrainData;
 
 void boids_precalc_rules(struct ParticleSettings *part, float cfra);

Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h      2013-04-15 
21:38:31 UTC (rev 56072)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h      2013-04-15 
23:12:40 UTC (rev 56073)
@@ -61,6 +61,7 @@
 struct BVHTreeRay;
 struct BVHTreeRayHit; 
 struct EdgeHash;
+struct RNG;
 
 #define PARTICLE_P              ParticleData * pa; int p
 #define LOOP_PARTICLES  for (p = 0, pa = psys->particles; p < psys->totpart; 
p++, pa++)
@@ -82,6 +83,7 @@
        struct ParticleSystem *psys;
        struct ParticleSystemModifierData *psmd;
        struct ListBase *colliders;
+       struct RNG *rng;
        /* Courant number. This is used to implement an adaptive time step. 
Only the
         * maximum value per time step is important. Only sph_integrate makes 
use of
         * this at the moment. Other solvers could, too. */

Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c       2013-04-15 
21:38:31 UTC (rev 56072)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c       2013-04-15 
23:12:40 UTC (rev 56073)
@@ -1263,6 +1263,7 @@
        ChildParticle *cpa = NULL;
        ParticleKey state;
        ParticleCacheKey *cache;
+       RNG *rng = NULL;
        float ctime, pa_time, scale = 1.0f;
        float tmat[4][4], mat[4][4], pamat[4][4], vec[3], size = 0.0;
        float (*obmat)[4], (*oldobmat)[4];
@@ -1293,14 +1294,9 @@
        totpart = psys->totpart;
        totchild = psys->totchild;
 
-       BLI_srandom(31415926 + psys->seed);
-
        if ((psys->renderdata || part->draw_as == PART_DRAW_REND) && 
ELEM(part->ren_as, PART_DRAW_OB, PART_DRAW_GR)) {
                ParticleSimulationData sim = {NULL};
-               sim.scene = scene;
-               sim.ob = par;
-               sim.psys = psys;
-               sim.psmd = psys_get_modifier(par, psys);
+
                /* make sure emitter imat is in global coordinates instead of 
render view coordinates */
                invert_m4_m4(par->imat, par->obmat);
 
@@ -1332,6 +1328,12 @@
 
                psys_check_group_weights(part);
 
+               sim.scene = scene;
+               sim.ob = par;
+               sim.psys = psys;
+               sim.psmd = psys_get_modifier(par, psys);
+               sim.rng = BLI_rng_new(0);
+
                psys->lattice = psys_get_lattice(&sim);
 
                /* gather list of objects or single object */
@@ -1378,6 +1380,8 @@
                        obcopy = *ob;
                }
 
+               rng = BLI_rng_new_srandom(31415926 + psys->seed);
+
                if (totchild == 0 || part->draw & PART_DRAW_PARENT)
                        a = 0;
                else
@@ -1417,7 +1421,7 @@
 
                                /* for groups, pick the object based on 
settings */
                                if (part->draw & PART_DRAW_RAND_GR)
-                                       b = BLI_rand() % totgroup;
+                                       b = BLI_rng_get_int(rng) % totgroup;
                                else
                                        b = a % totgroup;
 
@@ -1561,6 +1565,8 @@
                }
                else
                        *ob = obcopy;
+
+               BLI_rng_free(sim.rng);
        }
 
        /* clean up */
@@ -1573,6 +1579,9 @@
                end_latt_deform(psys->lattice);
                psys->lattice = NULL;
        }
+
+       if (rng)
+               BLI_rng_free(rng);
 }
 
 static Object *find_family_object(Object **obar, char *family, char ch)

Modified: trunk/blender/source/blender/blenkernel/intern/boids.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/boids.c      2013-04-15 
21:38:31 UTC (rev 56072)
+++ trunk/blender/source/blender/blenkernel/intern/boids.c      2013-04-15 
23:12:40 UTC (rev 56073)
@@ -234,9 +234,9 @@
                        if (dot_v3v3(col.pce.nor, pa->prev_state.ave) < -0.99f) 
{
                                /* don't know why, but uneven range [0.0, 1.0] 
*/
                                /* works much better than even [-1.0, 1.0] */
-                               bbd->wanted_co[0] = BLI_frand();
-                               bbd->wanted_co[1] = BLI_frand();
-                               bbd->wanted_co[2] = BLI_frand();
+                               bbd->wanted_co[0] = BLI_rng_get_float(bbd->rng);
+                               bbd->wanted_co[1] = BLI_rng_get_float(bbd->rng);
+                               bbd->wanted_co[2] = BLI_rng_get_float(bbd->rng);
                        }
                        else {
                                copy_v3_v3(bbd->wanted_co, col.pce.nor);
@@ -558,9 +558,9 @@
 
        if (asbr->wander > 0.0f) {
                /* abuse pa->r_ave for wandering */
-               bpa->wander[0] += asbr->wander * (-1.0f + 2.0f * BLI_frand());
-               bpa->wander[1] += asbr->wander * (-1.0f + 2.0f * BLI_frand());
-               bpa->wander[2] += asbr->wander * (-1.0f + 2.0f * BLI_frand());
+               bpa->wander[0] += asbr->wander * (-1.0f + 2.0f * 
BLI_rng_get_float(bbd->rng));
+               bpa->wander[1] += asbr->wander * (-1.0f + 2.0f * 
BLI_rng_get_float(bbd->rng));
+               bpa->wander[2] += asbr->wander * (-1.0f + 2.0f * 
BLI_rng_get_float(bbd->rng));
 
                normalize_v3(bpa->wander);
 
@@ -586,9 +586,9 @@
 
                /* may happen at birth */
                if (dot_v2v2(bbd->wanted_co, bbd->wanted_co)==0.0f) {
-                       bbd->wanted_co[0] = 2.0f*(0.5f - BLI_frand());
-                       bbd->wanted_co[1] = 2.0f*(0.5f - BLI_frand());
-                       bbd->wanted_co[2] = 2.0f*(0.5f - BLI_frand());
+                       bbd->wanted_co[0] = 2.0f*(0.5f - 
BLI_rng_get_float(bbd->rng));
+                       bbd->wanted_co[1] = 2.0f*(0.5f - 
BLI_rng_get_float(bbd->rng));
+                       bbd->wanted_co[2] = 2.0f*(0.5f - 
BLI_rng_get_float(bbd->rng));
                }
                
                /* leveling */
@@ -663,7 +663,7 @@
 
                /* attack if in range */
                if (closest_dist <= bbd->part->boids->range + pa->size + 
enemy_pa->size) {
-                       float damage = BLI_frand();
+                       float damage = BLI_rng_get_float(bbd->rng);
                        float enemy_dir[3];
 
                        normalize_v3_v3(enemy_dir, bbd->wanted_co);
@@ -1164,9 +1164,9 @@
                        /* choose random direction to turn if wanted velocity */
                        /* is directly behind regardless of z-coordinate */
                        if (dot_v2v2(old_dir2, wanted_dir2) < -0.99f) {
-                               wanted_dir[0] = 2.0f*(0.5f - BLI_frand());
-                               wanted_dir[1] = 2.0f*(0.5f - BLI_frand());
-                               wanted_dir[2] = 2.0f*(0.5f - BLI_frand());
+                               wanted_dir[0] = 2.0f*(0.5f - 
BLI_rng_get_float(bbd->rng));
+                               wanted_dir[1] = 2.0f*(0.5f - 
BLI_rng_get_float(bbd->rng));
+                               wanted_dir[2] = 2.0f*(0.5f - 
BLI_rng_get_float(bbd->rng));
                                normalize_v3(wanted_dir);
                        }
 

Modified: trunk/blender/source/blender/blenkernel/intern/effect.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/effect.c     2013-04-15 
21:38:31 UTC (rev 56072)
+++ trunk/blender/source/blender/blenkernel/intern/effect.c     2013-04-15 
23:12:40 UTC (rev 56073)
@@ -619,6 +619,7 @@
                        sim.scene= eff->scene;
                        sim.ob= eff->ob;
                        sim.psys= eff->psys;
+                       sim.rng= NULL;
 
                        /* TODO: time from actual previous calculated frame 
(step might not be 1) */
                        state.time = cfra - 1.0f;

Modified: trunk/blender/source/blender/blenkernel/intern/ocean.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/ocean.c      2013-04-15 
21:38:31 UTC (rev 56072)
+++ trunk/blender/source/blender/blenkernel/intern/ocean.c      2013-04-15 
23:12:40 UTC (rev 56073)
@@ -144,12 +144,12 @@
 
 
 
-static float nextfr(float min, float max)
+static float nextfr(RNG *rng, float min, float max)
 {
-       return BLI_frand() * (min - max) + max;
+       return BLI_rng_get_float(rng) * (min - max) + max;
 }
 
-static float gaussRand(void)
+static float gaussRand(RNG *rng)
 {
        /* Note: to avoid numerical problems with very small numbers, we make 
these variables singe-precision floats,
         * but later we call the double-precision log() and sqrt() functions 
instead of logf() and sqrtf().
@@ -765,6 +765,7 @@
                     float alignment, float depth, float time, short 
do_height_field, short do_chop, short do_normals,
                     short do_jacobian, int seed)
 {
+       RNG *rng;
        int i, j, ii;
 
        BLI_rw_mutex_lock(&o->oceanmutex, THREAD_LOCK_WRITE);
@@ -825,12 +826,12 @@
                        o->_k[i * (1 + o->_N / 2) + j] = sqrt(o->_kx[i] * 
o->_kx[i] + o->_kz[j] * o->_kz[j]);
 
        /*srand(seed);*/
-       BLI_srand(seed);
+       rng = BLI_rng_new(seed);
 
        for (i = 0; i < o->_M; ++i) {
                for (j = 0; j < o->_N; ++j) {
-                       float r1 = gaussRand();
-                       float r2 = gaussRand();
+                       float r1 = gaussRand(rng);
+                       float r2 = gaussRand(rng);
 
                        fftw_complex r1r2;
                        init_complex(r1r2, r1, r2);
@@ -890,6 +891,7 @@
 
        set_height_normalize_factor(o);
 
+       BLI_rng_free(rng);
 }
 
 void BKE_free_ocean_data(struct Ocean *oc)
@@ -1188,13 +1190,14 @@
        int res_x = och->resolution_x;
        int res_y = och->resolution_y;
        char string[FILE_MAX];
+       //RNG *rng;
 
        if (!o) return;
 
        if (o->_do_jacobian) prev_foam = MEM_callocN(res_x * res_y * 
sizeof(float), "previous frame foam bake data");
        else prev_foam = NULL;
 
-       BLI_srand(0);
+       //rng = BLI_rng_new(0);
 
        /* setup image format */
        imf.imtype = R_IMF_IMTYPE_OPENEXR;
@@ -1232,7 +1235,7 @@
                                                pr = prev_foam[res_x * y + x];
                                        }
 
-                                       /* r = BLI_frand(); */ /* UNUSED */ /* 
randomly reduce foam */
+                                       /* r = BLI_rng_get_float(rng); */ /* 
UNUSED */ /* randomly reduce foam */
 
                                        /* pr = pr * och->foam_fade; */         
/* overall fade */
 
@@ -1311,10 +1314,12 @@
 
                if (cancel) {
                        if (prev_foam) MEM_freeN(prev_foam);
+                       //BLI_rng_free(rng);
                        return;
                }
        }
 
+       //BLI_rng_free(rng);
        if (prev_foam) MEM_freeN(prev_foam);
        och->baked = 1;
 }

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c   2013-04-15 
21:38:31 UTC (rev 56072)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c   2013-04-15 
23:12:40 UTC (rev 56073)
@@ -264,11 +264,12 @@
 {
        int i;
        float *rand = psys->frand = MEM_callocN(PSYS_FRAND_COUNT * 
sizeof(float), "particle randoms");
+       RNG *rng = BLI_rng_new_srandom(psys->seed);
 
-       BLI_srandom(psys->seed);
+       for (i = 0; i < 1024; i++, rand++)
+               *rand = BLI_rng_get_float(rng);
 
-       for (i = 0; i < 1024; i++, rand++)
-               *rand = BLI_frand();
+       BLI_rng_free(rng);
 }
 int psys_check_enabled(Object *ob, ParticleSystem *psys)
 {
@@ -3302,8 +3303,11 @@
                sim.ob = ob;
                sim.psys = psys;
                sim.psmd = psys_get_modifier(ob, psys);
+               sim.rng = BLI_rng_new(0);
 
                psys_cache_child_paths(&sim, cfra, 1);
+
+               BLI_rng_free(sim.rng);
        }
 
        /* clear recalc flag if set here */

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to