[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11523] trunk/blender/source/blender: Small Transform code cleanup and addins for future features.

Martin Poirier theeth at yahoo.com
Thu Aug 9 03:07:28 CEST 2007


Revision: 11523
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11523
Author:   theeth
Date:     2007-08-09 03:07:27 +0200 (Thu, 09 Aug 2007)

Log Message:
-----------
Small Transform code cleanup and addins for future features.

- Removing evil InitTransModeFlags (I would always forget to update that when adding new stuff). It's properly done in the per transform init now.
- Add toggleable mode for Shear (with MMB) for horizontal or vertical shear. Toggle shear mode also changes the input mode from vertical to horizontal and vice versa (it's intuitiver that way). (This was suggested in a really old patch but never implemented because I disliked adding transform specific handling in the main event switch).
- Add custom event handlers per transform (currently only used for Shear)
- Add custom data pointer and freeing flag (only (a)bused by Shear).

NOTE to Levi Schooley: Some stuff in there might be useful for you.

Modified Paths:
--------------
    trunk/blender/source/blender/include/BIF_transform.h
    trunk/blender/source/blender/include/transform.h
    trunk/blender/source/blender/src/transform.c
    trunk/blender/source/blender/src/transform_conversions.c
    trunk/blender/source/blender/src/transform_generics.c

Modified: trunk/blender/source/blender/include/BIF_transform.h
===================================================================
--- trunk/blender/source/blender/include/BIF_transform.h	2007-08-08 23:14:03 UTC (rev 11522)
+++ trunk/blender/source/blender/include/BIF_transform.h	2007-08-09 01:07:27 UTC (rev 11523)
@@ -81,9 +81,12 @@
 void BIF_setDualAxisConstraint(float vec1[3], float vec2[3], char *text);
 void BIF_setLocalAxisConstraint(char axis, char *text);
 void BIF_setLocalLockConstraint(char axis, char *text);
+
+/* Drawing callbacks */
 void BIF_drawConstraint(void);
 void BIF_drawPropCircle(void);
 void BIF_drawSnap(void);
+
 void BIF_getPropCenter(float *center);
 
 void BIF_TransformSetUndo(char *str);

Modified: trunk/blender/source/blender/include/transform.h
===================================================================
--- trunk/blender/source/blender/include/transform.h	2007-08-08 23:14:03 UTC (rev 11522)
+++ trunk/blender/source/blender/include/transform.h	2007-08-09 01:07:27 UTC (rev 11523)
@@ -161,6 +161,8 @@
     float       fac;            /* factor for distance based transform  */
     int       (*transform)(struct TransInfo *, short *);
                                 /* transform function pointer           */
+	int       (*handleEvent)(struct TransInfo *, unsigned short event, short val);
+								/* event handler function pointer  RETURN 1 if redraw is needed */
     int         total;          /* total number of transformed data     */
     TransData  *data;           /* transformed data (array)             */
 	TransDataExtension *ext;	/* transformed data extension (array)   */
@@ -194,6 +196,8 @@
 	char		spacename[32];	/* name of the current space				*/
 	
 	struct Object *poseobj;		/* if t->flag & T_POSE, this denotes pose object */
+	
+	void       *customData;		/* Per Transform custom data */
 } TransInfo;
 
 
@@ -212,33 +216,38 @@
 #define TRANS_CANCEL	2
 
 /* transinfo->flag */
-#define T_OBJECT		1
-#define T_EDIT			2
-#define T_POSE			4
-#define T_TEXTURE		8
-#define T_CAMERA		16
+#define T_OBJECT		(1 << 0)
+#define T_EDIT			(1 << 1)
+#define T_POSE			(1 << 2)
+#define T_TEXTURE		(1 << 3)
+#define T_CAMERA		(1 << 4)
 		// when shift pressed, higher resolution transform. cannot rely on G.qual, need event!
-#define T_SHIFT_MOD		32
+#define T_SHIFT_MOD		(1 << 5)
 	 	// trans on points, having no rotation/scale 
-#define T_POINTS		64
+#define T_POINTS		(1 << 6)
 		// for manipulator exceptions, like scaling using center point, drawing help lines
-#define T_USES_MANIPULATOR	128
+#define T_USES_MANIPULATOR	(1 << 7)
 
 /* restrictions flags */
-#define T_ALL_RESTRICTIONS	(256|512|1024)
-#define T_NO_CONSTRAINT		256
-#define T_NULL_ONE			512
-#define T_NO_ZERO			1024
+#define T_ALL_RESTRICTIONS	((1 << 8)|(1 << 9)|(1 << 10))
+#define T_NO_CONSTRAINT		(1 << 8)
+#define T_NULL_ONE			(1 << 9)
+#define T_NO_ZERO			(1 << 10)
 
-#define T_PROP_EDIT			2048
-#define T_PROP_CONNECTED	4096
+#define T_PROP_EDIT			(1 << 11)
+#define T_PROP_CONNECTED	(1 << 12)
 
 /* if MMB is pressed or not */
-#define	T_MMB_PRESSED		8192
-#define T_V3D_ALIGN			16384
-#define T_2D_EDIT			32768 /* for 2d views like uv or ipo */
-#define T_CLIP_UV			65536
+#define	T_MMB_PRESSED		(1 << 13)
 
+#define T_V3D_ALIGN			(1 << 14)
+#define T_2D_EDIT			(1 << 15) /* for 2d views like uv or ipo */
+#define T_CLIP_UV			(1 << 16)
+
+#define T_FREE_CUSTOMDATA	(1 << 17)
+
+/* ******************************************************************************** */
+
 /* transinfo->con->mode */
 #define CON_APPLY		1
 #define CON_AXIS0		2
@@ -288,6 +297,7 @@
 int Warp(TransInfo *t, short mval[2]);
 
 void initShear(TransInfo *t);
+int handleEventShear(TransInfo *t, unsigned short evenl, short val);
 int Shear(TransInfo *t, short mval[2]);
 
 void initResize(TransInfo *t);

Modified: trunk/blender/source/blender/src/transform.c
===================================================================
--- trunk/blender/source/blender/src/transform.c	2007-08-08 23:14:03 UTC (rev 11522)
+++ trunk/blender/source/blender/src/transform.c	2007-08-09 01:07:27 UTC (rev 11523)
@@ -541,7 +541,6 @@
 						setLocalConstraint(&Trans, (CON_AXIS2), "along local Z");
 					else if (Trans.mode==TFM_ROTATION) {
 						restoreTransObjects(&Trans);
-						initTransModeFlags(&Trans, TFM_TRACKBALL);
 						initTrackball(&Trans);
 					}
 				}
@@ -578,7 +577,6 @@
 			/* only switch when... */
 			if( ELEM3(Trans.mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL) ) { 
 				restoreTransObjects(&Trans);
-				initTransModeFlags(&Trans, TFM_TRANSLATION);
 				initTranslation(&Trans);
 				Trans.redraw = 1;
 			}
@@ -587,7 +585,6 @@
 			/* only switch when... */
 			if( ELEM3(Trans.mode, TFM_ROTATION, TFM_TRANSLATION, TFM_TRACKBALL) ) { 
 				restoreTransObjects(&Trans);
-				initTransModeFlags(&Trans, TFM_RESIZE);
 				initResize(&Trans);
 				Trans.redraw = 1;
 			}
@@ -598,12 +595,10 @@
 				
 				if (Trans.mode == TFM_ROTATION) {
 					restoreTransObjects(&Trans);
-					initTransModeFlags(&Trans, TFM_TRACKBALL);
 					initTrackball(&Trans);
 				}
 				else {
 					restoreTransObjects(&Trans);
-					initTransModeFlags(&Trans, TFM_ROTATION);
 					initRotation(&Trans);
 				}
 				Trans.redraw = 1;
@@ -727,8 +722,13 @@
 			Trans.redraw= 1;
 			break;
 		}
+		
+		// Numerical input events
 		Trans.redraw |= handleNumInput(&(Trans.num), event);
+		
+		// Snapping events
 		Trans.redraw |= handleSnapping(&Trans, event);
+		
 		arrows_move_cursor(event);
 	}
 	else {
@@ -754,6 +754,10 @@
 			break;
 		}
 	}
+	
+	// Per transform event, if present
+	if (Trans.handleEvent)
+		Trans.redraw |= Trans.handleEvent(&Trans, event, val);
 }
 
 int calculateTransformCenter(int centerMode, float *vec)
@@ -764,13 +768,13 @@
 	Trans.state = TRANS_RUNNING;
 
 	Trans.context = CTX_NONE;
+	
+	Trans.mode = TFM_DUMMY;
 
 	initTrans(&Trans);					// internal data, mouse, vectors
 
 	createTransData(&Trans);			// make TransData structs from selection
 
-	initTransModeFlags(&Trans, TFM_DUMMY);	// modal settings in struct Trans
-
 	Trans.around = centerMode; 			// override userdefined mode
 
 	if (Trans.total == 0) {
@@ -800,6 +804,8 @@
 	Trans.state = TRANS_RUNNING;
 
 	Trans.context = context;
+	
+	Trans.mode = mode;
 
 	initTrans(&Trans);					// internal data, mouse, vectors
 
@@ -810,8 +816,6 @@
 	else
 		Mat3One(Trans.spacemtx);
 
-	initTransModeFlags(&Trans, mode);	// modal settings in struct Trans
-
 	createTransData(&Trans);			// make TransData structs from selection
 
 	initSnapping(&Trans); // Initialize snapping data AFTER mode flags
@@ -823,7 +827,7 @@
 
 	/* EVIL! posemode code can switch translation to rotate when 1 bone is selected. will be removed (ton) */
 	/* EVIL2: we gave as argument also texture space context bit... was cleared */
-	mode= Trans.mode;
+	mode = Trans.mode;
 	
 	calculatePropRatio(&Trans);
 	calculateCenter(&Trans);
@@ -960,6 +964,8 @@
 
 	Trans.context = CTX_NONE;
 	
+	Trans.mode = mode;
+	
 	/* automatic switch to scaling bone envelopes */
 	if(mode==TFM_RESIZE && G.obedit && G.obedit->type==OB_ARMATURE) {
 		bArmature *arm= G.obedit->data;
@@ -969,8 +975,6 @@
 
 	initTrans(&Trans);					// internal data, mouse, vectors
 
-	initTransModeFlags(&Trans, mode);	// modal settings in struct Trans
-
 	G.moving |= G_TRANSFORM_MANIP;		// signal to draw manipuls while transform
 	createTransData(&Trans);			// make TransData structs from selection
 
@@ -981,7 +985,7 @@
 
 	/* EVIL! posemode code can switch translation to rotate when 1 bone is selected. will be removed (ton) */
 	/* EVIL2: we gave as argument also texture space context bit... was cleared */
-	mode= Trans.mode;
+	mode = Trans.mode;
 	
 	calculatePropRatio(&Trans);
 	calculateCenter(&Trans);
@@ -1176,20 +1180,24 @@
 
 /* ************************** WARP *************************** */
 
-/* warp is done fully in view space */
 void initWarp(TransInfo *t) 
 {
 	float max[3], min[3];
 	int i;
 	
-	calculateCenterCursor(t);
+	t->mode = TFM_WARP;
+	t->transform = Warp;
+	
 	t->idx_max = 0;
 	t->num.idx_max = 0;
-	t->transform = Warp;
 	t->snap[0] = 0.0f;
 	t->snap[1] = 5.0f;
 	t->snap[2] = 1.0f;
 	
+	t->flag |= T_NO_CONSTRAINT;
+
+/* warp is done fully in view space */
+	calculateCenterCursor(t);
 	t->fac = (float)(t->center2d[0] - t->imval[0]);
 	
 	/* we need min/max in view space */
@@ -1214,7 +1222,6 @@
 	t->val= (max[0]-min[0])/2.0f;	// t->val is free variable
 }
 
-
 int Warp(TransInfo *t, short mval[2])
 {
 	TransData *td = t->data;
@@ -1312,14 +1319,38 @@
 
 void initShear(TransInfo *t) 
 {
+	t->mode = TFM_SHEAR;
+	t->transform = Shear;
+	t->handleEvent = handleEventShear;
+	
 	t->idx_max = 0;
 	t->num.idx_max = 0;
 	t->snap[0] = 0.0f;
 	t->snap[1] = 0.1f;
 	t->snap[2] = t->snap[1] * 0.1f;
-	t->transform = Shear;
+	
+	t->flag |= T_NO_CONSTRAINT;
 }
 
+int handleEventShear(TransInfo *t, unsigned short event, short val)
+{
+	int status = 0;
+	
+	if (event == MIDDLEMOUSE && val)
+	{
+		// Use customData pointer to signal Shear direction
+		if	(t->customData == 0)
+			t->customData = (void*)1;
+		else
+			t->customData = 0;
+			
+		status = 1;
+	}
+	
+	return status;
+}
+
+
 int Shear(TransInfo *t, short mval[2]) 
 {
 	TransData *td = t->data;
@@ -1332,7 +1363,11 @@
 	Mat3CpyMat4(persmat, t->viewmat);
 	Mat3Inv(persinv, persmat);
 
-	value = 0.05f * InputHorizontalAbsolute(t, mval);
+	// Custom data signals shear direction
+	if (t->customData == 0)
+		value = 0.05f * InputHorizontalAbsolute(t, mval);
+	else
+		value = 0.05f * InputVerticalAbsolute(t, mval);
 
 	snapGrid(t, &value);
 
@@ -1352,7 +1387,13 @@
 	}
 	
 	Mat3One(smat);
-	smat[1][0] = value;
+	
+	// Custom data signals shear direction
+	if (t->customData == 0)
+		smat[1][0] = value;
+	else
+		smat[0][1] = value;
+	
 	Mat3MulMat3(tmat, smat, persmat);
 	Mat3MulMat3(totmat, persinv, tmat);
 	
@@ -1395,6 +1436,23 @@
 
 void initResize(TransInfo *t) 
 {
+	t->mode = TFM_RESIZE;
+	t->transform = Resize;
+	
+	t->flag |= T_NULL_ONE;
+	t->num.flag |= NUM_NULL_ONE;
+	t->num.flag |= NUM_AFFECT_ALL;
+	if (!G.obedit) {
+		t->flag |= T_NO_ZERO;
+		t->num.flag |= NUM_NO_ZERO;
+	}
+	
+	t->idx_max = 2;
+	t->num.idx_max = 2;
+	t->snap[0] = 0.0f;
+	t->snap[1] = 0.1f;
+	t->snap[2] = t->snap[1] * 0.1f;
+
 	t->fac = (float)sqrt(
 		(
 			((float)(t->center2d[1] - t->imval[1]))*((float)(t->center2d[1] - t->imval[1]))
@@ -1403,13 +1461,6 @@
 		) );
 
 	if(t->fac==0.0f) t->fac= 1.0f;	// prevent Inf
-	
-	t->idx_max = 2;
-	t->num.idx_max = 2;
-	t->snap[0] = 0.0f;
-	t->snap[1] = 0.1f;
-	t->snap[2] = t->snap[1] * 0.1f;
-	t->transform = Resize;
 }
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list