diff options
author | Campbell Barton <ideasman42@gmail.com> | 2010-02-24 23:11:35 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2010-02-24 23:11:35 +0300 |
commit | 99b288da967520e5f8ba6585f982c5c62c36df58 (patch) | |
tree | 9b52892ceeb0e8f004171a1d299e61f411e4ea82 | |
parent | aebe86bef1e13e3ce0a4d7a67b7cf5f6d9c1cd66 (diff) |
view selected now uses boundboxes of dupli-objects and ignores centerpoints of the instance objects when it has duplis. view selected also working again for selected paint mask faces.
-rw-r--r-- | release/scripts/ui/space_view3d.py | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_object.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 26 | ||||
-rw-r--r-- | source/blender/editors/mesh/editface.c | 52 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_edit.c | 7 |
5 files changed, 38 insertions, 50 deletions
diff --git a/release/scripts/ui/space_view3d.py b/release/scripts/ui/space_view3d.py index 37a2337fe13..c82ec5f0224 100644 --- a/release/scripts/ui/space_view3d.py +++ b/release/scripts/ui/space_view3d.py @@ -849,7 +849,6 @@ class VIEW3D_MT_paint_vertex(bpy.types.Menu): layout = self.layout layout.operator("paint.vertex_color_set") - layout.operator("paint.vertex_color_set", text="Set Selected Vertex Colors").selected = True class VIEW3D_MT_hook(bpy.types.Menu): diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 703ed118a58..5443a5b4513 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -112,7 +112,7 @@ void boundbox_set_from_min_max(struct BoundBox *bb, float min[3], float max[3]); struct BoundBox *object_get_boundbox(struct Object *ob); void object_boundbox_flag(struct Object *ob, int flag, int set); void minmax_object(struct Object *ob, float *min, float *max); -void minmax_object_duplis(struct Scene *scene, struct Object *ob, float *min, float *max); +int minmax_object_duplis(struct Scene *scene, struct Object *ob, float *min, float *max); void solve_tracking (struct Object *ob, float targetmat[][4]); int ray_hit_boundbox(struct BoundBox *bb, float ray_start[3], float ray_normal[3]); diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 88aaf054aec..1c0f9390496 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -2373,25 +2373,37 @@ void minmax_object(Object *ob, float *min, float *max) } } -/* TODO - use dupli objects bounding boxes */ -void minmax_object_duplis(Scene *scene, Object *ob, float *min, float *max) +int minmax_object_duplis(Scene *scene, Object *ob, float *min, float *max) { + int ok= 0; if ((ob->transflag & OB_DUPLI)==0) { - return; + return ok; } else { ListBase *lb; DupliObject *dob; lb= object_duplilist(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); + if(dob->no_draw == 0) { + BoundBox *bb= object_get_boundbox(dob->ob); + + if(bb) { + int i; + for(i=0; i<8; i++) { + float vec[3]; + mul_v3_m4v3(vec, dob->mat, bb->vec[i]); + DO_MINMAX(vec, min, max); + // print_v3(dob->ob->id.name, vec); // some dupligroups give odd results - campbell + } + + ok= 1; + } } } free_object_duplilist(lb); /* does restore */ } + + return ok; } diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c index 19eb782884d..02a29b4423e 100644 --- a/source/blender/editors/mesh/editface.c +++ b/source/blender/editors/mesh/editface.c @@ -450,52 +450,28 @@ void selectswap_tface(Scene *scene) // XXX notifier! object_tface_flags_changed(OBACT, 0); } -int minmax_tface(Scene *scene, float *min, float *max) +int minmax_tface(Scene *scene, Object *ob, float *min, float *max) { - Object *ob; - Mesh *me; + Mesh *me= get_mesh(ob); MFace *mf; - MTFace *tf; MVert *mv; int a, ok=0; - float vec[3], bmat[3][3]; - - ob = OBACT; - if (ob==0) return ok; - me= get_mesh(ob); - if(me==0 || me->mtface==0) return ok; - - copy_m3_m4(bmat, ob->obmat); + float vec[3]; + + if(me==NULL) + return ok; mv= me->mvert; mf= me->mface; - tf= me->mtface; - for (a=me->totface; a>0; a--, mf++, tf++) { - if (mf->flag & ME_HIDE || !(mf->flag & ME_FACE_SEL)) - continue; - - VECCOPY(vec, (mv+mf->v1)->co); - mul_m3_v3(bmat, vec); - add_v3_v3v3(vec, vec, ob->obmat[3]); - DO_MINMAX(vec, min, max); - - VECCOPY(vec, (mv+mf->v2)->co); - mul_m3_v3(bmat, vec); - add_v3_v3v3(vec, vec, ob->obmat[3]); - DO_MINMAX(vec, min, max); - - VECCOPY(vec, (mv+mf->v3)->co); - mul_m3_v3(bmat, vec); - add_v3_v3v3(vec, vec, ob->obmat[3]); - DO_MINMAX(vec, min, max); - - if (mf->v4) { - VECCOPY(vec, (mv+mf->v4)->co); - mul_m3_v3(bmat, vec); - add_v3_v3v3(vec, vec, ob->obmat[3]); - DO_MINMAX(vec, min, max); + for (a=me->totface; a>0; a--, mf++) { + if ((mf->flag & ME_HIDE || !(mf->flag & ME_FACE_SEL)) == 0) { + int i= mf->v4 ? 3:2; + do { + mul_v3_m4v3(vec, ob->obmat, (mv + (*(&mf->v1 + i)))->co); + DO_MINMAX(vec, min, max); + } while (i--); + ok= 1; } - ok= 1; } return ok; } diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 0c2e64f9799..bbccddd0257 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -1384,7 +1384,7 @@ static int viewselected_exec(bContext *C, wmOperator *op) /* like a localview wi } } else if (paint_facesel_test(ob)) { -// XXX ok= minmax_tface(min, max); + ok= minmax_tface(scene, ob, min, max); } else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT)) { ok= PE_minmax(scene, min, max); @@ -1393,9 +1393,10 @@ static int viewselected_exec(bContext *C, wmOperator *op) /* like a localview wi Base *base= FIRSTBASE; while(base) { if(TESTBASE(v3d, base)) { - minmax_object(base->object, min, max); + /* account for duplis */ - minmax_object_duplis(scene, base->object, min, max); + if (minmax_object_duplis(scene, base->object, min, max)==0) + minmax_object(base->object, min, max); /* use if duplis not found */ ok= 1; } |