[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13389] trunk/blender/source/blender: === Mirror Tool ===

Martin Poirier theeth at yahoo.com
Thu Jan 24 21:11:54 CET 2008


Revision: 13389
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13389
Author:   theeth
Date:     2008-01-24 21:11:54 +0100 (Thu, 24 Jan 2008)

Log Message:
-----------
=== Mirror Tool ===

Making the mirror tool axis selection interactive instead of using a popmenu.

Mirror is now just a constant -1 scaling transform, which enables you to choose the mirror axis through hotkeys (x,y,z) and with MMB. It also means it's easier to select the correct axis if you're not sure which is which and gives access to all the orientation supported in transform (including custom user orientations).

Mesh and Object header menus still have the individual axis as options but have an added "Interactive Mirror" which just enters transform and lets user pick the axis there. Ctrl-M enters "Interactive Mirror" too.

In a nutshell, this changes adds more possible mirroring axis and unifies the mirror axis selection process with transform constraint axis selection.

Modified Paths:
--------------
    trunk/blender/source/blender/include/BIF_transform.h
    trunk/blender/source/blender/include/transform.h
    trunk/blender/source/blender/src/editobject.c
    trunk/blender/source/blender/src/header_view3d.c
    trunk/blender/source/blender/src/transform.c

Modified: trunk/blender/source/blender/include/BIF_transform.h
===================================================================
--- trunk/blender/source/blender/include/BIF_transform.h	2008-01-24 15:41:21 UTC (rev 13388)
+++ trunk/blender/source/blender/include/BIF_transform.h	2008-01-24 20:11:54 UTC (rev 13389)
@@ -68,10 +68,10 @@
 #define CTX_NO_PET			4
 #define CTX_TWEAK			8
 #define CTX_NO_MIRROR		16
+#define CTX_AUTOCONFIRM		32
 
 void initTransform(int mode, int context);
 void Transform(void);
-void Mirror(short mode);
 
 /* Standalone call to get the transformation center corresponding to the current situation
  * returns 1 if successful, 0 otherwise (usually means there's no selection)

Modified: trunk/blender/source/blender/include/transform.h
===================================================================
--- trunk/blender/source/blender/include/transform.h	2008-01-24 15:41:21 UTC (rev 13388)
+++ trunk/blender/source/blender/include/transform.h	2008-01-24 20:11:54 UTC (rev 13389)
@@ -363,6 +363,9 @@
 void initBakeTime(TransInfo *t);
 int BakeTime(TransInfo *t, short mval[2]);
 
+void initMirror(TransInfo *t);
+int Mirror(TransInfo *t, short mval[2]);
+
 /*********************** transform_conversions.c ********** */
 struct ListBase;
 void flushTransIpoData(TransInfo *t);

Modified: trunk/blender/source/blender/src/editobject.c
===================================================================
--- trunk/blender/source/blender/src/editobject.c	2008-01-24 15:41:21 UTC (rev 13388)
+++ trunk/blender/source/blender/src/editobject.c	2008-01-24 20:11:54 UTC (rev 13389)
@@ -5574,17 +5574,9 @@
 	if(G.f & G_PARTICLEEDIT) {
 		PE_mirror_x(0);
 	}
-	else if (G.obedit==0) {
-		mode=pupmenu("Mirror Axis %t|X Local%x4|Y Local%x5|Z Local%x6|");
-
-		if (mode==-1) return; /* return */
-		Mirror(mode); /* separating functionality from interface | call*/
-	}
 	else {
-		mode=pupmenu("Mirror Axis %t|X Global%x1|Y Global%x2|Z Global%x3|%l|X Local%x4|Y Local%x5|Z Local%x6|%l|X View%x7|Y View%x8|Z View%x9|");
-
-		if (mode==-1) return; /* return */
-		Mirror(mode); /* separating functionality from interface | call*/
+		initTransform(TFM_MIRROR, CTX_NO_PET);
+		Transform();
 	}
 }
 

Modified: trunk/blender/source/blender/src/header_view3d.c
===================================================================
--- trunk/blender/source/blender/src/header_view3d.c	2008-01-24 15:41:21 UTC (rev 13388)
+++ trunk/blender/source/blender/src/header_view3d.c	2008-01-24 20:11:54 UTC (rev 13389)
@@ -1881,10 +1881,24 @@
 void do_view3d_object_mirrormenu(void *arg, int event)
 {
 	switch(event) {
+		case 0:
+			initTransform(TFM_MIRROR, CTX_NO_PET);
+			Transform();
+			break;
 		case 1:
+			initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+			BIF_setLocalAxisConstraint('X', " on X axis");
+			Transform();
+			break;
 		case 2:
+			initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+			BIF_setLocalAxisConstraint('Y', " on Y axis");
+			Transform();
+			break;
 		case 3:
-			Mirror(event + 3); /* + 3 because the first three modes are global*/
+			initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+			BIF_setLocalAxisConstraint('Z', " on Z axis");
+			Transform();
 			break;
 	}
 	allqueue(REDRAWVIEW3D, 0);
@@ -1898,9 +1912,11 @@
 	block= uiNewBlock(&curarea->uiblocks, "view3d_object_mirrormenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
 	uiBlockSetButmFunc(block, do_view3d_object_mirrormenu, NULL);
 	
-	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, 1",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
-	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, 2",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, 3",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Interactive Mirror|Ctrl M",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
+	uiDefBut(block, SEPR, 0, "",				0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, X",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
+	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, Y",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
+	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, Z",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
 
 	uiBlockSetDirection(block, UI_RIGHT);
 	uiTextBoundsBlock(block, 60);
@@ -2853,17 +2869,44 @@
 
 void do_view3d_edit_mirrormenu(void *arg, int event)
 {
+	float mat[3][3];
+	
+	Mat3One(mat);
+	
 	switch(event) {
+		case 0:
+			initTransform(TFM_MIRROR, CTX_NO_PET);
+			Transform();
+			break;
 		case 1:
+			initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+			BIF_setSingleAxisConstraint(mat[0], " on global X axis");
+			Transform();
+			break;
 		case 2:
+			initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+			BIF_setSingleAxisConstraint(mat[1], " on global Y axis");
+			Transform();
+			break;
 		case 3:
+			initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+			BIF_setSingleAxisConstraint(mat[2], "on global Z axis");
+			Transform();
+			break;
 		case 4:
+			initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+			BIF_setLocalAxisConstraint('X', " on local X axis");
+			Transform();
+			break;
 		case 5:
+			initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+			BIF_setLocalAxisConstraint('Y', " on local Y axis");
+			Transform();
+			break;
 		case 6:
-		case 7:
-		case 8:
-		case 9:
-			Mirror(event);
+			initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
+			BIF_setLocalAxisConstraint('Z', " on local Z axis");
+			Transform();
 			break;
 	}
 	allqueue(REDRAWVIEW3D, 0);
@@ -2877,21 +2920,19 @@
 	block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mirrormenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
 	uiBlockSetButmFunc(block, do_view3d_edit_mirrormenu, NULL);
 	
-	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|Ctrl M, 1",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
-	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|Ctrl M, 2",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|Ctrl M, 3",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-	
+	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Interactive Mirror|Ctrl M",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
+
 	uiDefBut(block, SEPR, 0, "",				0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 	
-	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, 4",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
-	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, 5",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
-	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, 6",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
+	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|Ctrl M, X",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
+	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|Ctrl M, Y",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
+	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|Ctrl M, Z",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
 	
 	uiDefBut(block, SEPR, 0, "",				0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
 	
-	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X View|Ctrl M, 7",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
-	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y View|Ctrl M, 8",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
-	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z View|Ctrl M, 9",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
+	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, X X",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
+	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, Y Y",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
+	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, Z Z",			0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
 
 	uiBlockSetDirection(block, UI_RIGHT);
 	uiTextBoundsBlock(block, 60);

Modified: trunk/blender/source/blender/src/transform.c
===================================================================
--- trunk/blender/source/blender/src/transform.c	2008-01-24 15:41:21 UTC (rev 13388)
+++ trunk/blender/source/blender/src/transform.c	2008-01-24 20:11:54 UTC (rev 13389)
@@ -888,6 +888,8 @@
 			return "Time Slide";
 		case TFM_BAKE_TIME:
 			return "Key Time";
+		case TFM_MIRROR:
+			return "Mirror";
 	}
 	return "Transform";
 }
@@ -1323,6 +1325,9 @@
 	case TFM_BAKE_TIME:
 		initBakeTime(&Trans);
 		break;
+	case TFM_MIRROR:
+		initMirror(&Trans);
+		break;
 	}
 }
 
@@ -1359,6 +1364,13 @@
 			}
 			Trans.redraw = 0;
 		}
+
+		/* If auto confirm is on, break after one pass */		
+		if (Trans.context & CTX_AUTOCONFIRM)
+		{
+			Trans.state = TRANS_CONFIRM;
+			break;
+		}
 		
 		/* essential for idling subloop */
 		if( qtest()==0) PIL_sleep_ms(2);
@@ -4033,105 +4045,84 @@
 	return 1;
 }
 
-
 /* ************************** MIRROR *************************** */
 
-void Mirror(short mode) 
+void initMirror(TransInfo *t) 
 {
+	t->flag |= T_NULL_ONE;
+	if (!G.obedit) {
+		t->flag |= T_NO_ZERO;
+	}
+	
+	t->transform = Mirror;
+	t->fac = 0.1f;
+}
+
+int Mirror(TransInfo *t, short mval[2]) 
+{
 	TransData *td;
-	float mati[3][3], matview[3][3], mat[3][3];
-	float size[3];
+	float size[3], mat[3][3];
 	int i;
+	char str[200];
 
-	Trans.context = CTX_NO_PET;
+	/*
+	 * OPTIMISATION:
+	 * This still recalcs transformation on mouse move
+	 * while it should only recalc on constraint change
+	 * */
 
-	initTrans(&Trans);		// internal data, mouse, vectors
-
-	Mat3One(mati);
-	Mat3CpyMat4(matview, Trans.viewinv); // t->viewinv was set in initTrans
-	Mat3Ortho(matview);
-
-	createTransData(&Trans);	// make TransData structs from selection
-
-	calculatePropRatio(&Trans);
-	calculateCenter(&Trans);
-
-	initResize(&Trans);
-
-	if (Trans.total == 0) {
-		postTrans(&Trans);
-		return;
+	/* if an axis has been selected */
+	if (t->con.mode & CON_APPLY) {
+		if (t->con.applySize) {
+			t->con.applySize(t, NULL, mat);
+		}
+		
+		sprintf(str, "Mirror%s", t->con.text);
+	
+		size[0] = size[1] = size[2] = -1;
+	
+		SizeToMat3(size, mat);
+		
+		for(i = 0, td=t->data; i < t->total; i++, td++) {
+			if (td->flag & TD_NOACTION)
+				break;
+	

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list