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 /source/blender/blenkernel | |
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.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_object.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 26 |
2 files changed, 20 insertions, 8 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; } |