diff options
author | Miika Hamalainen <blender@miikah.org> | 2011-09-12 13:55:04 +0400 |
---|---|---|
committer | Miika Hamalainen <blender@miikah.org> | 2011-09-12 13:55:04 +0400 |
commit | 46aede579e15b4106b0a342dbb7f3b6ea5f088d2 (patch) | |
tree | c2283278c9aa6723da867f2ef4d0daa5744206a9 /source/blender | |
parent | b8bf0ee822a742039d364991e712dda09b58eb61 (diff) |
Fix for bug #28332: Smoke Simulation rendering artifacts.
Volume pre-caching altered shared data simultaneously in multiple threads, causing invalid scattering results when "Asymmetry" value was used. The view vector is now passed as a function argument.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/render/intern/include/volumetric.h | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/volume_precache.c | 8 | ||||
-rw-r--r-- | source/blender/render/intern/source/volumetric.c | 10 |
3 files changed, 10 insertions, 10 deletions
diff --git a/source/blender/render/intern/include/volumetric.h b/source/blender/render/intern/include/volumetric.h index 6d8d4cbe0f2..a2d1821a62b 100644 --- a/source/blender/render/intern/include/volumetric.h +++ b/source/blender/render/intern/include/volumetric.h @@ -36,7 +36,7 @@ struct ShadeInput; struct ShadeResult; float vol_get_density(struct ShadeInput *shi, float *co); -void vol_get_scattering(ShadeInput *shi, float *scatter_col, float *co_); +void vol_get_scattering(ShadeInput *shi, float *scatter_col, float *co_, float *view); void shade_volume_outside(ShadeInput *shi, ShadeResult *shr); void shade_volume_inside(ShadeInput *shi, ShadeResult *shr); diff --git a/source/blender/render/intern/source/volume_precache.c b/source/blender/render/intern/source/volume_precache.c index 2037acc943f..18132c4a7f3 100644 --- a/source/blender/render/intern/source/volume_precache.c +++ b/source/blender/render/intern/source/volume_precache.c @@ -490,7 +490,7 @@ static void *vol_precache_part(void *data) RayObject *tree = pa->tree; ShadeInput *shi = pa->shi; float scatter_col[3] = {0.f, 0.f, 0.f}; - float co[3], cco[3]; + float co[3], cco[3], view[3]; int x, y, z, i; int res[3]; @@ -523,9 +523,9 @@ static void *vol_precache_part(void *data) continue; } - copy_v3_v3(shi->view, cco); - normalize_v3(shi->view); - vol_get_scattering(shi, scatter_col, cco); + copy_v3_v3(view, cco); + normalize_v3(view); + vol_get_scattering(shi, scatter_col, cco, view); obi->volume_precache->data_r[i] = scatter_col[0]; obi->volume_precache->data_g[i] = scatter_col[1]; diff --git a/source/blender/render/intern/source/volumetric.c b/source/blender/render/intern/source/volumetric.c index a5dab4adc15..fdc9bbe4b33 100644 --- a/source/blender/render/intern/source/volumetric.c +++ b/source/blender/render/intern/source/volumetric.c @@ -464,7 +464,7 @@ static void vol_get_transmittance(ShadeInput *shi, float *tr, float *co, float * tr[2] = expf(-tau[2]); } -static void vol_shade_one_lamp(struct ShadeInput *shi, float *co, LampRen *lar, float *lacol) +static void vol_shade_one_lamp(struct ShadeInput *shi, float *co, float *view, LampRen *lar, float *lacol) { float visifac, lv[3], lampdist; float tr[3]={1.0,1.0,1.0}; @@ -535,7 +535,7 @@ static void vol_shade_one_lamp(struct ShadeInput *shi, float *co, LampRen *lar, if (luminance(lacol) < 0.001f) return; normalize_v3(lv); - p = vol_get_phasefunc(shi, shi->mat->vol.asymmetry, shi->view, lv); + p = vol_get_phasefunc(shi, shi->mat->vol.asymmetry, view, lv); /* physically based scattering with non-physically based RGB gain */ vol_get_reflection_color(shi, ref_col, co); @@ -546,7 +546,7 @@ static void vol_shade_one_lamp(struct ShadeInput *shi, float *co, LampRen *lar, } /* single scattering only for now */ -void vol_get_scattering(ShadeInput *shi, float *scatter_col, float *co) +void vol_get_scattering(ShadeInput *shi, float *scatter_col, float *co, float *view) { ListBase *lights; GroupObject *go; @@ -561,7 +561,7 @@ void vol_get_scattering(ShadeInput *shi, float *scatter_col, float *co) lar= go->lampren; if (lar) { - vol_shade_one_lamp(shi, co, lar, lacol); + vol_shade_one_lamp(shi, co, view, lar, lacol); add_v3_v3(scatter_col, lacol); } } @@ -629,7 +629,7 @@ static void volumeintegrate(struct ShadeInput *shi, float *col, float *co, float vol_get_precached_scattering(&R, shi, scatter_col, p2); } else - vol_get_scattering(shi, scatter_col, p); + vol_get_scattering(shi, scatter_col, p, shi->view); radiance[0] += stepd * tr[0] * (emit_col[0] + scatter_col[0]); radiance[1] += stepd * tr[1] * (emit_col[1] + scatter_col[1]); |