[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54249] trunk/blender/source/blender: Fix #34070: set origin operator did not work for lattice objects.

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Feb 1 16:17:42 CET 2013


Revision: 54249
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54249
Author:   blendix
Date:     2013-02-01 15:17:39 +0000 (Fri, 01 Feb 2013)
Log Message:
-----------
Fix #34070: set origin operator did not work for lattice objects.

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

Modified: trunk/blender/source/blender/blenkernel/BKE_lattice.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_lattice.h	2013-02-01 08:24:18 UTC (rev 54248)
+++ trunk/blender/source/blender/blenkernel/BKE_lattice.h	2013-02-01 15:17:39 UTC (rev 54249)
@@ -75,5 +75,10 @@
 
 struct MDeformVert *BKE_lattice_deform_verts_get(struct Object *lattice);
 
+void BKE_lattice_minmax(struct Lattice *lt, float min[3], float max[3]);
+void BKE_lattice_center_median(struct Lattice *lt, float cent[3]);
+void BKE_lattice_center_bounds(struct Lattice *lt, float cent[3]);
+void BKE_lattice_translate(struct Lattice *lt, float offset[3], int do_keys);
+
 #endif
 

Modified: trunk/blender/source/blender/blenkernel/intern/lattice.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/lattice.c	2013-02-01 08:24:18 UTC (rev 54248)
+++ trunk/blender/source/blender/blenkernel/intern/lattice.c	2013-02-01 15:17:39 UTC (rev 54249)
@@ -1003,3 +1003,66 @@
 	if (lt->editlatt) lt = lt->editlatt->latt;
 	return lt->dvert;
 }
+
+void BKE_lattice_center_median(struct Lattice *lt, float cent[3])
+{
+	int i, numVerts;
+
+	if (lt->editlatt) lt = lt->editlatt->latt;
+	numVerts = lt->pntsu * lt->pntsv * lt->pntsw;
+
+	zero_v3(cent);
+
+	for (i = 0; i < numVerts; i++)
+		add_v3_v3(cent, lt->def[i].vec);
+
+	mul_v3_fl(cent, 1.0f / (float)numVerts);
+}
+
+void BKE_lattice_minmax(struct Lattice *lt, float min[3], float max[3])
+{
+	int i, numVerts;
+
+	if (lt->editlatt) lt = lt->editlatt->latt;
+	numVerts = lt->pntsu * lt->pntsv * lt->pntsw;
+
+	for (i = 0; i < numVerts; i++)
+		minmax_v3v3_v3(min, max, lt->def[i].vec);
+}
+
+void BKE_lattice_center_bounds(struct Lattice *lt, float cent[3])
+{
+	float min[3], max[3];
+
+	INIT_MINMAX(min, max);
+
+	BKE_lattice_minmax(lt, min, max);
+	mid_v3_v3v3(cent, min, max);
+}
+
+void BKE_lattice_translate(Lattice *lt, float offset[3], int do_keys)
+{
+	int i, numVerts;
+
+	numVerts = lt->pntsu * lt->pntsv * lt->pntsw;
+
+	if (lt->def)
+		for (i = 0; i < numVerts; i++)
+			add_v3_v3(lt->def[i].vec, offset);
+
+	if (lt->editlatt)
+		for (i = 0; i < numVerts; i++)
+			add_v3_v3(lt->editlatt->latt->def[i].vec, offset);
+
+	if (do_keys && lt->key) {
+		KeyBlock *kb;
+
+		for (kb = lt->key->block.first; kb; kb = kb->next) {
+			float *fp = kb->data;
+			for (i = kb->totelem; i--; fp += 3) {
+				add_v3_v3(fp, offset);
+			}
+		}
+	}
+}
+

Modified: trunk/blender/source/blender/editors/object/object_transform.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_transform.c	2013-02-01 08:24:18 UTC (rev 54248)
+++ trunk/blender/source/blender/editors/object/object_transform.c	2013-02-01 15:17:39 UTC (rev 54249)
@@ -899,7 +899,21 @@
 					break;
 				}
 			}
+			else if (ob->type == OB_LATTICE) {
+				Lattice *lt = ob->data;
 
+				if (centermode == ORIGIN_TO_CURSOR) { /* done */ }
+				else if (around == V3D_CENTROID) { BKE_lattice_center_median(lt, cent); }
+				else { BKE_lattice_center_bounds(lt, cent); }
+
+				negate_v3_v3(cent_neg, cent);
+				BKE_lattice_translate(lt, cent_neg, 1);
+
+				tot_change++;
+				lt->id.flag |= LIB_DOIT;
+				do_inverse_offset = TRUE;
+			}
+
 			/* offset other selected objects */
 			if (do_inverse_offset && (centermode != GEOMETRY_TO_ORIGIN)) {
 				CollectionPointerLink *ctx_link_other;




More information about the Bf-blender-cvs mailing list