Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2010-02-24 23:11:35 +0300
committerCampbell Barton <ideasman42@gmail.com>2010-02-24 23:11:35 +0300
commit99b288da967520e5f8ba6585f982c5c62c36df58 (patch)
tree9b52892ceeb0e8f004171a1d299e61f411e4ea82 /source
parentaebe86bef1e13e3ce0a4d7a67b7cf5f6d9c1cd66 (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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_object.h2
-rw-r--r--source/blender/blenkernel/intern/object.c26
-rw-r--r--source/blender/editors/mesh/editface.c52
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c7
4 files changed, 38 insertions, 49 deletions
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;
}