[Bf-blender-cvs] [739ae1d] master: NDOF: fix for view3d ignoring lens values when panning

Campbell Barton noreply at git.blender.org
Sat Feb 22 06:34:15 CET 2014


Commit: 739ae1d80956759767e137fe17286dc360788a1b
Author: Campbell Barton
Date:   Sat Feb 22 16:19:02 2014 +1100
https://developer.blender.org/rB739ae1d80956759767e137fe17286dc360788a1b

NDOF: fix for view3d ignoring lens values when panning

image, mce, view2d and view3d now have matching pan speed.

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

M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/interface/view2d_ops.c
M	source/blender/editors/space_clip/clip_ops.c
M	source/blender/editors/space_image/image_ops.c
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_walk.c
M	source/blender/makesdna/DNA_userdef_types.h
M	source/blender/windowmanager/intern/wm_event_system.c

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

diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index ce15188..05b31c0 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -4386,7 +4386,7 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data,
 }
 
 static void ui_ndofedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data,
-                                    wmNDOFMotionData *ndof,
+                                    const wmNDOFMotionData *ndof,
                                     const enum eSnapType snap, const bool shift)
 {
 	float *hsv = ui_block_hsv_get(but->block);
@@ -4480,7 +4480,7 @@ static int ui_do_but_HSVCUBE(bContext *C, uiBlock *block, uiBut *but, uiHandleBu
 			return WM_UI_HANDLER_BREAK;
 		}
 		else if (event->type == NDOF_MOTION) {
-			wmNDOFMotionData *ndof = (wmNDOFMotionData *) event->customdata;
+			const wmNDOFMotionData *ndof = event->customdata;
 			const enum eSnapType snap = ui_event_to_snap(event);
 			
 			ui_ndofedit_but_HSVCUBE(but, data, ndof, snap, event->shift != 0);
@@ -4630,7 +4630,7 @@ static bool ui_numedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data,
 }
 
 static void ui_ndofedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data,
-                                      wmNDOFMotionData *ndof,
+                                      const wmNDOFMotionData *ndof,
                                       const enum eSnapType snap, const bool shift)
 {
 	float *hsv = ui_block_hsv_get(but->block);
@@ -4712,7 +4712,7 @@ static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandle
 		}
 		else if (event->type == NDOF_MOTION) {
 			const enum eSnapType snap = ui_event_to_snap(event);
-			wmNDOFMotionData *ndof = (wmNDOFMotionData *) event->customdata;
+			const wmNDOFMotionData *ndof = event->customdata;
 			
 			ui_ndofedit_but_HSVCIRCLE(but, data, ndof, snap, event->shift != 0);
 
diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c
index a8f01b7..1f63ad8 100644
--- a/source/blender/editors/interface/view2d_ops.c
+++ b/source/blender/editors/interface/view2d_ops.c
@@ -1262,12 +1262,11 @@ static int view2d_ndof_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 		return OPERATOR_CANCELLED;
 	}
 	else {
-		wmNDOFMotionData *ndof = (wmNDOFMotionData *) event->customdata;
+		const wmNDOFMotionData *ndof = event->customdata;
 
-		float dt = ndof->dt;
 		/* tune these until it feels right */
 		const float zoom_sensitivity = 0.5f;
-		const float pan_sensitivity = 10.0f; /* match view3d ortho */
+		const float speed = 10.0f;  /* match view3d ortho */
 		const bool has_translate = (ndof->tvec[0] && ndof->tvec[1]) && view_pan_poll(C);
 		const bool has_zoom = (ndof->tvec[2] != 0.0f) && view_zoom_poll(C);
 
@@ -1278,8 +1277,8 @@ static int view2d_ndof_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 
 				WM_event_ndof_pan_get(ndof, pan_vec, false);
 
-				pan_vec[0] *= pan_sensitivity;
-				pan_vec[1] *= pan_sensitivity;
+				pan_vec[0] *= speed;
+				pan_vec[1] *= speed;
 
 				vpd = op->customdata;
 
@@ -1292,7 +1291,7 @@ static int view2d_ndof_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 		if (has_zoom) {
 			if (view_zoomdrag_init(C, op)) {
 				v2dViewZoomData *vzd;
-				float zoom_factor = zoom_sensitivity * dt * -ndof->tvec[2];
+				float zoom_factor = zoom_sensitivity * ndof->dt * -ndof->tvec[2];
 
 				bool do_zoom_xy[2];
 
diff --git a/source/blender/editors/space_clip/clip_ops.c b/source/blender/editors/space_clip/clip_ops.c
index 6767f92..7ee94fe 100644
--- a/source/blender/editors/space_clip/clip_ops.c
+++ b/source/blender/editors/space_clip/clip_ops.c
@@ -1335,24 +1335,13 @@ static int clip_view_ndof_invoke(bContext *C, wmOperator *UNUSED(op), const wmEv
 		ARegion *ar = CTX_wm_region(C);
 		float pan_vec[3];
 
-		wmNDOFMotionData *ndof = (wmNDOFMotionData *) event->customdata;
-
-		float dt = ndof->dt;
-
-		/* tune these until it feels right */
-		const float pan_sensitivity = 300.0f;  /* screen pixels per second */
-
-		/* "mouse zoom" factor = 1 + (dx + dy) / 300
-		 * what about "ndof zoom" factor? should behave like this:
-		 * at rest -> factor = 1
-		 * move forward -> factor > 1
-		 * move backward -> factor < 1
-		 */
+		const wmNDOFMotionData *ndof = event->customdata;
+		const float speed = NDOF_PIXELS_PER_SECOND;
 
 		WM_event_ndof_pan_get(ndof, pan_vec, true);
 
-		mul_v2_fl(pan_vec, (pan_sensitivity * dt) / sc->zoom);
-		pan_vec[2] *= -dt;
+		mul_v2_fl(pan_vec, (speed * ndof->dt) / sc->zoom);
+		pan_vec[2] *= -ndof->dt;
 
 		sclip_zoom_set_factor(C, 1.0f + pan_vec[2], NULL);
 		sc->xof += pan_vec[0];
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 29448a2..bb7a9b9 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -601,24 +601,13 @@ static int image_view_ndof_invoke(bContext *C, wmOperator *UNUSED(op), const wmE
 		ARegion *ar = CTX_wm_region(C);
 		float pan_vec[3];
 
-		wmNDOFMotionData *ndof = (wmNDOFMotionData *) event->customdata;
-
-		float dt = ndof->dt;
-
-		/* tune these until it feels right */
-		const float pan_sensitivity = 300.0f;  /* screen pixels per second */
-
-		/* "mouse zoom" factor = 1 + (dx + dy) / 300
-		 * what about "ndof zoom" factor? should behave like this:
-		 * at rest -> factor = 1
-		 * move forward -> factor > 1
-		 * move backward -> factor < 1
-		 */
+		const wmNDOFMotionData *ndof = event->customdata;
+		const float speed = NDOF_PIXELS_PER_SECOND;
 
 		WM_event_ndof_pan_get(ndof, pan_vec, true);
 
-		mul_v2_fl(pan_vec, (pan_sensitivity * dt) / sima->zoom);
-		pan_vec[2] *= -dt;
+		mul_v2_fl(pan_vec, (speed * ndof->dt) / sima->zoom);
+		pan_vec[2] *= -ndof->dt;
 
 		sima_zoom_set_factor(sima, ar, 1.0f + pan_vec[2], NULL);
 		sima->xof += pan_vec[0];
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index faee651..77b0e94 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -1151,6 +1151,17 @@ void VIEW3D_OT_rotate(wmOperatorType *ot)
 #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))
 
+static float view3d_ndof_pan_speed_calc(RegionView3D *rv3d)
+{
+	float speed = rv3d->pixsize * NDOF_PIXELS_PER_SECOND;
+
+	if (rv3d->is_persp) {
+		speed *= ED_view3d_calc_zfac(rv3d, rv3d->ofs, NULL);
+	}
+
+	return speed;
+}
+
 /**
  * Zoom and pan in the same function since sometimes zoom is interpreted as dolly (pan forward).
  *
@@ -1160,7 +1171,6 @@ static void view3d_ndof_pan_zoom(const struct wmNDOFMotionData *ndof, ScrArea *s
                                  const bool has_translate, const bool has_zoom)
 {
 	RegionView3D *rv3d = ar->regiondata;
-	const float dt = ndof->dt;
 	float view_inv[4];
 	float pan_vec[3];
 
@@ -1183,7 +1193,7 @@ static void view3d_ndof_pan_zoom(const struct wmNDOFMotionData *ndof, ScrArea *s
 
 		/* "zoom in" or "translate"? depends on zoom mode in user settings? */
 		if (ndof->tvec[2]) {
-			float zoom_distance = rv3d->dist * dt * ndof->tvec[2];
+			float zoom_distance = rv3d->dist * ndof->dt * ndof->tvec[2];
 
 			if (U.ndof_flag & NDOF_ZOOM_INVERT)
 				zoom_distance = -zoom_distance;
@@ -1201,9 +1211,9 @@ static void view3d_ndof_pan_zoom(const struct wmNDOFMotionData *ndof, ScrArea *s
 	}
 
 	if (has_translate) {
-		const float speed = rv3d->dist; /* uses distance from pivot to define dolly */
+		const float speed = view3d_ndof_pan_speed_calc(rv3d);
 
-		mul_v3_fl(pan_vec, speed * dt);
+		mul_v3_fl(pan_vec, speed * ndof->dt);
 
 		/* transform motion from view to world coordinates */
 		invert_qt_qt(view_inv, rv3d->viewquat);
@@ -1314,9 +1324,6 @@ void view3d_ndof_fly(
         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;
 
@@ -1326,14 +1333,14 @@ void view3d_ndof_fly(
 	rv3d->rot_angle = 0.0f;  /* disable onscreen rotation doo-dad */
 
 	if (has_translate) {
-		float speed = 10.0f;  /* blender units per second */
+		float speed = view3d_ndof_pan_speed_calc(rv3d);
 		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);
+		mul_v3_fl(trans, speed * ndof->dt);
 		trans_orig_y = trans[1];
 
 		if (U.ndof_flag & NDOF_FLY_HELICOPTER) {
diff --git a/source/blender/editors/space_view3d/view3d_fly.c b/source/blender/editors/space_view3d/view3d_fly.c
index 42e74be..c8c0111 100644
--- a/source/blender/editors/space_view3d/view3d_fly.c
+++ b/source/blender/editors/space_view3d/view3d_fly.c
@@ -460,7 +460,7 @@ static void flyEvent(bContext *C, FlyInfo *fly, const wmEvent *event)
 		// puts("ndof motion detected in fly mode!");
 		// static const char *tag_name = "3D mouse position";
 
-		wmNDOFMotionData *incoming_ndof = (wmNDOFMotionData *)event->customdata;
+		const wmNDOFMotionData *incoming_ndof = event->customdata;
 		switch (incoming_ndof->progress) {
 			case P_STARTING:
 				/* start keeping track of 3D mouse position */
diff --git a/source/blender/editors/space_view3d/view3d_walk.c b/source/blender/editors/space_view3d/view3d_walk.c
index c6d0999..7d38733 100644
--- a/source/blender/editors/space_view3d/view3d_walk.c
+++ b/source/blender/editors/space_view3d/view3d_walk.c
@@ -645,7 +645,7 @@ static void walkEvent(bContext *C, wmOperator *UNUSED(op), WalkInfo *walk, const
 		// puts("ndof motion detected in walk mode!");
 		// static const char *tag_name = "3D mouse position";
 
-		wmNDOFMotionData *incoming_ndof = (wmNDOFMotionData *)event->customdata;
+		const wmNDOFMotionData *incoming_ndof = event->customdata;
 		swi

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list