Revision: 23937
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23937
Author:   blendix
Date:     2009-10-19 11:54:25 +0200 (Mon, 19 Oct 2009)

Log Message:
-----------
Fix #19657: crash when cancelling volume material render, raytree
is invalid if it cancels during build, so don't use it then.

Also fixes some use of unitialized variables in raytracing code.

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

Modified: trunk/blender/source/blender/render/intern/source/rayshade.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/rayshade.c        
2009-10-19 09:50:02 UTC (rev 23936)
+++ trunk/blender/source/blender/render/intern/source/rayshade.c        
2009-10-19 09:54:25 UTC (rev 23937)
@@ -242,7 +242,7 @@
                assert( faces > 0 );
 
                //Create Ray cast accelaration structure                
-               raytree = obr->raytree = RE_rayobject_create( re,  
re->r.raytrace_structure, faces );
+               raytree = RE_rayobject_create( re,  re->r.raytrace_structure, 
faces );
                if(  (re->r.raytrace_options & R_RAYTRACE_USE_LOCAL_COORDS) )
                        vlakprimitive = obr->rayprimitives = 
(VlakPrimitive*)MEM_callocN(faces*sizeof(VlakPrimitive), "ObjectRen 
primitives");
                else
@@ -269,13 +269,20 @@
                        }
                }
                RE_rayobject_done( raytree );
+
+               /* in case of cancel during build, raytree is not usable */
+               if(test_break(re))
+                       RE_rayobject_free(raytree);
+               else
+                       obr->raytree= raytree;
        }
 
-
-       if((obi->flag & R_TRANSFORMED) && obi->raytree == NULL)
-       {
-               obi->transform_primitives = 0;
-               obi->raytree = RE_rayobject_instance_create( obr->raytree, 
obi->mat, obi, obi->obr->rayobi );
+       if(obr->raytree) {
+               if((obi->flag & R_TRANSFORMED) && obi->raytree == NULL)
+               {
+                       obi->transform_primitives = 0;
+                       obi->raytree = RE_rayobject_instance_create( 
obr->raytree, obi->mat, obi, obi->obr->rayobi );
+               }
        }
        
        if(obi->raytree) return obi->raytree;
@@ -439,6 +446,7 @@
        {
                //Calculate raytree max_size
                //This is ONLY needed to kept a bogus behaviour of SUN and HEMI 
lights
+               INIT_MINMAX(min, max);
                RE_rayobject_merge_bb( re->raytree, min, max );
                for(i=0; i<3; i++)
                {

Modified: trunk/blender/source/blender/render/intern/source/volumetric.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/volumetric.c      
2009-10-19 09:50:02 UTC (rev 23936)
+++ trunk/blender/source/blender/render/intern/source/volumetric.c      
2009-10-19 09:54:25 UTC (rev 23937)
@@ -78,7 +78,6 @@
        float visibility = 1.f;
        
        if(lar->shb) {
-               float dot=1.f;
                float dxco[3]={0.f, 0.f, 0.f}, dyco[3]={0.f, 0.f, 0.f};
                
                visibility = testshadowbuf(&R, lar->shb, co, dxco, dyco, 1.0, 
0.0);             
@@ -139,7 +138,8 @@
                isect->skip = RE_SKIP_VLR_NEIGHBOUR;
                isect->orig.face = (void*)shi->vlr;
                isect->orig.ob = (void*)shi->obi;
-       } else if (intersect_type == VOL_BOUNDS_SS) {
+       } else { // if (intersect_type == VOL_BOUNDS_SS) {
+               isect->skip= 0;
                isect->orig.face= NULL;
                isect->orig.ob = NULL;
        }


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to