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
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-06-28 22:19:55 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-06-28 22:19:55 +0400
commitb6ffc681b1813ff0f13900a21b1c38d1055c0aef (patch)
treec7dab441ff53c8a591bd13d857ca278dd63ed206 /source/blender/blenkernel
parentc776d5e003a956ddc0e11d36f99b8b242de941b7 (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')
-rw-r--r--source/blender/blenkernel/BKE_mball.h8
-rw-r--r--source/blender/blenkernel/intern/mball.c42
-rw-r--r--source/blender/blenkernel/intern/object.c13
3 files changed, 56 insertions, 7 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) {