[Bf-blender-cvs] [370ee98] epic-navigation: All mouse modes working:

Dalai Felinto noreply at git.blender.org
Mon Nov 3 20:46:58 CET 2014


Commit: 370ee988634471c209931505c0e2e4c32774321f
Author: Dalai Felinto
Date:   Mon Nov 3 17:36:09 2014 -0200
Branches: epic-navigation
https://developer.blender.org/rB370ee988634471c209931505c0e2e4c32774321f

All mouse modes working:

* RMB + Drag :
  left/right | rotates horizontally
  up/down    | rotates  vertically

* LMB + Drag :
  left/right | rotates horizontally
  up/down    | move forward/backward

* MMB + Drag :
  left/right | straft (mode sideways)
  up/down    | move up/down

===================================================================

M	source/blender/editors/space_view3d/view3d_walk.c

===================================================================

diff --git a/source/blender/editors/space_view3d/view3d_walk.c b/source/blender/editors/space_view3d/view3d_walk.c
index 76e32ff..e85d4a0 100644
--- a/source/blender/editors/space_view3d/view3d_walk.c
+++ b/source/blender/editors/space_view3d/view3d_walk.c
@@ -93,14 +93,14 @@ enum {
 	WALK_MODAL_DECELERATE,
 };
 
-enum {
+typedef enum {
 	WALK_BIT_FORWARD  = 1 << 0,
 	WALK_BIT_BACKWARD = 1 << 1,
 	WALK_BIT_LEFT     = 1 << 2,
 	WALK_BIT_RIGHT    = 1 << 3,
 	WALK_BIT_UP       = 1 << 4,
 	WALK_BIT_DOWN     = 1 << 5,
-};
+} eWalkDirectionFlag;
 
 typedef enum eWalkTeleportState {
 	WALK_TELEPORT_STATE_OFF = 0,
@@ -963,6 +963,63 @@ static void walk_mouse_rotate_vertical(ARegion *ar, RegionView3D *rv3d, const fl
 	mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
 }
 
+static void walk_forward(float mat[3][3], const float speed,
+                        const bool is_world_forward, float r_dvec[3])
+{
+	float dvec_tmp[3] = {0.0f, 0.0f, speed};
+
+	mul_m3_v3(mat, dvec_tmp);
+
+	if (is_world_forward)
+		dvec_tmp[2] = 0.0f;
+
+	normalize_v3(dvec_tmp);
+	mul_v3_fl(dvec_tmp, fabsf(speed));
+	add_v3_v3(r_dvec, dvec_tmp);
+}
+
+static void walk_sideways(const float viewinvmat[4][4], const float speed, float r_dvec[3])
+{
+	float dvec_tmp[3] = {viewinvmat[0][0],
+	                     viewinvmat[0][1],
+	                     0.0f};
+
+	normalize_v3(dvec_tmp);
+	mul_v3_fl(dvec_tmp, speed);
+	add_v3_v3(r_dvec, dvec_tmp);
+}
+
+static void walk_updown(const float speed, float r_dvec[3])
+{
+	float dvec_tmp[3] = {0.0f, 0.0f, speed};
+	add_v3_v3(r_dvec, dvec_tmp);
+}
+
+static void walk_mouse_move(WalkInfo *walk, float mat[3][3], const eWalkDirectionFlag direction, float r_dvec[3])
+{
+	const float speed = 0.1f;
+	switch (direction) {
+		case WALK_BIT_UP:
+			walk_updown(-speed, r_dvec);
+			break;
+		case WALK_BIT_DOWN:
+			walk_updown(speed, r_dvec);
+			break;
+		case WALK_BIT_LEFT:
+			walk_sideways(walk->rv3d->viewinv, speed, r_dvec);
+			break;
+		case WALK_BIT_RIGHT:
+			walk_sideways(walk->rv3d->viewinv, -speed, r_dvec);
+			break;
+		case WALK_BIT_FORWARD:
+			walk_forward(mat, speed, true, r_dvec);
+			break;
+		case WALK_BIT_BACKWARD:
+			walk_forward(mat, -speed, true, r_dvec);
+			break;
+	}
+}
+
 static int walkApply(bContext *C, WalkInfo *walk)
 {
 	/* walk mode - Ctrl+Shift+F
@@ -1034,30 +1091,39 @@ static int walkApply(bContext *C, WalkInfo *walk)
 			switch (walk->mouse_mode) {
 				case WALK_MOUSE_MOVEHORIZONTAL:
 				{
-					//if (moffset[1])
-					//	walk_mouse_move_forward();
-
 					if (moffset[0])
 						walk_mouse_rotate_horizontal(ar, rv3d, walk->mouse_speed, moffset, mat, upvec);
+
+					if (moffset[1] > 0)
+						walk_mouse_move(walk, mat, WALK_BIT_FORWARD, dvec);
+					else if (moffset[1] < 0)
+						walk_mouse_move(walk, mat, WALK_BIT_BACKWARD, dvec);
+
 					break;
 				}
 				case WALK_MOUSE_MOVEVERTICAL:
 				{
-					//if (moffset[1])
-					//	walk_mouse_move_upward();
+					if (moffset[0] > 0)
+						walk_mouse_move(walk, mat, WALK_BIT_RIGHT, dvec);
+					else if (moffset[0] < 0)
+						walk_mouse_move(walk, mat, WALK_BIT_LEFT, dvec);
+
+					if (moffset[1] > 0)
+						walk_mouse_move(walk, mat, WALK_BIT_UP, dvec);
+					else if (moffset[1] < 0)
+						walk_mouse_move(walk, mat, WALK_BIT_DOWN, dvec);
 
-					//if (moffset[0])
-					//	walk_mouse_move_sideways();
 					break;
 				}
 				case WALK_MOUSE_LOOKAROUND:
 				default:
 				{
+					if (moffset[0])
+						walk_mouse_rotate_horizontal(ar, rv3d, walk->mouse_speed, moffset, mat, upvec);
+
 					if (moffset[1])
 						walk_mouse_rotate_vertical(ar, rv3d, walk->mouse_speed, moffset, mat, upvec);
 
-					if (moffset[0])
-						walk_mouse_rotate_horizontal(ar, rv3d, walk->mouse_speed, moffset, mat, upvec);
 					break;
 				}
 			}
@@ -1066,71 +1132,55 @@ static int walkApply(bContext *C, WalkInfo *walk)
 			if ((walk->active_directions) &&
 			    (walk->gravity_state == WALK_GRAVITY_STATE_OFF))
 			{
-
-				short direction;
 				zero_v3(dvec);
 
+				/* XOR */
 				if ((walk->active_directions & WALK_BIT_FORWARD) ||
 				    (walk->active_directions & WALK_BIT_BACKWARD))
 				{
-
-					direction = 0;
-
-					if ((walk->active_directions & WALK_BIT_FORWARD))
-						direction += 1;
-
-					if ((walk->active_directions & WALK_BIT_BACKWARD))
-						direction -= 1;
-
-					copy_v3_fl3(dvec_tmp, 0.0f, 0.0f, direction);
-					mul_m3_v3(mat, dvec_tmp);
-
-					if (walk->navigation_mode == WALK_MODE_GRAVITY) {
-						dvec_tmp[2] = 0.0f;
+					if ((walk->active_directions & WALK_BIT_FORWARD) &&
+					    (walk->active_directions & WALK_BIT_BACKWARD))
+					{
+					}
+					else if ((walk->active_directions & WALK_BIT_FORWARD)) {
+						walk_forward(mat, 1.0f, (walk->navigation_mode == WALK_MODE_GRAVITY), dvec);
+					}
+					else { /* WALK_BIT_BACKWARD */
+						walk_forward(mat, -1.0f, (walk->navigation_mode == WALK_MODE_GRAVITY), dvec);
 					}
-
-					normalize_v3(dvec_tmp);
-					add_v3_v3(dvec, dvec_tmp);
-
 				}
 
+				/* XOR */
 				if ((walk->active_directions & WALK_BIT_LEFT) ||
 				    (walk->active_directions & WALK_BIT_RIGHT))
 				{
-
-					direction = 0;
-
-					if ((walk->active_directions & WALK_BIT_LEFT))
-						direction += 1;
-
-					if ((walk->active_directions & WALK_BIT_RIGHT))
-						direction -= 1;
-
-					dvec_tmp[0] = direction * rv3d->viewinv[0][0];
-					dvec_tmp[1] = direction * rv3d->viewinv[0][1];
-					dvec_tmp[2] = 0.0f;
-
-					normalize_v3(dvec_tmp);
-					add_v3_v3(dvec, dvec_tmp);
-
+					if ((walk->active_directions & WALK_BIT_LEFT) &&
+					    (walk->active_directions & WALK_BIT_RIGHT))
+					{
+					}
+					else if ((walk->active_directions & WALK_BIT_LEFT)) {
+						walk_sideways(rv3d->viewinv, 1.0f, dvec);
+					}
+					else { /* WALK_BIT_RIGHT */
+						walk_sideways(rv3d->viewinv, -1.0f, dvec);
+					}
 				}
 
+				/* XOR */
 				if ((walk->active_directions & WALK_BIT_UP) ||
 				    (walk->active_directions & WALK_BIT_DOWN))
 				{
-
-					if (walk->navigation_mode == WALK_MODE_FREE) {
-
-						direction = 0;
-
-						if ((walk->active_directions & WALK_BIT_UP))
-							direction -= 1;
-
-						if ((walk->active_directions & WALK_BIT_DOWN))
-							direction = 1;
-
-						copy_v3_fl3(dvec_tmp, 0.0f, 0.0f, direction);
-						add_v3_v3(dvec, dvec_tmp);
+					if ((walk->active_directions & WALK_BIT_UP) &&
+					    (walk->active_directions & WALK_BIT_DOWN))
+					{
+					}
+					else if (walk->navigation_mode == WALK_MODE_FREE) {
+						if ((walk->active_directions & WALK_BIT_UP)) {
+							walk_updown(-1.0f, dvec);
+						}
+						else { /* WALK_BIT_DOWN */
+							walk_updown(1.0f, dvec);
+						}
 					}
 				}




More information about the Bf-blender-cvs mailing list