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.
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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]);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user