[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55455] trunk/blender/source/blender/ editors/space_view3d/view3d_fly.c: fix for incorrect use of 'bool', also fix 2 older bugs in fly mode.

Campbell Barton ideasman42 at gmail.com
Thu Mar 21 03:56:21 CET 2013


Revision: 55455
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55455
Author:   campbellbarton
Date:     2013-03-21 02:56:16 +0000 (Thu, 21 Mar 2013)
Log Message:
-----------
fix for incorrect use of 'bool', also fix 2 older bugs in fly mode.
- panning didnt keyframe translation animation.
- when checking to key translation: speed `float` was converted to an `int` then treated as a bool, now check (speed != 0).

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_view3d/view3d_fly.c

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_fly.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_fly.c	2013-03-21 02:38:11 UTC (rev 55454)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_fly.c	2013-03-21 02:56:16 UTC (rev 55455)
@@ -78,9 +78,21 @@
 	FLY_MODAL_FREELOOK_ENABLE,
 	FLY_MODAL_FREELOOK_DISABLE,
 	FLY_MODAL_SPEED,	/* mousepan typically */
-
 };
 
+/* relative view axis locking - xlock, zlock */
+typedef enum eFlyPanState {
+	/* disabled */
+	FLY_AXISLOCK_STATE_OFF    = 0,
+
+	/* enabled but not checking because mouse hasn't moved outside the margin since locking was checked an not needed
+	 * when the mouse moves, locking is set to 2 so checks are done. */
+	FLY_AXISLOCK_STATE_IDLE   = 1,
+
+	/* mouse moved and checking needed, if no view altering is done its changed back to #FLY_AXISLOCK_STATE_IDLE */
+	FLY_AXISLOCK_STATE_ACTIVE = 2
+} eFlyPanState;
+
 /* called in transform_ops.c, on each regeneration of keymaps  */
 void fly_modal_keymap(wmKeyConfig *keyconf)
 {
@@ -184,12 +196,7 @@
 	short axis; /* Axis index to move along by default Z to move along the view */
 	bool pan_view; /* when true, pan the view instead of rotating */
 
-	/* relative view axis locking - xlock, zlock
-	 * 0) disabled
-	 * 1) enabled but not checking because mouse hasn't moved outside the margin since locking was checked an not needed
-	 *    when the mouse moves, locking is set to 2 so checks are done.
-	 * 2) mouse moved and checking needed, if no view altering is done its changed back to 1 */
-	bool xlock, zlock;
+	eFlyPanState xlock, zlock;
 	float xlock_momentum, zlock_momentum; /* nicer dynamics */
 	float grid; /* world scale 1.0 default */
 
@@ -311,8 +318,8 @@
 	fly->speed = 0.0f;
 	fly->axis = 2;
 	fly->pan_view = false;
-	fly->xlock = false;
-	fly->zlock = false;
+	fly->xlock = FLY_AXISLOCK_STATE_OFF;
+	fly->zlock = FLY_AXISLOCK_STATE_OFF;
 	fly->xlock_momentum = 0.0f;
 	fly->zlock_momentum = 0.0f;
 	fly->grid = 1.0f;
@@ -342,7 +349,7 @@
 	copy_m3_m4(mat, fly->rv3d->viewinv);
 	mul_m3_v3(mat, upvec);
 	if (fabsf(upvec[2]) < 0.1f) {
-		fly->zlock = 1;
+		fly->zlock = FLY_AXISLOCK_STATE_IDLE;
 	}
 	upvec[0] = 0;
 	upvec[1] = 0;
@@ -677,18 +684,18 @@
 				break;
 
 			case FLY_MODAL_AXIS_LOCK_X:
-				if (fly->xlock)
-					fly->xlock = 0;
+				if (fly->xlock != FLY_AXISLOCK_STATE_OFF)
+					fly->xlock = FLY_AXISLOCK_STATE_OFF;
 				else {
-					fly->xlock = 2;
+					fly->xlock = FLY_AXISLOCK_STATE_ACTIVE;
 					fly->xlock_momentum = 0.0;
 				}
 				break;
 			case FLY_MODAL_AXIS_LOCK_Z:
-				if (fly->zlock)
-					fly->zlock = 0;
+				if (fly->zlock != FLY_AXISLOCK_STATE_OFF)
+					fly->zlock = FLY_AXISLOCK_STATE_OFF;
 				else {
-					fly->zlock = 2;
+					fly->zlock = FLY_AXISLOCK_STATE_ACTIVE;
 					fly->zlock_momentum = 0.0;
 				}
 				break;
@@ -710,7 +717,8 @@
 	}
 }
 
-static void move_camera(bContext *C, RegionView3D *rv3d, FlyInfo *fly, int orientationChanged, int positionChanged)
+static void flyMoveCamera(bContext *C, RegionView3D *rv3d, FlyInfo *fly,
+                            const bool do_rotate, const bool do_translate)
 {
 	/* we are in camera view so apply the view ofs and quat to the view matrix and set the camera to the view */
 
@@ -764,11 +772,11 @@
 		 *	2) on each subsequent frame
 		 *		TODO: need to check in future that frame changed before doing this 
 		 */
-		if (orientationChanged) {
+		if (do_rotate) {
 			KeyingSet *ks = ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_ROTATION_ID);
 			ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
 		}
-		if (positionChanged) {
+		if (do_translate) {
 			KeyingSet *ks = ANIM_builtin_keyingset_get_named(NULL, ANIM_KS_LOCATION_ID);
 			ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
 		}
@@ -851,7 +859,8 @@
 		/* Should we redraw? */
 		if ((fly->speed != 0.0f) ||
 		    moffset[0] || moffset[1] ||
-		    fly->zlock || fly->xlock ||
+		    (fly->zlock != FLY_AXISLOCK_STATE_OFF) ||
+		    (fly->xlock != FLY_AXISLOCK_STATE_OFF) ||
 		    dvec[0] || dvec[1] || dvec[2])
 		{
 			float dvec_tmp[3];
@@ -904,10 +913,10 @@
 					axis_angle_to_quat(tmp_quat, upvec, (float)moffset[1] * time_redraw * -FLY_ROTATE_FAC);
 					mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
 
-					if (fly->xlock)
-						fly->xlock = 2;  /* check for rotation */
-					if (fly->zlock)
-						fly->zlock = 2;
+					if (fly->xlock != FLY_AXISLOCK_STATE_OFF)
+						fly->xlock = FLY_AXISLOCK_STATE_ACTIVE;  /* check for rotation */
+					if (fly->zlock != FLY_AXISLOCK_STATE_OFF)
+						fly->zlock = FLY_AXISLOCK_STATE_ACTIVE;
 					fly->xlock_momentum = 0.0f;
 				}
 
@@ -940,13 +949,13 @@
 					axis_angle_to_quat(tmp_quat, upvec, (float)moffset[0] * time_redraw * FLY_ROTATE_FAC);
 					mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
 
-					if (fly->xlock)
-						fly->xlock = 2;  /* check for rotation */
-					if (fly->zlock)
-						fly->zlock = 2;
+					if (fly->xlock != FLY_AXISLOCK_STATE_OFF)
+						fly->xlock = FLY_AXISLOCK_STATE_ACTIVE;  /* check for rotation */
+					if (fly->zlock != FLY_AXISLOCK_STATE_OFF)
+						fly->zlock = FLY_AXISLOCK_STATE_ACTIVE;
 				}
 
-				if (fly->zlock == 2) {
+				if (fly->zlock == FLY_AXISLOCK_STATE_ACTIVE) {
 					upvec[0] = 1.0f;
 					upvec[1] = 0.0f;
 					upvec[2] = 0.0f;
@@ -968,12 +977,13 @@
 						fly->zlock_momentum += FLY_ZUP_CORRECT_ACCEL;
 					}
 					else {
-						fly->zlock = 1; /* don't check until the view rotates again */
+						fly->zlock = FLY_AXISLOCK_STATE_IDLE; /* don't check until the view rotates again */
 						fly->zlock_momentum = 0.0f;
 					}
 				}
 
-				if (fly->xlock == 2 && moffset[1] == 0) { /* only apply xcorrect when mouse isn't applying x rot */
+				/* only apply xcorrect when mouse isn't applying x rot */
+				if (fly->xlock == FLY_AXISLOCK_STATE_ACTIVE && moffset[1] == 0) {
 					upvec[0] = 0;
 					upvec[1] = 0;
 					upvec[2] = 1;
@@ -995,7 +1005,7 @@
 						fly->xlock_momentum += 0.05f;
 					}
 					else {
-						fly->xlock = 1; /* see above */
+						fly->xlock = FLY_AXISLOCK_STATE_IDLE; /* see above */
 						fly->xlock_momentum = 0.0f;
 					}
 				}
@@ -1035,8 +1045,13 @@
 
 			add_v3_v3(rv3d->ofs, dvec);
 
-			if (rv3d->persp == RV3D_CAMOB)
-				move_camera(C, rv3d, fly, (fly->xlock || fly->zlock || moffset[0] || moffset[1]), fly->speed);
+			if (rv3d->persp == RV3D_CAMOB) {
+				const bool do_rotate = ((fly->xlock != FLY_AXISLOCK_STATE_OFF) ||
+				                        (fly->zlock != FLY_AXISLOCK_STATE_OFF) ||
+				                        ((moffset[0] || moffset[1]) && !fly->pan_view));
+				const bool do_translate = (fly->speed != 0.0f || fly->pan_view);
+				flyMoveCamera(C, rv3d, fly, do_rotate, do_translate);
+			}
 
 		}
 		else {
@@ -1172,7 +1187,7 @@
 		fly->redraw = true;
 
 		if (rv3d->persp == RV3D_CAMOB) {
-			move_camera(C, rv3d, fly, do_rotate, do_translate);
+			flyMoveCamera(C, rv3d, fly, do_rotate, do_translate);
 		}
 	}
 




More information about the Bf-blender-cvs mailing list