Bugfix for mysteriously disappearing left eyeball. Bounding boxes
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 5 Dec 2007 21:50:23 +0000 (21:50 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 5 Dec 2007 21:50:23 +0000 (21:50 +0000)
used for clipping were being stored in the mesh, but modifiers
can result in two objects with the same mesh having a different
bounding box. Solution is to store bounding box in the object.

source/blender/blenkernel/BKE_mesh.h
source/blender/blenkernel/intern/DerivedMesh.c
source/blender/blenkernel/intern/mesh.c
source/blender/blenkernel/intern/object.c
source/blender/python/api2_2x/Object.c
source/blender/src/drawobject.c
source/blender/src/drawview.c
source/blender/src/meshtools.c

index 1bba980c47b2d480673a1d9de616b1475097178a..556ba19d7d74eabb8e286f139d7819d8984a2bea 100644 (file)
@@ -75,7 +75,7 @@ int update_realtime_texture(struct MTFace *tface, double time);
 void mesh_delete_material_index(struct Mesh *me, int index);
 void mesh_set_smooth_flag(struct Object *meshOb, int enableSmooth);
 
-struct BoundBox *mesh_get_bb(struct Mesh *me);
+struct BoundBox *mesh_get_bb(struct Object *ob);
 void mesh_get_texspace(struct Mesh *me, float *loc_r, float *rot_r, float *size_r);
 
 /* if old, it converts mface->edcode to edge drawflags */
index e2e7b9dbd02a8d306c9dba90503e94a6b032519a..5af88633bad80085ef1ab20316130bce0c67fdd4 100644 (file)
@@ -2422,6 +2422,10 @@ static void clear_mesh_caches(Object *ob)
        Mesh *me= ob->data;
 
                /* also serves as signal to remake texspace */
+       if (ob->bb) {
+               MEM_freeN(ob->bb);
+               ob->bb = NULL;
+       }
        if (me->bb) {
                MEM_freeN(me->bb);
                me->bb = NULL;
@@ -2477,7 +2481,9 @@ static void mesh_build_data(Object *ob, CustomDataMask dataMask)
 
                ob->derivedFinal->getMinMax(ob->derivedFinal, min, max);
 
-               boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max);
+               if(!ob->bb)
+                       ob->bb= MEM_mallocN(sizeof(BoundBox), "bb");
+               boundbox_set_from_min_max(ob->bb, min, max);
 
                ob->derivedFinal->needsFree = 0;
                ob->derivedDeform->needsFree = 0;
@@ -2513,7 +2519,9 @@ static void editmesh_build_data(CustomDataMask dataMask)
 
        em->derivedFinal->getMinMax(em->derivedFinal, min, max);
 
-       boundbox_set_from_min_max(mesh_get_bb(G.obedit->data), min, max);
+       if(!G.obedit->bb)
+               G.obedit->bb= MEM_mallocN(sizeof(BoundBox), "bb");
+       boundbox_set_from_min_max(G.obedit->bb, min, max);
 
        em->derivedFinal->needsFree = 0;
        em->derivedCage->needsFree = 0;
index 746cc80d63881023db6f1ff9a48d3cb7cf95a228..f57daae811ff09d9cd770b6ff3752025544ea498 100644 (file)
@@ -454,11 +454,15 @@ void tex_space_mesh(Mesh *me)
        }
 }
 
-BoundBox *mesh_get_bb(Mesh *me)
+BoundBox *mesh_get_bb(Object *ob)
 {
-       if (!me->bb) {
+       Mesh *me= ob->data;
+
+       if(ob->bb)
+               return ob->bb;
+
+       if (!me->bb)
                tex_space_mesh(me);
-       }
 
        return me->bb;
 }
index b94e47492b22991370ec5ef6b9df5856533a2c19..15c4943f6fb11a00e76cc5fec78f6096e62ebf10 100644 (file)
@@ -2025,7 +2025,7 @@ BoundBox *object_get_boundbox(Object *ob)
        BoundBox *bb= NULL;
        
        if(ob->type==OB_MESH) {
-               bb = mesh_get_bb(ob->data);
+               bb = mesh_get_bb(ob);
        }
        else if ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT) {
                bb= ( (Curve *)ob->data )->bb;
@@ -2087,7 +2087,7 @@ void minmax_object(Object *ob, float *min, float *max)
                me= get_mesh(ob);
                
                if(me) {
-                       bb = *mesh_get_bb(me);
+                       bb = *mesh_get_bb(ob);
                        
                        for(a=0; a<8; a++) {
                                Mat4MulVecfl(ob->obmat, bb.vec[a]);
index f873c4321b3e69cdd4e7d5fbcc814017e0f5ec5b..f151653e356d791f074838cdb09d2f6af8b2e031 100644 (file)
@@ -1484,7 +1484,7 @@ static PyObject *Object_getBoundBox( BPy_Object * self )
                switch ( self->object->type ) {
                case OB_MESH:
                        me = self->object->data;
-                       vec = (float*) mesh_get_bb(me)->vec;
+                       vec = (float*) mesh_get_bb(self->object)->vec;
                        break;
                case OB_CURVE:
                case OB_FONT:
index c91c335c004cdd9de169d5dd8c50b58f92dbb617..a73c4e71a3da2085d17fd4044c39d05cdc42af50 100644 (file)
@@ -2430,8 +2430,7 @@ static int draw_mesh_object(Base *base, int dt, int flag)
        }
        else {
                /* don't create boundbox here with mesh_get_bb(), the derived system will make it, puts deformed bb's OK */
-               
-               if(me->totface<=4 || boundbox_clip(ob->obmat, me->bb)) {
+               if(me->totface<=4 || boundbox_clip(ob->obmat, (ob->bb)? ob->bb: me->bb)) {
                        if(dt==OB_SOLID) has_alpha= init_gl_materials(ob, (base->flag & OB_FROMDUPLI)==0);
                        draw_mesh_fancy(base, dt, flag);
                        
@@ -4481,7 +4480,7 @@ static void draw_bounding_volume(Object *ob)
        BoundBox *bb=0;
        
        if(ob->type==OB_MESH) {
-               bb= mesh_get_bb(ob->data);
+               bb= mesh_get_bb(ob);
        }
        else if ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT) {
                bb= ( (Curve *)ob->data )->bb;
index bd2fc642676225b378cac617f83970a11ba7e9a1..df33c7a597e9623470cc8c39e4d5826a69607ba9 100644 (file)
@@ -3306,7 +3306,7 @@ static int cached_dynamics(int sfra, int efra)
        Object *ob;
        ModifierData *md;
        ParticleSystem *psys;
-       int i, stack_index, cached=1;
+       int i, stack_index=-1, cached=1;
 
        while(base && cached) {
                ob = base->object;
index 2b5ec2006c18a7ae9803aabd4f7eb153bdf12a0c..6dc01217b82cf2061fe07e4ea6d236a9e0286f3f 100644 (file)
@@ -741,7 +741,7 @@ long mesh_octree_table(Object *ob, float *co, char mode)
        }
        else if(mode=='s') {    /* start table */
                Mesh *me= ob->data;
-               BoundBox *bb = mesh_get_bb(me);
+               BoundBox *bb = mesh_get_bb(ob);
                
                /* for quick unit coordinate calculus */
                VECCOPY(offs, bb->vec[0]);