diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-06-28 22:19:55 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-06-28 22:19:55 +0400 |
commit | b6ffc681b1813ff0f13900a21b1c38d1055c0aef (patch) | |
tree | c7dab441ff53c8a591bd13d857ca278dd63ed206 /source/blender/blenkernel/intern/mball.c | |
parent | c776d5e003a956ddc0e11d36f99b8b242de941b7 (diff) |
view-selected didnt work for metaballs in object mode (radius from previous commit was 2x too large too).
Diffstat (limited to 'source/blender/blenkernel/intern/mball.c')
-rw-r--r-- | source/blender/blenkernel/intern/mball.c | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index 8361f0c4f6c..31212c3a6b7 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -2375,8 +2375,44 @@ void BKE_mball_polygonize(Scene *scene, Object *ob, ListBase *dispbase) freepolygonize(&process); } +bool BKE_mball_minmax_ex(MetaBall *mb, float min[3], float max[3], + float obmat[4][4], const short flag) +{ + const float scale = obmat ? mat4_to_scale(obmat) : 1.0f; + MetaElem *ml; + bool change = false; + float centroid[3], vec[3]; + + INIT_MINMAX(min, max); + + for (ml = mb->elems.first; ml; ml = ml->next) { + if ((ml->flag & flag) == flag) { + const float scale_mb = (ml->rad * 0.5f) * scale; + int i; + + if (obmat) { + mul_v3_m4v3(centroid, obmat, &ml->x); + } + else { + copy_v3_v3(centroid, &ml->x); + } + + /* TODO, non circle shapes cubes etc, probably nobody notices - campbell */ + for (i = -1; i != 3; i += 2) { + copy_v3_v3(vec, centroid); + add_v3_fl(vec, scale_mb * i); + minmax_v3v3_v3(min, max, vec); + } + change = true; + } + } + + return change; +} + + /* basic vertex data functions */ -int BKE_mball_minmax(MetaBall *mb, float min[3], float max[3]) +bool BKE_mball_minmax(MetaBall *mb, float min[3], float max[3]) { MetaElem *ml; @@ -2389,7 +2425,7 @@ int BKE_mball_minmax(MetaBall *mb, float min[3], float max[3]) return (mb->elems.first != NULL); } -int BKE_mball_center_median(MetaBall *mb, float r_cent[3]) +bool BKE_mball_center_median(MetaBall *mb, float r_cent[3]) { MetaElem *ml; int total = 0; @@ -2407,7 +2443,7 @@ int BKE_mball_center_median(MetaBall *mb, float r_cent[3]) return (total != 0); } -int BKE_mball_center_bounds(MetaBall *mb, float r_cent[3]) +bool BKE_mball_center_bounds(MetaBall *mb, float r_cent[3]) { float min[3], max[3]; |