diff options
Diffstat (limited to 'source/blender/render/intern/source/render_texture.c')
-rw-r--r-- | source/blender/render/intern/source/render_texture.c | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c index ae01779e814..d9d1acf4efe 100644 --- a/source/blender/render/intern/source/render_texture.c +++ b/source/blender/render/intern/source/render_texture.c @@ -85,8 +85,19 @@ extern struct Render R; /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +static RNG_THREAD_ARRAY *random_tex_array; +void RE_init_texture_rng(void) +{ + random_tex_array = BLI_rng_threaded_new(); +} + +void RE_exit_texture_rng(void) +{ + BLI_rng_threaded_free(random_tex_array); +} + static void init_render_texture(Render *re, Tex *tex) { @@ -709,19 +720,22 @@ static float voronoiTex(Tex *tex, const float texvec[3], TexResult *texres) /* ------------------------------------------------------------------------- */ -static int texnoise(Tex *tex, TexResult *texres) +static int texnoise(Tex *tex, TexResult *texres, int thread) { float div=3.0; - int val, ran, loop; + int val, ran, loop, shift = 30; - ran= BLI_rand(); - val= (ran & 3); + ran= BLI_rng_thread_rand(random_tex_array, thread); loop= tex->noisedepth; + + /* start from top bits since they have more variance */ + val= ((ran >> shift) & 3); + while (loop--) { - ran= (ran>>2); - val*= (ran & 3); - div*= 3.0f; + shift -= 2; + val += ((ran >> shift) & 3); + div += 3.0f; } texres->tin= ((float)val)/div; @@ -1127,7 +1141,7 @@ static int multitex(Tex *tex, float texvec[3], float dxt[3], float dyt[3], int o retval = stucci(tex, texvec, texres); break; case TEX_NOISE: - retval = texnoise(tex, texres); + retval = texnoise(tex, texres, thread); break; case TEX_IMAGE: if (osatex) retval = imagewraposa(tex, tex->ima, NULL, texvec, dxt, dyt, texres, pool); @@ -3396,8 +3410,11 @@ void do_lamp_tex(LampRen *la, const float lavec[3], ShadeInput *shi, float col_r col[0]= texres.tr*la->energy; col[1]= texres.tg*la->energy; col[2]= texres.tb*la->energy; - - texture_rgb_blend(col_r, col, col_r, texres.tin, mtex->colfac, mtex->blendtype); + + if (effect & LA_SHAD_TEX) + texture_rgb_blend(col_r, col, col_r, texres.tin, mtex->shadowfac, mtex->blendtype); + else + texture_rgb_blend(col_r, col, col_r, texres.tin, mtex->colfac, mtex->blendtype); } } } |