- added boundbox_set_from_min_max function
authorDaniel Dunbar <daniel@zuster.org>
Mon, 18 Jul 2005 17:33:51 +0000 (17:33 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Mon, 18 Jul 2005 17:33:51 +0000 (17:33 +0000)
 - fix DerivedMesh.getMinMax implementations to set min & max when
   there are no vertices
 - mesh boundbox calc was wrong in some cases, messed up HOMEKEY
   and localview zooming

source/blender/blenkernel/BKE_object.h
source/blender/blenkernel/intern/DerivedMesh.c
source/blender/blenkernel/intern/curve.c
source/blender/blenkernel/intern/displist.c
source/blender/blenkernel/intern/mball.c
source/blender/blenkernel/intern/mesh.c
source/blender/blenkernel/intern/object.c
source/blender/blenkernel/intern/subsurf_ccg.c

index 1fadaa161eb5c1e02d83927affc20d074b6ed7c0..21c1e869ea2a650904ba30e49b6826b11a96a389 100644 (file)
@@ -91,6 +91,7 @@ void where_is_object_simul(struct Object *ob);
 
 void what_does_parent(struct Object *ob);
 struct BoundBox *unit_boundbox(void);
+void boundbox_set_from_min_max(struct BoundBox *bb, float min[3], float max[3]);
 void minmax_object(struct Object *ob, float *min, float *max);
 void solve_tracking (struct Object *ob, float targetmat[][4]);
 void solve_constraints (struct Object *ob, short obtype, void *obdata, float ctime);
index 578bf69fb76405f28fa5d17076e7a7384028e889..2dec39f4b86ff11f0fbe96113c9aa677397a5f42 100644 (file)
@@ -97,8 +97,12 @@ static void meshDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3])
        Mesh *me = mdm->ob->data;
        int i;
 
-       for (i=0; i<me->totvert; i++) {
-               DO_MINMAX(mdm->verts[i].co, min_r, max_r);
+       if (me->totvert) {
+               for (i=0; i<me->totvert; i++) {
+                       DO_MINMAX(mdm->verts[i].co, min_r, max_r);
+               }
+       } else {
+               min_r[0] = min_r[1] = min_r[2] = max_r[0] = max_r[1] = max_r[2] = 0.0;
        }
 }
 
@@ -580,8 +584,12 @@ static void emDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3])
        EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
        EditVert *eve;
 
-       for (eve= emdm->em->verts.first; eve; eve= eve->next) {
-               DO_MINMAX(eve->co, min_r, max_r);
+       if (emdm->em->verts.first) {
+               for (eve= emdm->em->verts.first; eve; eve= eve->next) {
+                       DO_MINMAX(eve->co, min_r, max_r);
+               }
+       } else {
+               min_r[0] = min_r[1] = min_r[2] = max_r[0] = max_r[1] = max_r[2] = 0.0;
        }
 }
 static int emDM_getNumVerts(DerivedMesh *dm)
@@ -872,8 +880,12 @@ static void ssDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3])
        SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
        int i;
 
-       for (i=0; i<ssdm->dlm->totvert; i++) {
-               DO_MINMAX(ssdm->dlm->mvert[i].co, min_r, max_r);
+       if (ssdm->dlm->totvert) {
+               for (i=0; i<ssdm->dlm->totvert; i++) {
+                       DO_MINMAX(ssdm->dlm->mvert[i].co, min_r, max_r);
+               }
+       } else {
+               min_r[0] = min_r[1] = min_r[2] = max_r[0] = max_r[1] = max_r[2] = 0.0;
        }
 }
 
index 7dd8c6efd65298f18ecad9cba1a66ebc183a3cab..9d464242266d7f21964dcde8c5d593f7dee87638 100644 (file)
@@ -320,28 +320,20 @@ void tex_space_curve(Curve *cu)
                dl= dl->next;
        }
 
-       if(doit) {
-               loc[0]= (min[0]+max[0])/2.0f;
-               loc[1]= (min[1]+max[1])/2.0f;
-               loc[2]= (min[2]+max[2])/2.0f;
-               
-               size[0]= (max[0]-min[0])/2.0f;
-               size[1]= (max[1]-min[1])/2.0f;
-               size[2]= (max[2]-min[2])/2.0f;
-       }
-       else {
-               loc[0]= loc[1]= loc[2]= 0.0f;
-               size[0]= size[1]= size[2]= 1.0f;
+       if(!doit) {
+               min[0] = min[1] = min[2] = -1.0f;
+               max[0] = max[1] = max[2] = 1.0f;
        }
        
-       bb->vec[0][0]=bb->vec[1][0]=bb->vec[2][0]=bb->vec[3][0]= loc[0]-size[0];
-       bb->vec[4][0]=bb->vec[5][0]=bb->vec[6][0]=bb->vec[7][0]= loc[0]+size[0];
+       loc[0]= (min[0]+max[0])/2.0f;
+       loc[1]= (min[1]+max[1])/2.0f;
+       loc[2]= (min[2]+max[2])/2.0f;
        
-       bb->vec[0][1]=bb->vec[1][1]=bb->vec[4][1]=bb->vec[5][1]= loc[1]-size[1];
-       bb->vec[2][1]=bb->vec[3][1]=bb->vec[6][1]=bb->vec[7][1]= loc[1]+size[1];
+       size[0]= (max[0]-min[0])/2.0f;
+       size[1]= (max[1]-min[1])/2.0f;
+       size[2]= (max[2]-min[2])/2.0f;
 
-       bb->vec[0][2]=bb->vec[3][2]=bb->vec[4][2]=bb->vec[7][2]= loc[2]-size[2];
-       bb->vec[1][2]=bb->vec[2][2]=bb->vec[5][2]=bb->vec[6][2]= loc[2]+size[2];
+       boundbox_set_from_min_max(bb, min, max);
 
        if(cu->texflag & CU_AUTOSPACE) {
                VECCOPY(cu->loc, loc);
index 955114939b1165daf31457396aced56b7edbc397..69242481fd7add7bf489025431cecaf8010af1ee 100644 (file)
@@ -1418,6 +1418,7 @@ float calc_taper(Object *taperobj, int cur, int tot)
 void makeDispListMesh(Object *ob)
 {
        MVert *deformedMVerts = NULL;
+       float min[3], max[3];
        Mesh *me;
 
        if(!ob || (ob->flag&OB_FROMDUPLI) || ob->type!=OB_MESH) return;
@@ -1457,30 +1458,15 @@ void makeDispListMesh(Object *ob)
                }
        }
        
-       {
-               BoundBox *bb=0;
-               float min[3], max[3];
-               
-               INIT_MINMAX(min, max);
-
-               bb= mesh_get_bb(ob->data);
+       INIT_MINMAX(min, max);
+       if (me->derived) {
+               me->derived->getMinMax(me->derived, min, max);
 
-               if (me->derived) {
-                       me->derived->getMinMax(me->derived, min, max);
-               } else if (ob->derivedDeform) {
-                       ob->derivedDeform->getMinMax(ob->derivedDeform, min, max);
-               }
+               boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max);
+       } else if (ob->derivedDeform) {
+               ob->derivedDeform->getMinMax(ob->derivedDeform, min, max);
 
-               if(bb) {
-                       bb->vec[0][0]=bb->vec[1][0]=bb->vec[2][0]=bb->vec[3][0]= min[0];
-                       bb->vec[4][0]=bb->vec[5][0]=bb->vec[6][0]=bb->vec[7][0]= max[0];
-                       
-                       bb->vec[0][1]=bb->vec[1][1]=bb->vec[4][1]=bb->vec[5][1]= min[1];
-                       bb->vec[2][1]=bb->vec[3][1]=bb->vec[6][1]=bb->vec[7][1]= max[1];
-               
-                       bb->vec[0][2]=bb->vec[3][2]=bb->vec[4][2]=bb->vec[7][2]= min[2];
-                       bb->vec[1][2]=bb->vec[2][2]=bb->vec[5][2]=bb->vec[6][2]= max[2];
-               }
+               boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max);
        }
 
        build_particle_system(ob);
@@ -2092,14 +2078,7 @@ static void boundbox_displist(Object *ob)
        }
        
        if(bb) {
-               bb->vec[0][0]=bb->vec[1][0]=bb->vec[2][0]=bb->vec[3][0]= min[0];
-               bb->vec[4][0]=bb->vec[5][0]=bb->vec[6][0]=bb->vec[7][0]= max[0];
-               
-               bb->vec[0][1]=bb->vec[1][1]=bb->vec[4][1]=bb->vec[5][1]= min[1];
-               bb->vec[2][1]=bb->vec[3][1]=bb->vec[6][1]=bb->vec[7][1]= max[1];
-       
-               bb->vec[0][2]=bb->vec[3][2]=bb->vec[4][2]=bb->vec[7][2]= min[2];
-               bb->vec[1][2]=bb->vec[2][2]=bb->vec[5][2]=bb->vec[6][2]= max[2];
+               boundbox_set_from_min_max(bb, min, max);
        }
 }
 
index 35dfe5d2dfd131b2e03e433988e0c30fb8754b53..44eb4b38051aa437e3b492309ddf312dac62dac3 100644 (file)
@@ -217,29 +217,20 @@ void tex_space_mball(Object *ob)
                dl= dl->next;
        }
 
-       if(doit) {
-               loc[0]= (min[0]+max[0])/2.0f;
-               loc[1]= (min[1]+max[1])/2.0f;
-               loc[2]= (min[2]+max[2])/2.0f;
-               
-               size[0]= (max[0]-min[0])/2.0f;
-               size[1]= (max[1]-min[1])/2.0f;
-               size[2]= (max[2]-min[2])/2.0f;
-       }
-       else {
-               loc[0]= loc[1]= loc[2]= 0.0f;
-               size[0]= size[1]= size[2]= 1.0f;
+       if(!doit) {
+               min[0] = min[1] = min[2] = -1.0f;
+               max[0] = max[1] = max[2] = 1.0f;
        }
        
-       bb->vec[0][0]=bb->vec[1][0]=bb->vec[2][0]=bb->vec[3][0]= loc[0]-size[0];
-       bb->vec[4][0]=bb->vec[5][0]=bb->vec[6][0]=bb->vec[7][0]= loc[0]+size[0];
+       loc[0]= (min[0]+max[0])/2.0f;
+       loc[1]= (min[1]+max[1])/2.0f;
+       loc[2]= (min[2]+max[2])/2.0f;
        
-       bb->vec[0][1]=bb->vec[1][1]=bb->vec[4][1]=bb->vec[5][1]= loc[1]-size[1];
-       bb->vec[2][1]=bb->vec[3][1]=bb->vec[6][1]=bb->vec[7][1]= loc[1]+size[1];
+       size[0]= (max[0]-min[0])/2.0f;
+       size[1]= (max[1]-min[1])/2.0f;
+       size[2]= (max[2]-min[2])/2.0f;
 
-       bb->vec[0][2]=bb->vec[3][2]=bb->vec[4][2]=bb->vec[7][2]= loc[2]-size[2];
-       bb->vec[1][2]=bb->vec[2][2]=bb->vec[5][2]=bb->vec[6][2]= loc[2]+size[2];
-       
+       boundbox_set_from_min_max(bb, min, max);
 }
 
 void make_orco_mball(Object *ob)
index 8050a475d413a68b8c54a24c1cb3e28748c33b5b..ad183f2aeadbd408eb763715aa2e450a559da3c1 100644 (file)
@@ -351,28 +351,20 @@ void boundbox_mesh(Mesh *me, float *loc, float *size)
                DO_MINMAX(mvert->co, min, max);
        }
 
-       if(me->totvert) {
-               loc[0]= (min[0]+max[0])/2.0f;
-               loc[1]= (min[1]+max[1])/2.0f;
-               loc[2]= (min[2]+max[2])/2.0f;
-               
-               size[0]= (max[0]-min[0])/2.0f;
-               size[1]= (max[1]-min[1])/2.0f;
-               size[2]= (max[2]-min[2])/2.0f;
-       }
-       else {
-               loc[0]= loc[1]= loc[2]= 0.0;
-               size[0]= size[1]= size[2]= 0.0;
+       if(!me->totvert) {
+               min[0] = min[1] = min[2] = -1.0f;
+               max[0] = max[1] = max[2] = 1.0f;
        }
-       
-       bb->vec[0][0]=bb->vec[1][0]=bb->vec[2][0]=bb->vec[3][0]= loc[0]-size[0];
-       bb->vec[4][0]=bb->vec[5][0]=bb->vec[6][0]=bb->vec[7][0]= loc[0]+size[0];
-       
-       bb->vec[0][1]=bb->vec[1][1]=bb->vec[4][1]=bb->vec[5][1]= loc[1]-size[1];
-       bb->vec[2][1]=bb->vec[3][1]=bb->vec[6][1]=bb->vec[7][1]= loc[1]+size[1];
 
-       bb->vec[0][2]=bb->vec[3][2]=bb->vec[4][2]=bb->vec[7][2]= loc[2]-size[2];
-       bb->vec[1][2]=bb->vec[2][2]=bb->vec[5][2]=bb->vec[6][2]= loc[2]+size[2];
+       loc[0]= (min[0]+max[0])/2.0f;
+       loc[1]= (min[1]+max[1])/2.0f;
+       loc[2]= (min[2]+max[2])/2.0f;
+               
+       size[0]= (max[0]-min[0])/2.0f;
+       size[1]= (max[1]-min[1])/2.0f;
+       size[2]= (max[2]-min[2])/2.0f;
+       
+       boundbox_set_from_min_max(bb, min, max);
 }
 
 void tex_space_mesh(Mesh *me)
index 928b86fd16a85c6ca94748c7e23f349fd16bac81..342453df08ad3b319b832d0cb1a6931a0420ea3c 100644 (file)
@@ -1679,19 +1679,24 @@ void what_does_parent(Object *ob)
 BoundBox *unit_boundbox()
 {
        BoundBox *bb;
-       
-       bb= MEM_mallocN(sizeof(BoundBox), "bb");
+       float min[3] = {-1,-1,-1}, max[3] = {-1,-1,-1};
 
-       bb->vec[0][0]=bb->vec[1][0]=bb->vec[2][0]=bb->vec[3][0]= -1.0;
-       bb->vec[4][0]=bb->vec[5][0]=bb->vec[6][0]=bb->vec[7][0]= 1.0;
+       bb= MEM_mallocN(sizeof(BoundBox), "bb");
+       boundbox_set_from_min_max(bb, min, max);
        
-       bb->vec[0][1]=bb->vec[1][1]=bb->vec[4][1]=bb->vec[5][1]= -1.0;
-       bb->vec[2][1]=bb->vec[3][1]=bb->vec[6][1]=bb->vec[7][1]= 1.0;
+       return bb;
+}
 
-       bb->vec[0][2]=bb->vec[3][2]=bb->vec[4][2]=bb->vec[7][2]= -1.0;
-       bb->vec[1][2]=bb->vec[2][2]=bb->vec[5][2]=bb->vec[6][2]= 1.0;
+void boundbox_set_from_min_max(BoundBox *bb, float min[3], float max[3])
+{
+       bb->vec[0][0]=bb->vec[1][0]=bb->vec[2][0]=bb->vec[3][0]= min[0];
+       bb->vec[4][0]=bb->vec[5][0]=bb->vec[6][0]=bb->vec[7][0]= max[0];
        
-       return bb;
+       bb->vec[0][1]=bb->vec[1][1]=bb->vec[4][1]=bb->vec[5][1]= min[1];
+       bb->vec[2][1]=bb->vec[3][1]=bb->vec[6][1]=bb->vec[7][1]= max[1];
+
+       bb->vec[0][2]=bb->vec[3][2]=bb->vec[4][2]=bb->vec[7][2]= min[2];
+       bb->vec[1][2]=bb->vec[2][2]=bb->vec[5][2]=bb->vec[6][2]= max[2];
 }
 
 void minmax_object(Object *ob, float *min, float *max)
index eb1c835fcd79ad7e634b189fd1e93a8a69e228bc..5b417d15d7f74f8d143dd1c9b5c9d343655d7a2f 100644 (file)
@@ -593,6 +593,9 @@ static void ccgDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3]) {
        int i, edgeSize = ccgSubSurf_getEdgeSize(ss);
        int gridSize = ccgSubSurf_getGridSize(ss);
 
+       if (!ccgSubSurf_getNumVerts(ss))
+               min_r[0] = min_r[1] = min_r[2] = max_r[0] = max_r[1] = max_r[2] = 0.0;
+
        for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
                CCGVert *v = ccgVertIterator_getCurrent(vi);
                float *co = ccgSubSurf_getVertData(ss, v);