update to center view.

- Dont do anything if no verts or faces are selected (used to zoom into 0,0,0)
 - use the centers of dupli objects (should eventually use their bound boxes), much nicer when dealing with many dupli-objects
This commit is contained in:
2007-04-14 13:18:24 +00:00
parent 0a411c4704
commit 0a0cf54a27
7 changed files with 39 additions and 12 deletions

View File

@@ -102,6 +102,7 @@ void boundbox_set_from_min_max(struct BoundBox *bb, float min[3], float max[3]);
struct BoundBox *object_get_boundbox(struct Object *ob); struct BoundBox *object_get_boundbox(struct Object *ob);
void object_boundbox_flag(struct Object *ob, int flag, int set); void object_boundbox_flag(struct Object *ob, int flag, int set);
void minmax_object(struct Object *ob, float *min, float *max); void minmax_object(struct Object *ob, float *min, float *max);
void minmax_object_duplis(struct Object *ob, float *min, float *max);
void solve_tracking (struct Object *ob, float targetmat[][4]); void solve_tracking (struct Object *ob, float targetmat[][4]);
void solve_constraints (struct Object *ob, short obtype, void *obdata, float ctime); void solve_constraints (struct Object *ob, short obtype, void *obdata, float ctime);

View File

@@ -1980,6 +1980,28 @@ void minmax_object(Object *ob, float *min, float *max)
} }
} }
/* TODO - use dupli objects bounding boxes */
void minmax_object_duplis(Object *ob, float *min, float *max)
{
if ((ob->transflag & OB_DUPLI)==0) {
return;
} else {
ListBase *lb;
DupliObject *dob;
lb= object_duplilist(G.scene, ob);
for(dob= lb->first; dob; dob= dob->next) {
if(dob->no_draw);
else {
/* should really use bound box of dup object */
DO_MINMAX(dob->mat[3], min, max);
}
}
free_object_duplilist(lb); /* does restore */
}
}
/* proxy rule: lib_object->proxy_from == the one we borrow from, only set temporal and cleared here */ /* proxy rule: lib_object->proxy_from == the one we borrow from, only set temporal and cleared here */
/* local_object->proxy == pointer to library object, saved in files and read */ /* local_object->proxy == pointer to library object, saved in files and read */

View File

@@ -48,7 +48,7 @@ void deselectall_tface(void);
void selectswap_tface(void); void selectswap_tface(void);
void rotate_uv_tface(void); void rotate_uv_tface(void);
void mirror_uv_tface(void); void mirror_uv_tface(void);
void minmax_tface(float *min, float *max); int minmax_tface(float *min, float *max);
void face_select(void); void face_select(void);
void face_borderselect(void); void face_borderselect(void);
void uv_autocalc_tface(void); void uv_autocalc_tface(void);

View File

@@ -43,7 +43,7 @@ void mergemenu(void);
void delete_context_selected(void); void delete_context_selected(void);
void duplicate_context_selected(void); void duplicate_context_selected(void);
void toggle_shading(void); void toggle_shading(void);
void minmax_verts(float *min, float *max); int minmax_verts(float *min, float *max);
void snap_sel_to_grid(void); void snap_sel_to_grid(void);
void snap_sel_to_curs(void); void snap_sel_to_curs(void);

View File

@@ -1836,7 +1836,7 @@ void toggle_shading(void)
} }
} }
void minmax_verts(float *min, float *max) int minmax_verts(float *min, float *max)
{ {
TransVert *tv; TransVert *tv;
float centroid[3], vec[3], bmat[3][3]; float centroid[3], vec[3], bmat[3][3];
@@ -1845,7 +1845,7 @@ void minmax_verts(float *min, float *max)
tottrans=0; tottrans=0;
if ELEM5(G.obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE) if ELEM5(G.obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE)
make_trans_verts(bmat[0], bmat[1], 0); make_trans_verts(bmat[0], bmat[1], 0);
if(tottrans==0) return; if(tottrans==0) return 0;
Mat3CpyMat4(bmat, G.obedit->obmat); Mat3CpyMat4(bmat, G.obedit->obmat);
@@ -1860,5 +1860,6 @@ void minmax_verts(float *min, float *max)
MEM_freeN(transvmain); MEM_freeN(transvmain);
transvmain= 0; transvmain= 0;
return 1;
} }

View File

@@ -911,20 +911,20 @@ void mirror_uv_tface()
object_uvs_changed(OBACT); object_uvs_changed(OBACT);
} }
void minmax_tface(float *min, float *max) int minmax_tface(float *min, float *max)
{ {
Object *ob; Object *ob;
Mesh *me; Mesh *me;
MFace *mf; MFace *mf;
MTFace *tf; MTFace *tf;
MVert *mv; MVert *mv;
int a; int a, ok=0;
float vec[3], bmat[3][3]; float vec[3], bmat[3][3];
ob = OBACT; ob = OBACT;
if (ob==0) return; if (ob==0) return ok;
me= get_mesh(ob); me= get_mesh(ob);
if(me==0 || me->mtface==0) return; if(me==0 || me->mtface==0) return ok;
Mat3CpyMat4(bmat, ob->obmat); Mat3CpyMat4(bmat, ob->obmat);
@@ -956,7 +956,9 @@ void minmax_tface(float *min, float *max)
VecAddf(vec, vec, ob->obmat[3]); VecAddf(vec, vec, ob->obmat[3]);
DO_MINMAX(vec, min, max); DO_MINMAX(vec, min, max);
} }
ok= 1;
} }
return ok;
} }
#define ME_SEAM_DONE ME_SEAM_LAST /* reuse this flag */ #define ME_SEAM_DONE ME_SEAM_LAST /* reuse this flag */

View File

@@ -1305,8 +1305,7 @@ void centerview() /* like a localview without local! */
if(G.obedit) { if(G.obedit) {
minmax_verts(min, max); // ony selected ok = minmax_verts(min, max); /* only selected */
ok= 1;
} }
else if(ob && (ob->flag & OB_POSEMODE)) { else if(ob && (ob->flag & OB_POSEMODE)) {
if(ob->pose) { if(ob->pose) {
@@ -1330,14 +1329,16 @@ void centerview() /* like a localview without local! */
} }
} }
else if (G.f & G_FACESELECT) { else if (G.f & G_FACESELECT) {
minmax_tface(min, max); ok= minmax_tface(min, max);
ok= 1;
} }
else { else {
Base *base= FIRSTBASE; Base *base= FIRSTBASE;
while(base) { while(base) {
if TESTBASE(base) { if TESTBASE(base) {
minmax_object(base->object, min, max); minmax_object(base->object, min, max);
/* account for duplis */
minmax_object_duplis(base->object, min, max);
ok= 1; ok= 1;
} }
base= base->next; base= base->next;