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

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

Reply via email to