[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23937] trunk/blender/source/blender/ render/intern/source: Fix #19657: crash when cancelling volume material render, raytree

Brecht Van Lommel brecht at blender.org
Mon Oct 19 11:54:26 CEST 2009


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





More information about the Bf-blender-cvs mailing list