view selected now uses boundboxes of dupli-objects and ignores centerpoints of the...
authorCampbell Barton <ideasman42@gmail.com>
Wed, 24 Feb 2010 20:11:35 +0000 (20:11 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 24 Feb 2010 20:11:35 +0000 (20:11 +0000)
release/scripts/ui/space_view3d.py
source/blender/blenkernel/BKE_object.h
source/blender/blenkernel/intern/object.c
source/blender/editors/mesh/editface.c
source/blender/editors/space_view3d/view3d_edit.c

index 37a2337fe135aa0effdcc23360b70195c2dd909c..c82ec5f0224e5e3c9a38431f5d4f753ac8d949bc 100644 (file)
@@ -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):
index 703ed118a5878b81e075c258e32d5f586fbeb7cb..5443a5b451372c55905807801d2dc5825fc27c4c 100644 (file)
@@ -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]);
 
index 88aaf054aeca555db5cfe6d0003ea7f6b6a2a6c5..1c0f9390496d6a5d46077343962aed15f2a9963b 100644 (file)
@@ -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;
 }
 
 
index 19eb782884d776900585d1caa0738d4ad65100d3..02a29b4423e866f509b5298cd13a3c38d9d9a892 100644 (file)
@@ -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;
 }
index 0c2e64f97998acb2e9649dcdf98b2d395ed03e5e..bbccddd02579277a242e2f2c28d1b559b726fd5f 100644 (file)
@@ -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;
                        }