[Bf-blender-cvs] [d56ed8d] master: Code cleanup: de-duplicate ndof controls for walk/fly mode

Campbell Barton noreply at git.blender.org
Wed Feb 19 11:20:06 CET 2014


Commit: d56ed8dcd95ba31dc860b01d692a93ccd1ba1fce
Author: Campbell Barton
Date:   Wed Feb 19 21:19:13 2014 +1100
https://developer.blender.org/rBd56ed8dcd95ba31dc860b01d692a93ccd1ba1fce

Code cleanup: de-duplicate ndof controls for walk/fly mode

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

M	source/blender/editors/space_view3d/view3d_edit.c
M	source/blender/editors/space_view3d/view3d_fly.c
M	source/blender/editors/space_view3d/view3d_intern.h
M	source/blender/editors/space_view3d/view3d_walk.c

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

diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index bcf0962..3d4cee4 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -1148,7 +1148,7 @@ void VIEW3D_OT_rotate(wmOperatorType *ot)
  * (should these functions live in this file?)
  */
 
-#define NDOF_HAS_TRANSLATE ((!view3d_operator_offset_lock_check(C, op)) && !is_zero_v3(ndof->tvec))
+#define NDOF_HAS_TRANSLATE ((!ED_view3d_offset_lock_check(v3d, rv3d)) && !is_zero_v3(ndof->tvec))
 #define NDOF_HAS_ROTATE    (((rv3d->viewlock & RV3D_LOCKED) == 0) && !is_zero_v3(ndof->rvec))
 
 /**
@@ -1302,6 +1302,117 @@ static void view3d_ndof_orbit(const struct wmNDOFMotionData *ndof, RegionView3D
 	}
 }
 
+/**
+ * Called from both fly mode and walk mode,
+ */
+void view3d_ndof_fly(
+        const wmNDOFMotionData *ndof,
+        View3D *v3d, RegionView3D *rv3d,
+        const bool use_precision, const short protectflag,
+        bool *r_has_translate, bool *r_has_rotate)
+{
+	/* shorthand for oft-used variables */
+	const float dt = ndof->dt;
+
+	bool has_translate = NDOF_HAS_TRANSLATE;
+	bool has_rotate = NDOF_HAS_ROTATE;
+
+	float view_inv[4];
+	invert_qt_qt(view_inv, rv3d->viewquat);
+
+	rv3d->rot_angle = 0.0f;  /* disable onscreen rotation doo-dad */
+
+	if (has_translate) {
+		float speed = 10.0f;  /* blender units per second */
+		float trans[3], trans_orig_y;
+		/* ^^ this is ok for default cube scene, but should scale with.. something */
+		if (use_precision)
+			speed *= 0.2f;
+
+		WM_event_ndof_pan_get(ndof, trans, false);
+		mul_v3_fl(trans, speed * dt);
+		trans_orig_y = trans[1];
+
+		/* transform motion from view to world coordinates */
+		mul_qt_v3(view_inv, trans);
+
+		if (U.ndof_flag & NDOF_FLY_HELICOPTER) {
+			/* replace world z component with device y (yes it makes sense) */
+			trans[2] = trans_orig_y;
+		}
+
+		if (rv3d->persp == RV3D_CAMOB) {
+			/* respect camera position locks */
+			if (protectflag & OB_LOCK_LOCX) trans[0] = 0.0f;
+			if (protectflag & OB_LOCK_LOCY) trans[1] = 0.0f;
+			if (protectflag & OB_LOCK_LOCZ) trans[2] = 0.0f;
+		}
+
+		if (!is_zero_v3(trans)) {
+			/* move center of view opposite of hand motion (this is camera mode, not object mode) */
+			sub_v3_v3(rv3d->ofs, trans);
+			has_translate = true;
+		}
+		else {
+			has_translate = false;
+		}
+	}
+
+	if (has_rotate) {
+		const float turn_sensitivity = 1.0f;
+
+		float rotation[4];
+		float axis[3];
+		float angle = turn_sensitivity * WM_event_ndof_to_axis_angle(ndof, axis);
+
+		if (fabsf(angle) > 0.0001f) {
+			has_rotate = true;
+
+			if (use_precision)
+				angle *= 0.2f;
+
+			/* transform rotation axis from view to world coordinates */
+			mul_qt_v3(view_inv, axis);
+
+			/* apply rotation to view */
+			axis_angle_to_quat(rotation, axis, angle);
+			mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, rotation);
+
+			if (U.ndof_flag & NDOF_LOCK_HORIZON) {
+				/* force an upright viewpoint
+				 * TODO: make this less... sudden */
+				float view_horizon[3] = {1.0f, 0.0f, 0.0f}; /* view +x */
+				float view_direction[3] = {0.0f, 0.0f, -1.0f}; /* view -z (into screen) */
+
+				/* find new inverse since viewquat has changed */
+				invert_qt_qt(view_inv, rv3d->viewquat);
+				/* could apply reverse rotation to existing view_inv to save a few cycles */
+
+				/* transform view vectors to world coordinates */
+				mul_qt_v3(view_inv, view_horizon);
+				mul_qt_v3(view_inv, view_direction);
+
+
+				/* find difference between view & world horizons
+				 * true horizon lives in world xy plane, so look only at difference in z */
+				angle = -asinf(view_horizon[2]);
+
+				/* rotate view so view horizon = world horizon */
+				axis_angle_to_quat(rotation, view_direction, angle);
+				mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, rotation);
+			}
+
+			rv3d->view = RV3D_VIEW_USER;
+		}
+		else {
+			has_rotate = false;
+		}
+	}
+
+	*r_has_translate = has_translate;
+	*r_has_rotate    = has_rotate;
+}
+
 /* -- "orbit" navigation (trackball/turntable)
  * -- zooming
  * -- panning in rotationally-locked views
@@ -1440,7 +1551,7 @@ void VIEW3D_OT_ndof_orbit_zoom(struct wmOperatorType *ot)
 /* -- "pan" navigation
  * -- zoom or dolly?
  */
-static int ndof_pan_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+static int ndof_pan_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
 {
 	if (event->type != NDOF_MOTION) {
 		return OPERATOR_CANCELLED;
diff --git a/source/blender/editors/space_view3d/view3d_fly.c b/source/blender/editors/space_view3d/view3d_fly.c
index fed94d6..42e74be 100644
--- a/source/blender/editors/space_view3d/view3d_fly.c
+++ b/source/blender/editors/space_view3d/view3d_fly.c
@@ -944,127 +944,23 @@ static int flyApply(bContext *C, FlyInfo *fly)
 	return OPERATOR_FINISHED;
 }
 
-static int flyApply_ndof(bContext *C, FlyInfo *fly)
+static void flyApply_ndof(bContext *C, FlyInfo *fly)
 {
-	/* shorthand for oft-used variables */
-	wmNDOFMotionData *ndof = fly->ndof;
-	const float dt = ndof->dt;
-	RegionView3D *rv3d = fly->rv3d;
-	const int flag = U.ndof_flag;
-
-#if 0
-	bool do_rotate = (flag & NDOF_SHOULD_ROTATE) && (fly->pan_view == false);
-	bool do_translate = (flag & (NDOF_SHOULD_PAN | NDOF_SHOULD_ZOOM)) != 0;
-#endif
-
-	bool do_rotate = (fly->pan_view == false);
-	bool do_translate = true;
-
-	float view_inv[4];
-	invert_qt_qt(view_inv, rv3d->viewquat);
-
-	rv3d->rot_angle = 0.0f; /* disable onscreen rotation doo-dad */
-
-	if (do_translate) {
-		float speed = 10.0f; /* blender units per second */
-		float trans[3], trans_orig_y;
-		/* ^^ this is ok for default cube scene, but should scale with.. something */
-		if (fly->use_precision)
-			speed *= 0.2f;
-
-		WM_event_ndof_pan_get(ndof, trans, false);
-		mul_v3_fl(trans, speed * dt);
-		trans_orig_y = trans[1];
-
-		/* transform motion from view to world coordinates */
-		mul_qt_v3(view_inv, trans);
-
-		if (flag & NDOF_FLY_HELICOPTER) {
-			/* replace world z component with device y (yes it makes sense) */
-			trans[2] = trans_orig_y;
-		}
-
-		if (rv3d->persp == RV3D_CAMOB) {
-			/* respect camera position locks */
-			Object *lock_ob = ED_view3d_cameracontrol_object_get(fly->v3d_camera_control);
-			if (lock_ob->protectflag & OB_LOCK_LOCX) trans[0] = 0.0f;
-			if (lock_ob->protectflag & OB_LOCK_LOCY) trans[1] = 0.0f;
-			if (lock_ob->protectflag & OB_LOCK_LOCZ) trans[2] = 0.0f;
-		}
-
-		if (!is_zero_v3(trans)) {
-			/* move center of view opposite of hand motion (this is camera mode, not object mode) */
-			sub_v3_v3(rv3d->ofs, trans);
-			do_translate = true;
-		}
-		else {
-			do_translate = false;
-		}
-	}
-
-	if (do_rotate) {
-		const float turn_sensitivity = 1.0f;
-
-		float rotation[4];
-		float axis[3];
-		float angle = turn_sensitivity * WM_event_ndof_to_axis_angle(ndof, axis);
+	Object *lock_ob = ED_view3d_cameracontrol_object_get(fly->v3d_camera_control);
+	bool has_translate, has_rotate;
 
-		if (fabsf(angle) > 0.0001f) {
-			do_rotate = true;
+	view3d_ndof_fly(fly->ndof,
+	                fly->v3d, fly->rv3d,
+	                fly->use_precision, lock_ob ? lock_ob->protectflag : 0,
+	                &has_translate, &has_rotate);
 
-			if (fly->use_precision)
-				angle *= 0.2f;
-
-			/* transform rotation axis from view to world coordinates */
-			mul_qt_v3(view_inv, axis);
-
-			/* apply rotation to view */
-			axis_angle_to_quat(rotation, axis, angle);
-			mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, rotation);
-
-			if (flag & NDOF_LOCK_HORIZON) {
-				/* force an upright viewpoint
-				 * TODO: make this less... sudden */
-				float view_horizon[3] = {1.0f, 0.0f, 0.0f}; /* view +x */
-				float view_direction[3] = {0.0f, 0.0f, -1.0f}; /* view -z (into screen) */
-
-				/* find new inverse since viewquat has changed */
-				invert_qt_qt(view_inv, rv3d->viewquat);
-				/* could apply reverse rotation to existing view_inv to save a few cycles */
-
-				/* transform view vectors to world coordinates */
-				mul_qt_v3(view_inv, view_horizon);
-				mul_qt_v3(view_inv, view_direction);
-
-				/* find difference between view & world horizons
-				 * true horizon lives in world xy plane, so look only at difference in z */
-				angle = -asinf(view_horizon[2]);
-
-#ifdef NDOF_FLY_DEBUG
-				printf("lock horizon: adjusting %.1f degrees\n\n", RAD2DEG(angle));
-#endif
-
-				/* rotate view so view horizon = world horizon */
-				axis_angle_to_quat(rotation, view_direction, angle);
-				mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, rotation);
-			}
-
-			rv3d->view = RV3D_VIEW_USER;
-		}
-		else {
-			do_rotate = false;
-		}
-	}
-
-	if (do_translate || do_rotate) {
+	if (has_translate || has_rotate) {
 		fly->redraw = true;
 
-		if (rv3d->persp == RV3D_CAMOB) {
-			flyMoveCamera(C, fly, do_rotate, do_translate);
+		if (fly->rv3d->persp == RV3D_CAMOB) {
+			flyMoveCamera(C, fly, has_rotate, has_translate);
 		}
 	}
-
-	return OPERATOR_FINISHED;
 }
 
 static int fly_invoke(bContext *C, wmOperator *op, const wmEvent *event)
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index 86b1891..71bef91 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -107,6 +107,12 @@ void VIEW3D_OT_zoom_border(struct wmOperatorType *ot);
 
 void view3d_boxview_copy(ScrArea *sa, ARegion *ar);
 
+void view3d_ndof_fly(
+        const struct wmNDOFMotionData *ndof,
+        struct View3D *v3d, struct RegionView3D *rv3d,
+        const bool use_precision, const short protectflag,
+        bool *r_has_translate, bool *r_has_rotate);
+
 /* view3d_fly.c */
 void view3d_keymap(struct wmKeyConfig *keyconf);
 void VIEW3D_OT_fly(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_view3d/view3d_walk.c b/source/blender/editors/space_view3d/view3d_walk.c
index 9a57fee..c6d0999 100644
--- a/source/blender/editors/space_view3d/view3d_walk.c
+++ b/source/blender/editors/space_view3d/view3d_walk.c
@@ -1217,128 +1217,23 @@ static int walkApply(bContext *C, WalkInfo *walk)
 #undef WALK_BOOST_FACTOR
 }
 
-static int walkApply_ndof(bContext *C, WalkInfo *walk)
+static void w

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list