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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to