[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38160] branches/merwin-spacenav/source/ blender/editors/space_view3d/view3d_edit.c: refitted old ndof fly code for 2.5, removed crusty old code

Mike Erwin significant.bit at gmail.com
Wed Jul 6 19:10:38 CEST 2011


Revision: 38160
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38160
Author:   merwin
Date:     2011-07-06 17:10:38 +0000 (Wed, 06 Jul 2011)
Log Message:
-----------
refitted old ndof fly code for 2.5, removed crusty old code

Modified Paths:
--------------
    branches/merwin-spacenav/source/blender/editors/space_view3d/view3d_edit.c

Modified: branches/merwin-spacenav/source/blender/editors/space_view3d/view3d_edit.c
===================================================================
--- branches/merwin-spacenav/source/blender/editors/space_view3d/view3d_edit.c	2011-07-06 16:08:24 UTC (rev 38159)
+++ branches/merwin-spacenav/source/blender/editors/space_view3d/view3d_edit.c	2011-07-06 17:10:38 UTC (rev 38160)
@@ -929,6 +929,7 @@
 	ot->flag= OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER;
 }
 
+#if 0 // NDOF utility functions
 // returns angular velocity (0..1), fills axis of rotation
 // (shouldn't live in this file!)
 static float ndof_to_angle_axis(const float ndof[3], float axis[3])
@@ -957,6 +958,7 @@
 
 	return sqrtf(x*x + y*y + z*z);
 	}
+#endif
 
 static void ndof_to_quat(wmNDOFMotionData* ndof, float q[4])
 	{
@@ -977,8 +979,11 @@
 	q[3] = scale * z;
 	}
 
-// Mike's version
-static int viewndof_invoke(bContext *C, wmOperator *op, wmEvent *event)
+// Mike's original version:
+// -- "orbit" navigation (trackball/turntable)
+// -- zooming
+// -- panning in rotationally-locked views
+static int ndof_orbit_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
 	RegionView3D* rv3d = CTX_wm_region_view3d(C);
 	wmNDOFMotionData* ndof = (wmNDOFMotionData*) event->customdata;
@@ -1023,7 +1028,7 @@
 		invert_qt_qt(view_inv, rv3d->viewquat);
 		mul_qt_v3(view_inv, pan_vec);
 
-		/* move center of view opposite of hand motion (camera mode, not object mode) */
+		/* move center of view opposite of hand motion (this is camera mode, not object mode) */
 		sub_v3_v3(rv3d->ofs, pan_vec);
 	}
 
@@ -1057,7 +1062,7 @@
 			float xvec[3] = {1,0,0};
 
 			/* Determine the direction of the x vector (for rotating up and down) */
-			float view_inv[4]/*, view_inv_conj[4]*/;
+			float view_inv[4];
 			invert_qt_qt(view_inv, rv3d->viewquat);
 			mul_qt_v3(view_inv, xvec);
 
@@ -1081,91 +1086,184 @@
 	return OPERATOR_FINISHED;
 }
 
-// Tom's version
-#if 0 
-static int viewndof_invoke(bContext *C, wmOperator *op, wmEvent *event)
+#if 0 // not ready
+static int ndof_fly_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
+	RegionView3D* rv3d = CTX_wm_region_view3d(C);
 	wmNDOFMotionData* ndof = (wmNDOFMotionData*) event->customdata;
-	
-	float phi, q1[4];
-	float m[3][3];
-	float m_inv[3][3];
-	float xvec[3] = {1,0,0};
-	float yvec[3] = {0,1,0};
-	float vec[3];
-	float mat[3][3];
-	const float rotaSensitivity = 0.007;
-	const float tranSensitivity = 0.120;
-	
-	ARegion *ar= CTX_wm_region(C);
-	RegionView3D *rv3d = CTX_wm_region_view3d(C);
-	View3D *v3d = CTX_wm_view3d(C);
-	
+
+	const int shouldRotate = 0, shouldMove = 1;
+
 	float dt = ndof->dt;
-	
-	if (dt > 0.25f) {
+	if (dt > 0.25f)
 		/* this is probably the first event for this motion, so set dt to something reasonable */
-		dt = 0.0125f;
+		/* TODO: replace such guesswork with a flag or field from the NDOF manager */
+		ndof->dt = dt = 0.0125f;
+
+	if (shouldRotate)
+		{
+		const float turn_sensitivity = 1.f;
+
+		float rot[4];
+		ndof_to_quat(ndof, rot);
+
+		rv3d->view = RV3D_VIEW_USER;
+		}
+
+	if (shouldMove)
+		{
+		const float forward_sensitivity = 1.f;
+		const float vertical_sensitivity = 1.f;
+		const float lateral_sensitivity = 1.f;
+		
+		float trans[3] = {
+			lateral_sensitivity * dt * ndof->tx,
+			vertical_sensitivity * dt * ndof->ty,
+			forward_sensitivity * rv3d->dist * dt * ndof->tz
+			};
+		}
+
+	ED_region_tag_redraw(CTX_wm_region(C));
+
+	return OPERATOR_FINISHED;
+}
+#endif
+
+// BEGIN old fly code
+// derived from blender 2.4
+
+static void getndof(wmNDOFMotionData* indof, float* outdof)
+{
+	// Rotations feel relatively faster than translations only in fly mode, so
+	// we have no choice but to fix that here (not in the plugins)
+	const float turn_sensitivity = 0.8f;
+
+	const float forward_sensitivity = 2.5f;
+	const float vertical_sensitivity = 1.6f;
+	const float lateral_sensitivity = 2.5f;
+
+	const float dt = (indof->dt < 0.25f) ? indof->dt : 0.0125f;
+		// this is probably the first event for this motion, so set dt to something reasonable
+		// TODO: replace such guesswork with a flag or field from the NDOF manager
+
+	outdof[0] = lateral_sensitivity * dt * indof->tx;
+	outdof[1] = vertical_sensitivity * dt * indof->ty;
+	outdof[2] = forward_sensitivity * dt * indof->tz;
+
+	outdof[3] = turn_sensitivity * dt * indof->rx;
+	outdof[4] = turn_sensitivity * dt * indof->ry;
+	outdof[5] = turn_sensitivity * dt * indof->rz;
+}
+
+// statics for controlling rv3d->dist corrections.
+// viewmoveNDOF zeros and adjusts rv3d->ofs.
+// viewmove restores based on dz_flag state.
+
+static int dz_flag = 0;
+static float m_dist;
+
+static void mouse_rotation_workaround_push(RegionView3D* rv3d)
+{
+	// This is due to a side effect of the original
+	// mouse view rotation code. The rotation point is
+	// set a distance in front of the viewport to
+	// make rotating with the mouse look better.
+	// The distance effect is written at a low level
+	// in the view management instead of the mouse
+	// view function. This means that all other view
+	// movement devices must subtract this from their
+	// view transformations.
+
+	float mat[3][3];
+	float upvec[3];
+
+	if(rv3d->dist != 0.0) {
+		dz_flag = 1;
+		m_dist = rv3d->dist;
+		upvec[0] = upvec[1] = 0;
+		upvec[2] = rv3d->dist;
+		copy_m3_m4(mat, rv3d->viewinv);
+		mul_m3_v3(mat, upvec);
+		sub_v3_v3(rv3d->ofs, upvec);
+		rv3d->dist = 0.0;
 	}
 
-	/* Get the 3x3 matrix and its inverse from the quaternion */
-	quat_to_mat3(m,rv3d->viewquat);
-	invert_m3_m3(m_inv,m);
-	
-	/* Determine the direction of the x vector (for rotating up and down) */
-	/* This can likely be computed directly from the quaternion. */
-	mul_m3_v3(m_inv,xvec);
-	
-	//if(rv3d->persp=!= RV3D_PERSP)  //Camera control not supported yet
-	/* Lock fixed views out of using rotation controls */
-	if(rv3d->view!=RV3D_VIEW_FRONT && rv3d->view!=RV3D_VIEW_BACK)
-		if(rv3d->view!=RV3D_VIEW_TOP && rv3d->view!=RV3D_VIEW_BOTTOM)
-			if(rv3d->view!=RV3D_VIEW_RIGHT && rv3d->view!=RV3D_VIEW_LEFT) {
-				// Perform the up/down rotation 				
-				phi = (rotaSensitivity+dt) * -ndof->rx;
-				q1[0] = cos(phi);
-				mul_v3_v3fl(q1+1, xvec, sin(phi));
-				mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1);
+	// this is still needed in version 2.5 [mce]
+	// warning! current viewmove does not look at dz_flag or m_dist
+	// don't expect 2D mouse to work properly right after using 3D mouse
+}
 
-				// Perform the left/right rotation 
-				mul_m3_v3(m_inv,yvec);
-				phi = (rotaSensitivity+dt) * ndof->ry;
-				q1[0] = cos(phi);
-				mul_v3_v3fl(q1+1, yvec, sin(phi));
-				mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1);
+static void mouse_rotation_workaround_pop(RegionView3D* rv3d)
+{
+	if (dz_flag) {
+		dz_flag = 0;
+		rv3d->dist = m_dist;
+	}
+}
 
-				// Perform the orbital rotation
-				phi = (rotaSensitivity+dt) * ndof->rz;
-				q1[0] = cos(phi);
-				q1[1] = q1[2] = 0.0;
-				q1[3] = sin(phi);
-				mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1);
-			}
+static int ndof_oldfly_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+	RegionView3D* rv3d = CTX_wm_region_view3d(C);
+	wmNDOFMotionData* ndof = (wmNDOFMotionData*) event->customdata;
 
-	// Perform Pan translation 	
-	vec[0]= (tranSensitivity+dt) * ndof->tx;
-	vec[1]= (tranSensitivity+dt) * ndof->tz;
-	//vec[2]= 0.0f;//tranSensitivity * ndof->ty;
-	//window_to_3d_delta(ar, vec, -ndof->tx, -ndof->tz); // experimented a little instead of above 
+	float phi;
+	float dval[6];
+	float tvec[3], rvec[3];
+	float q1[4];
+	float mat[3][3];
+
+	// fetch the current state of the ndof device
+	getndof(ndof, dval);
+
+	// force perspective mode. This is a hack and is
+	// incomplete. It doesn't actually affect the view
+	// until the first draw and doesn't update the menu
+	// to reflect persp mode.
+	rv3d->persp = RV3D_PERSP;
+
+	// Correct the distance jump if rv3d->dist != 0
+	mouse_rotation_workaround_push(rv3d);
+
+	// Apply rotation
+	rvec[0] = dval[3];
+	rvec[1] = dval[4];
+	rvec[2] = dval[5];
+
+	// rotate device x and y by view z
 	copy_m3_m4(mat, rv3d->viewinv);
 	mat[2][2] = 0.0f;
-	mul_m3_v3(mat, vec);
-	// translate the view
-	add_v3_v3(rv3d->ofs, vec);
+	mul_m3_v3(mat, rvec);
 
-	// Perform Zoom translation 	
-	if (ndof->ty!=0.0f){ // TODO - need to add limits to prevent flipping past gridlines 
-		rv3d->dist += (tranSensitivity+dt)* ndof->ty;
-		// printf("dist %5.3f view %d grid %f\n",rv3d->dist,rv3d->view,v3d->grid);
+	// rotate the view
+	phi = normalize_v3(rvec);
+	if(phi != 0) {
+		axis_angle_to_quat(q1,rvec,phi);
+		mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1);
 	}
 
-	//printf("Trans tx:%5.2f ty:%5.2f tz:%5.2f \n",ndof->tx, ndof->ty, ndof->tz);
-	ED_region_tag_redraw(ar);
-	
+	// Apply translation
+	tvec[0] = dval[0];
+	tvec[1] = dval[1];
+	tvec[2] = dval[2];
+
+	// the next three lines rotate the x and y translation coordinates
+	// by the current z axis angle
+	copy_m3_m4(mat, rv3d->viewinv);
+	mat[2][2] = 0.0f;
+	mul_m3_v3(mat, tvec);
+
+	// translate the view
+	sub_v3_v3(rv3d->ofs, tvec);
+
+	mouse_rotation_workaround_pop(rv3d);
+
+	// back to 2.5 land!
+	ED_region_tag_redraw(CTX_wm_region(C));
 	return OPERATOR_FINISHED;
 }
-#endif
 
+// END old fly code
+
 void VIEW3D_OT_ndof(struct wmOperatorType *ot)
 {
 	/* identifiers */
@@ -1174,7 +1272,8 @@
 	ot->idname = "VIEW3D_OT_ndof";
 
 	/* api callbacks */
-	ot->invoke = viewndof_invoke;
+	ot->invoke = ndof_oldfly_invoke;
+//	ot->invoke = ndof_orbit_invoke;
 	ot->poll = ED_operator_view3d_active;
 
 	/* flags */
@@ -3448,398 +3547,6 @@
 	return (*depth==FLT_MAX) ? 0:1;
 }
 
-/* ********************* NDOF ************************ */
-/* note: this code is confusing and unclear... (ton) */
-/* **************************************************** */
-
-// ndof scaling will be moved to user setting.
-// In the mean time this is just a place holder.
-
-// Note: scaling in the plugin and ghostwinlay.c
-// should be removed. With driver default setting,
-// each axis returns approx. +-200 max deflection.
-
-// The values I selected are based on the older
-// polling i/f. With event i/f, the sensistivity
-// can be increased for improved response from
-// small deflections of the device input.
-
-
-// lukep notes : i disagree on the range.
-// the normal 3Dconnection driver give +/-400
-// on defaut range in other applications
-// and up to +/- 1000 if set to maximum
-// because i remove the scaling by delta,
-// which was a bad idea as it depend of the system
-// speed and os, i changed the scaling values, but
-// those are still not ok
-
-#if 0

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list