[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41759] trunk/blender/source/blender/ render/intern/source/volume_precache.c: Fix #29207: cancelling volume precache at high resolution was too slow, added

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Nov 11 17:01:15 CET 2011


Revision: 41759
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41759
Author:   blendix
Date:     2011-11-11 16:01:13 +0000 (Fri, 11 Nov 2011)
Log Message:
-----------
Fix #29207: cancelling volume precache at high resolution was too slow, added
more test_break calls.

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

Modified: trunk/blender/source/blender/render/intern/source/volume_precache.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/volume_precache.c	2011-11-11 14:52:24 UTC (rev 41758)
+++ trunk/blender/source/blender/render/intern/source/volume_precache.c	2011-11-11 16:01:13 UTC (rev 41759)
@@ -285,7 +285,7 @@
 /* *** multiple scattering approximation *** */
 
 /* get the total amount of light energy in the light cache. used to normalise after multiple scattering */
-static float total_ss_energy(VolumePrecache *vp)
+static float total_ss_energy(Render *re, int do_test_break, VolumePrecache *vp)
 {
 	int x, y, z;
 	int *res = vp->res;
@@ -301,12 +301,14 @@
 				if (vp->data_b[i] > 0.f) energy += vp->data_b[i];
 			}
 		}
+
+		if (do_test_break && re->test_break(re->tbh)) break;
 	}
 	
 	return energy;
 }
 
-static float total_ms_energy(float *sr, float *sg, float *sb, int *res)
+static float total_ms_energy(Render *re, int do_test_break, float *sr, float *sg, float *sb, int *res)
 {
 	int x, y, z;
 	float energy=0.f;
@@ -321,16 +323,19 @@
 				if (sb[i] > 0.f) energy += sb[i];
 			}
 		}
+
+		if (do_test_break && re->test_break(re->tbh)) break;
 	}
 	
 	return energy;
 }
 
-static void ms_diffuse(float *x0, float *x, float diff, int *n) //n is the unpadded resolution
+static void ms_diffuse(Render *re, int do_test_break, float *x0, float *x, float diff, int *n) //n is the unpadded resolution
 {
 	int i, j, k, l;
 	const float dt = VOL_MS_TIMESTEP;
-	const float a = dt*diff*n[0]*n[1]*n[2];
+	size_t size = n[0]*n[1]*n[2];
+	const float a = dt*diff*size;
 	
 	for (l=0; l<20; l++)
 	{
@@ -345,7 +350,11 @@
 																		) / (1+6*a);
 				}
 			}
+
+			if (do_test_break && re->test_break(re->tbh)) break;
 		}
+
+		if (re->test_break(re->tbh)) break;
 	}
 }
 
@@ -359,6 +368,7 @@
 	int x, y, z, m;
 	int *n = vp->res;
 	const int size = (n[0]+2)*(n[1]+2)*(n[2]+2);
+	const int do_test_break = (size > 100000);
 	double time, lasttime= PIL_check_seconds_timer();
 	float total;
 	float c=1.0f;
@@ -374,7 +384,7 @@
 
 	total = (float)(n[0]*n[1]*n[2]*simframes);
 	
-	energy_ss = total_ss_energy(vp);
+	energy_ss = total_ss_energy(re, do_test_break, vp);
 	
 	/* Scattering as diffusion pass */
 	for (m=0; m<simframes; m++)
@@ -409,21 +419,26 @@
 					}
 				}
 			}
+
+			if (do_test_break && re->test_break(re->tbh)) break;
 		}
+
+		if (re->test_break(re->tbh)) break;
+
 		SWAP(float *,sr,sr0);
 		SWAP(float *,sg,sg0);
 		SWAP(float *,sb,sb0);
 
 		/* main diffusion simulation */
-		ms_diffuse(sr0, sr, diff, n);
-		ms_diffuse(sg0, sg, diff, n);
-		ms_diffuse(sb0, sb, diff, n);
+		ms_diffuse(re, do_test_break, sr0, sr, diff, n);
+		ms_diffuse(re, do_test_break, sg0, sg, diff, n);
+		ms_diffuse(re, do_test_break, sb0, sb, diff, n);
 		
 		if (re->test_break(re->tbh)) break;
 	}
 	
 	/* normalisation factor to conserve energy */
-	energy_ms = total_ms_energy(sr, sg, sb, n);
+	energy_ms = total_ms_energy(re, do_test_break, sr, sg, sb, n);
 	fac *= (energy_ss / energy_ms);
 	
 	/* blend multiple scattering back in the light cache */
@@ -449,6 +464,8 @@
 				vp->data_b[i] = origf * vp->data_b[i] + fac * sb[j];
 			}
 		}
+
+		if (do_test_break && re->test_break(re->tbh)) break;
 	}
 
 	MEM_freeN(sr0);




More information about the Bf-blender-cvs mailing list