[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44453] trunk/blender/source/blender: Fix #30337: missed Set Origin for Metaball

Sergey Sharybin sergey.vfx at gmail.com
Sun Feb 26 09:55:37 CET 2012


Revision: 44453
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44453
Author:   nazgul
Date:     2012-02-26 08:55:31 +0000 (Sun, 26 Feb 2012)
Log Message:
-----------
Fix #30337: missed Set Origin for Metaball

Implemented Set Origin operator for Meta Balls.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_mball.h
    trunk/blender/source/blender/blenkernel/intern/mball.c
    trunk/blender/source/blender/editors/object/object_transform.c

Modified: trunk/blender/source/blender/blenkernel/BKE_mball.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mball.h	2012-02-26 08:14:14 UTC (rev 44452)
+++ trunk/blender/source/blender/blenkernel/BKE_mball.h	2012-02-26 08:55:31 UTC (rev 44453)
@@ -174,5 +174,10 @@
 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
 

Modified: trunk/blender/source/blender/blenkernel/intern/mball.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mball.c	2012-02-26 08:14:14 UTC (rev 44452)
+++ trunk/blender/source/blender/blenkernel/intern/mball.c	2012-02-26 08:55:31 UTC (rev 44453)
@@ -2282,3 +2282,55 @@
 	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);
+	}
+}

Modified: trunk/blender/source/blender/editors/object/object_transform.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_transform.c	2012-02-26 08:14:14 UTC (rev 44452)
+++ trunk/blender/source/blender/editors/object/object_transform.c	2012-02-26 08:55:31 UTC (rev 44453)
@@ -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,7 +838,28 @@
 						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)) {
 				/* was the object data modified




More information about the Bf-blender-cvs mailing list