[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40159] trunk/blender/source/blender/ render/intern: Fix for bug #28332: Smoke Simulation rendering artifacts.

Miika Hamalainen miika.hamalainen at kolumbus.fi
Mon Sep 12 11:55:05 CEST 2011


Revision: 40159
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40159
Author:   miikah
Date:     2011-09-12 09:55:04 +0000 (Mon, 12 Sep 2011)
Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/blender/render/intern/include/volumetric.h
    trunk/blender/source/blender/render/intern/source/volume_precache.c
    trunk/blender/source/blender/render/intern/source/volumetric.c

Modified: trunk/blender/source/blender/render/intern/include/volumetric.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/volumetric.h	2011-09-12 09:47:28 UTC (rev 40158)
+++ trunk/blender/source/blender/render/intern/include/volumetric.h	2011-09-12 09:55:04 UTC (rev 40159)
@@ -36,7 +36,7 @@
 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);

Modified: trunk/blender/source/blender/render/intern/source/volume_precache.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/volume_precache.c	2011-09-12 09:47:28 UTC (rev 40158)
+++ trunk/blender/source/blender/render/intern/source/volume_precache.c	2011-09-12 09:55:04 UTC (rev 40159)
@@ -490,7 +490,7 @@
 	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 @@
 					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];

Modified: trunk/blender/source/blender/render/intern/source/volumetric.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/volumetric.c	2011-09-12 09:47:28 UTC (rev 40158)
+++ trunk/blender/source/blender/render/intern/source/volumetric.c	2011-09-12 09:55:04 UTC (rev 40159)
@@ -464,7 +464,7 @@
 	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 @@
 	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 @@
 }
 
 /* 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 @@
 		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 @@
 				
 				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]);




More information about the Bf-blender-cvs mailing list