[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