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:
authorSergey Sharybin <sergey.vfx@gmail.com>2012-02-26 12:55:31 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2012-02-26 12:55:31 +0400
commitf268918d504e6c25de6c85e3cfa0a6e8e06aaf8f (patch)
treeb3602e68590662c08fbc9e16f781fc4d460e8733 /source/blender
parent8285fef0e88e1816bf57b6e14cb659584344c99d (diff)
Fix #30337: missed Set Origin for Metaball
Implemented Set Origin operator for Meta Balls.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/BKE_mball.h5
-rw-r--r--source/blender/blenkernel/intern/mball.c52
-rw-r--r--source/blender/editors/object/object_transform.c23
3 files changed, 80 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h
index e3b5a006edf..0bfbec9f1b9 100644
--- a/source/blender/blenkernel/BKE_mball.h
+++ b/source/blender/blenkernel/BKE_mball.h
@@ -174,5 +174,10 @@ void *new_pgn_element(int size);
int nextcwedge (int edge, int face);
void BKE_freecubetable(void);
+int BKE_metaball_minmax(struct MetaBall *mb, float min[3], float max[3]);
+int BKE_metaball_center_median(struct MetaBall *mb, float cent[3]);
+int BKE_metaball_center_bounds(struct MetaBall *mb, float cent[3]);
+void BKE_metaball_translate(struct MetaBall *mb, float offset[3]);
+
#endif
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index 7f05aaed9b0..2e8c026b75e 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -2282,3 +2282,55 @@ void metaball_polygonize(Scene *scene, Object *ob, ListBase *dispbase)
freepolygonize(&mbproc);
}
+/* basic vertex data functions */
+int BKE_metaball_minmax(MetaBall *mb, float min[3], float max[3])
+{
+ MetaElem *ml;
+
+ INIT_MINMAX(min, max);
+
+ for (ml = mb->elems.first; ml; ml = ml->next) {
+ DO_MINMAX(&ml->x, min, max);
+ }
+
+ return (mb->elems.first != NULL);
+}
+
+int BKE_metaball_center_median(MetaBall *mb, float cent[3])
+{
+ MetaElem *ml;
+ int total= 0;
+
+ zero_v3(cent);
+
+ for (ml = mb->elems.first; ml; ml = ml->next) {
+ add_v3_v3(cent, &ml->x);
+ }
+
+ if (total)
+ mul_v3_fl(cent, 1.0f/(float)total);
+
+ return (total != 0);
+}
+
+int BKE_metaball_center_bounds(MetaBall *mb, float cent[3])
+{
+ float min[3], max[3];
+
+ if (BKE_metaball_minmax(mb, min, max)) {
+ mid_v3_v3v3(cent, min, max);
+ return 1;
+ }
+
+ return 0;
+}
+
+void BKE_metaball_translate(MetaBall *mb, float offset[3])
+{
+ MetaElem *ml;
+ int i;
+
+ for (ml = mb->elems.first; ml; ml = ml->next) {
+ add_v3_v3(&ml->x, offset);
+ }
+}
diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c
index aac8ef4c5e3..45db21749a5 100644
--- a/source/blender/editors/object/object_transform.c
+++ b/source/blender/editors/object/object_transform.c
@@ -36,6 +36,7 @@
#include "DNA_key_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_meta_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_group_types.h"
@@ -48,6 +49,7 @@
#include "BKE_curve.h"
#include "BKE_depsgraph.h"
#include "BKE_main.h"
+#include "BKE_mball.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
#include "BKE_report.h"
@@ -836,6 +838,27 @@ static int object_origin_set_exec(bContext *C, wmOperator *op)
break;
}
}
+ else if (ob->type == OB_MBALL) {
+ MetaBall *mb = ob->data;
+
+ if(centermode == ORIGIN_TO_CURSOR) { /* done */ }
+ else if(around==V3D_CENTROID) { BKE_metaball_center_median(mb, cent); }
+ else { BKE_metaball_center_bounds(mb, cent); }
+
+ negate_v3_v3(cent_neg, cent);
+ BKE_metaball_translate(mb, cent_neg);
+
+ tot_change++;
+ mb->id.flag |= LIB_DOIT;
+ do_inverse_offset= TRUE;
+
+ if(obedit) {
+ if (centermode == GEOMETRY_TO_ORIGIN) {
+ DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
+ }
+ break;
+ }
+ }
/* offset other selected objects */
if(do_inverse_offset && (centermode != GEOMETRY_TO_ORIGIN)) {