[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23876] trunk/blender/source/blender/ editors/transform: X Mirror editmesh with PET

Martin Poirier theeth at yahoo.com
Thu Oct 15 23:54:22 CEST 2009


Revision: 23876
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23876
Author:   theeth
Date:     2009-10-15 23:54:22 +0200 (Thu, 15 Oct 2009)

Log Message:
-----------
X Mirror editmesh with PET

Lock vertice near the middle (|x| < 0.0001) on the mirror's plane.
Don't propagate transformation across mirror plane (this could probably be smarter)

Modified Paths:
--------------
    trunk/blender/source/blender/editors/transform/transform.h
    trunk/blender/source/blender/editors/transform/transform_conversions.c
    trunk/blender/source/blender/editors/transform/transform_generics.c

Modified: trunk/blender/source/blender/editors/transform/transform.h
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.h	2009-10-15 20:38:35 UTC (rev 23875)
+++ trunk/blender/source/blender/editors/transform/transform.h	2009-10-15 21:54:22 UTC (rev 23876)
@@ -215,7 +215,7 @@
 	TransDataExtension *ext;	/* for objects, poses. 1 single malloc per TransInfo! */
 	TransDataCurveHandleFlags *hdata; /* for curves, stores handle flags for modification/cancel */
 	void  *extra;		 /* extra data (mirrored element pointer, in editmode mesh to EditVert) (editbone for roll fixing) (...) */
-    short  flag;         /* Various flags */
+    int  flag;         /* Various flags */
 	short  protectflag;	 /* If set, copy of Object or PoseChannel protection */
 	int    rotOrder;	/* rotation mode,  as defined in eRotationModes (DNA_action_types.h) */
 } TransData;
@@ -289,6 +289,8 @@
 	short		current_orientation;
 
 	short		prop_mode;
+	
+	short		mirror;
 
 	float		values[4];
 	float		auto_values[4];
@@ -398,6 +400,7 @@
 #define TD_NO_LOC			(1 << 13)	/* when this is set, don't apply translation changes to this element */
 #define TD_NOTIMESNAP		(1 << 14)	/* for Graph Editor autosnap, indicates that point should not undergo autosnapping */
 #define TD_INTVALUES	 	(1 << 15) 	/* for Graph Editor - curves that can only have int-values need their keyframes tagged with this */
+#define TD_MIRROR_EDGE	 	(1 << 16) 	/* For editmode mirror, clamp to x = 0 */
 
 /* transsnap->status */
 #define SNAP_ON			1

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c	2009-10-15 20:38:35 UTC (rev 23875)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c	2009-10-15 21:54:22 UTC (rev 23876)
@@ -2214,7 +2214,10 @@
 		for (eve=em->verts.first; eve; eve=eve->next) {
 			if(eve->h==0 && eve->f1 && eve->co[0]!=0.0f) {
 				if(eve->co[0]<0.0f)
+				{
+					t->mirror = -1;
 					mirror = -1;
+				}
 				break;
 			}
 		}
@@ -2280,6 +2283,19 @@
 			}
 		}
 	}
+	
+	if (mirror != 0)
+	{
+		tob = t->data;
+		for( a = 0; a < t->total; a++, tob++ )
+		{
+			if (ABS(tob->loc[0]) <= 0.00001f)
+			{
+				tob->flag |= TD_MIRROR_EDGE;
+			}
+		}
+	}
+	
 	if (propmode) {
 		MEM_freeN(vectors);
 		MEM_freeN(nears);

Modified: trunk/blender/source/blender/editors/transform/transform_generics.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_generics.c	2009-10-15 20:38:35 UTC (rev 23875)
+++ trunk/blender/source/blender/editors/transform/transform_generics.c	2009-10-15 21:54:22 UTC (rev 23876)
@@ -259,11 +259,16 @@
 			continue;
 		
 		eve = td->extra;
-		if(eve) {
+		if (eve) {
 			eve->co[0]= -td->loc[0];
 			eve->co[1]= td->loc[1];
 			eve->co[2]= td->loc[2];
 		}
+		
+		if (td->flag & TD_MIRROR_EDGE)
+		{
+			td->loc[0] = 0;
+		}
 	}
 }
 
@@ -969,6 +974,7 @@
 		if (RNA_boolean_get(op->ptr, "mirror"))
 		{
 			t->flag |= T_MIRROR;
+			t->mirror = 1;
 		}
 	}
 	// Need stuff to take it from edit mesh or whatnot here
@@ -977,6 +983,7 @@
 		if (t->obedit && t->obedit->type == OB_MESH && (((Mesh *)t->obedit->data)->editflag & ME_EDIT_MIRROR_X))
 		{
 			t->flag |= T_MIRROR;
+			t->mirror = 1;
 		}
 	}
 	
@@ -1373,6 +1380,12 @@
 			if (td->flag & TD_SELECTED) {
 				td->factor = 1.0f;
 			}
+			else if (t->flag & T_MIRROR && td->loc[0] * t->mirror < -0.00001f)
+			{
+				td->flag |= TD_SKIP;
+				td->factor = 0.0f;
+				restoreElement(td);
+			}
 			else if	((connected &&
 						(td->flag & TD_NOTCONNECTED || td->dist > t->prop_size))
 				||





More information about the Bf-blender-cvs mailing list