diff options
-rw-r--r-- | source/blender/blenkernel/BKE_mball.h | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mball.c | 42 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 13 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_snap.c | 24 |
4 files changed, 63 insertions, 24 deletions
diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h index 9bbff515983..44459300c56 100644 --- a/source/blender/blenkernel/BKE_mball.h +++ b/source/blender/blenkernel/BKE_mball.h @@ -57,9 +57,11 @@ float *BKE_mball_make_orco(struct Object *ob, struct ListBase *dispbase); void BKE_mball_properties_copy(struct Scene *scene, struct Object *active_object); -int BKE_mball_minmax(struct MetaBall *mb, float min[3], float max[3]); -int BKE_mball_center_median(struct MetaBall *mb, float r_cent[3]); -int BKE_mball_center_bounds(struct MetaBall *mb, float r_cent[3]); +bool BKE_mball_minmax(struct MetaBall *mb, float min[3], float max[3]); +bool BKE_mball_minmax_ex(struct MetaBall *mb, float min[3], float max[3], + float obmat[4][4], const short flag); +bool BKE_mball_center_median(struct MetaBall *mb, float r_cent[3]); +bool BKE_mball_center_bounds(struct MetaBall *mb, float r_cent[3]); void BKE_mball_translate(struct MetaBall *mb, const float offset[3]); struct MetaElem *BKE_mball_element_add(struct MetaBall *mb, const int type); 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]; diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index c8882ef0e9c..bb160cff86a 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -2313,7 +2313,7 @@ void BKE_object_minmax(Object *ob, float min_r[3], float max_r[3], const bool us BoundBox bb; float vec[3]; int a; - short change = FALSE; + bool change = false; switch (ob->type) { case OB_CURVE: @@ -2390,6 +2390,17 @@ void BKE_object_minmax(Object *ob, float min_r[3], float max_r[3], const bool us } } break; + case OB_MBALL: + { + float ob_min[3], ob_max[3]; + + change = BKE_mball_minmax_ex(ob->data, ob_min, ob_max, ob->obmat, 0); + if (change) { + minmax_v3v3_v3(min_r, max_r, ob_min); + minmax_v3v3_v3(min_r, max_r, ob_max); + } + break; + } } if (change == FALSE) { diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c index b9d75b12333..1678487d8bf 100644 --- a/source/blender/editors/space_view3d/view3d_snap.c +++ b/source/blender/editors/space_view3d/view3d_snap.c @@ -54,6 +54,7 @@ #include "BKE_depsgraph.h" #include "BKE_lattice.h" #include "BKE_main.h" +#include "BKE_mball.h" #include "BKE_object.h" #include "BKE_editmesh.h" #include "BKE_DerivedMesh.h" @@ -1091,25 +1092,14 @@ bool ED_view3d_minmax_verts(Object *obedit, float min[3], float max[3]) /* metaballs are an exception */ if (obedit->type == OB_MBALL) { - const float scale = mat4_to_scale(obedit->obmat); - MetaBall *mb = obedit->data; - MetaElem *ml; - bool change = false; + float ob_min[3], ob_max[3]; + bool change; - for (ml = mb->elems.first; ml; ml = ml->next) { - if (ml->flag & SELECT) { - const float scale_mb = ml->rad * scale; - int i; - mul_v3_m4v3(centroid, obedit->obmat, &ml->x); - 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; - } + change = BKE_mball_minmax_ex(obedit->data, ob_min, ob_max, obedit->obmat, SELECT); + if (change) { + minmax_v3v3_v3(min, max, ob_min); + minmax_v3v3_v3(min, max, ob_max); } - return change; } |