[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35477] trunk/blender/source/blender/ render/intern/raytrace: Fix #26203: crash with empty raytree, all types should survive this now.

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Mar 11 23:27:07 CET 2011


Revision: 35477
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35477
Author:   blendix
Date:     2011-03-11 22:27:06 +0000 (Fri, 11 Mar 2011)
Log Message:
-----------
Fix #26203: crash with empty raytree, all types should survive this now.

Also added a check for -inf/inf bounding boxes, just to be sure.

Modified Paths:
--------------
    trunk/blender/source/blender/render/intern/raytrace/bvh.h
    trunk/blender/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
    trunk/blender/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp
    trunk/blender/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
    trunk/blender/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
    trunk/blender/source/blender/render/intern/raytrace/vbvh.h

Modified: trunk/blender/source/blender/render/intern/raytrace/bvh.h
===================================================================
--- trunk/blender/source/blender/render/intern/raytrace/bvh.h	2011-03-11 22:06:18 UTC (rev 35476)
+++ trunk/blender/source/blender/render/intern/raytrace/bvh.h	2011-03-11 22:27:06 UTC (rev 35477)
@@ -129,7 +129,8 @@
 template<class Tree>
 static void bvh_bb(Tree *obj, float *min, float *max)
 {
-	bvh_node_merge_bb(obj->root, min, max);
+	if(obj->root)
+		bvh_node_merge_bb(obj->root, min, max);
 }
 
 

Modified: trunk/blender/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
===================================================================
--- trunk/blender/source/blender/render/intern/raytrace/rayobject_qbvh.cpp	2011-03-11 22:06:18 UTC (rev 35476)
+++ trunk/blender/source/blender/render/intern/raytrace/rayobject_qbvh.cpp	2011-03-11 22:27:06 UTC (rev 35477)
@@ -80,9 +80,12 @@
 		return;
 	}
 	
-	pushup_simd<VBVHNode,4>(root);
-
-	obj->root = Reorganize_SVBVH<VBVHNode>(arena2).transform(root);
+	if(root) {
+		pushup_simd<VBVHNode,4>(root);
+		obj->root = Reorganize_SVBVH<VBVHNode>(arena2).transform(root);
+	}
+	else
+		obj->root = NULL;
 	
 	//Free data
 	BLI_memarena_free(arena1);

Modified: trunk/blender/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp
===================================================================
--- trunk/blender/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp	2011-03-11 22:06:18 UTC (rev 35476)
+++ trunk/blender/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp	2011-03-11 22:27:06 UTC (rev 35477)
@@ -106,6 +106,13 @@
 	INIT_MINMAX(bb, bb+3);
 	RE_rayobject_merge_bb(o, bb, bb+3);
 
+	/* skip objects with inf/nan in bounding boxes. we should not be
+	   getting these, but in case it happens this avoids crashes */
+	if(!finite(bb[0]) || !finite(bb[1]) || !finite(bb[2]))
+		return;
+	if(!finite(bb[3]) || !finite(bb[4]) || !finite(bb[5]))
+		return;
+
 	/* skip objects with zero bounding box, they are of no use, and
 	   will give problems in rtbuild_heuristic_object_split later */
 	if(len_squared_v3v3(bb, bb+3) == 0.0f)

Modified: trunk/blender/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
===================================================================
--- trunk/blender/source/blender/render/intern/raytrace/rayobject_svbvh.cpp	2011-03-11 22:06:18 UTC (rev 35476)
+++ trunk/blender/source/blender/render/intern/raytrace/rayobject_svbvh.cpp	2011-03-11 22:27:06 UTC (rev 35477)
@@ -115,8 +115,12 @@
 			return;
 		}
 
-		VBVH_optimalPackSIMD<OVBVHNode,PackCost>(PackCost()).transform(root);
-		obj->root = Reorganize_SVBVH<OVBVHNode>(arena2).transform(root);
+		if(root) {
+			VBVH_optimalPackSIMD<OVBVHNode,PackCost>(PackCost()).transform(root);
+			obj->root = Reorganize_SVBVH<OVBVHNode>(arena2).transform(root);
+		}
+		else
+			obj->root = NULL;
 	}
 	
 	//Free data

Modified: trunk/blender/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
===================================================================
--- trunk/blender/source/blender/render/intern/raytrace/rayobject_vbvh.cpp	2011-03-11 22:06:18 UTC (rev 35476)
+++ trunk/blender/source/blender/render/intern/raytrace/rayobject_vbvh.cpp	2011-03-11 22:27:06 UTC (rev 35477)
@@ -98,13 +98,17 @@
 			return;
 		}
 
-		reorganize(root);
-		remove_useless(root, &root);
-		bvh_refit(root);
-	
-		pushup(root);
-		pushdown(root);
-		obj->root = root;
+		if(root) {
+			reorganize(root);
+			remove_useless(root, &root);
+			bvh_refit(root);
+		
+			pushup(root);
+			pushdown(root);
+			obj->root = root;
+		}
+		else
+			obj->root = NULL;
 	}
 	else
 	{

Modified: trunk/blender/source/blender/render/intern/raytrace/vbvh.h
===================================================================
--- trunk/blender/source/blender/render/intern/raytrace/vbvh.h	2011-03-11 22:06:18 UTC (rev 35476)
+++ trunk/blender/source/blender/render/intern/raytrace/vbvh.h	2011-03-11 22:27:06 UTC (rev 35477)
@@ -157,9 +157,12 @@
 	
 	Node *_transform(RTBuilder *builder)
 	{
-		
 		int size = rtbuild_size(builder);
-		if(size == 1)
+
+		if(size == 0) {
+			return NULL;
+		}
+		else if(size == 1)
 		{
 			Node *node = create_node();
 			INIT_MINMAX(node->bb, node->bb+3);




More information about the Bf-blender-cvs mailing list