fix for ndof inconsistencies, bug #13954
authorJean-Luc Peurière <jlp@nerim.net>
Sat, 14 Jun 2008 18:57:42 +0000 (18:57 +0000)
committerJean-Luc Peurière <jlp@nerim.net>
Sat, 14 Jun 2008 18:57:42 +0000 (18:57 +0000)
patch provided by Ettore Pasquini

intern/ghost/intern/GHOST_SystemX11.cpp
source/blender/src/view.c

index ff1bf51bbb52fa2fef2360abc98c33700e0a4de3..3003e0b8b1431a75c8adacb9664d41b4578c0f2a 100644 (file)
@@ -488,12 +488,12 @@ GHOST_SystemX11::processEvent(XEvent *xe)
                                        data.changed = 1;
                                        data.delta = xcme.data.s[8] - data.time;
                                        data.time = xcme.data.s[8];
-                                       data.tx = xcme.data.s[2];
-                                       data.ty = xcme.data.s[3];
-                                       data.tz = xcme.data.s[4];
+                                       data.tx = xcme.data.s[2] >> 2;
+                                       data.ty = xcme.data.s[3] >> 2;
+                                       data.tz = xcme.data.s[4] >> 2;
                                        data.rx = xcme.data.s[5];
                                        data.ry = xcme.data.s[6];
-                                       data.rz = xcme.data.s[7];
+                                       data.rz =-xcme.data.s[7];
                                        g_event = new GHOST_EventNDOF(getMilliSeconds(),
                                                                      GHOST_kEventNDOFMotion,
                                                                      window, data);
index 008387d5a70776e37a946b52e692fabc157a6f56..356a297b2844599b214347f239b2bfbc7487a852 100644 (file)
@@ -753,10 +753,11 @@ void viewmoveNDOFfly(int mode)
 
 
        // Apply rotation
-
-       rvec[0] = -dval[3];
-       rvec[1] = -dval[4];
-       rvec[2] = dval[5];
+       // Rotations feel relatively faster than translations only in fly mode, so
+       // we have no choice but to fix that here (not in the plugins)
+       rvec[0] = -0.5 * dval[3];
+       rvec[1] = -0.5 * dval[4];
+       rvec[2] = -0.5 * dval[5];
 
        // rotate device x and y by view z
 
@@ -824,8 +825,7 @@ void viewmove(int mode)
                return;
        }
        
-               // dist correction from other movement devices
-               
+       // dist correction from other movement devices  
        if((dz_flag)||G.vd->dist==0) {
                dz_flag = 0;
                G.vd->dist = m_dist;
@@ -1166,6 +1166,8 @@ void viewmoveNDOF(int mode)
     float reverse;
     float diff[4];
     float d, curareaX, curareaY;
+    float mat[3][3];
+    float upvec[3];
 
     /* Sensitivity will control how fast the view rotates.  The value was
      * obtained experimentally by tweaking until the author didn't get dizzy watching.
@@ -1186,6 +1188,16 @@ void viewmoveNDOF(int mode)
                use_sel = 1;
        }
 
+    if((dz_flag)||G.vd->dist==0) {
+               dz_flag = 0;
+               G.vd->dist = m_dist;
+               upvec[0] = upvec[1] = 0;
+               upvec[2] = G.vd->dist;
+               Mat3CpyMat4(mat, G.vd->viewinv);
+               Mat3MulVecfl(mat, upvec);
+               VecAddf(G.vd->ofs, G.vd->ofs, upvec);
+       }
+
     /*----------------------------------------------------
         * sometimes this routine is called from headerbuttons
      * viewmove needs to refresh the screen
@@ -1212,25 +1224,25 @@ void viewmoveNDOF(int mode)
                                filterNDOFvalues(fval);
        
        
-       // put scaling back here, was previously in ghostwinlay
-            fval[0] = fval[0]  * (1.0f/800.0f);
-            fval[1] = fval[1]  * (1.0f/800.0f);
-            fval[2] = fval[2] * (1.0f/800.0f);
-            fval[3] = fval[3]  * 0.00005f;
-            fval[4] = fval[4]  * 0.00005f;
-            fval[5] = fval[5] * 0.00005f;
-            fval[6] = fval[6]  / 1000000.0f;
+    // put scaling back here, was previously in ghostwinlay
+    fval[0] = fval[0] * (1.0f/1200.0f);
+    fval[1] = fval[1] * (1.0f/1200.0f);
+    fval[2] = fval[2] * (1.0f/1200.0f);
+    fval[3] = fval[3] * 0.00005f;
+    fval[4] =-fval[4] * 0.00005f;
+    fval[5] = fval[5] * 0.00005f;
+    fval[6] = fval[6] / 1000000.0f;
                        
-       // scale more if not in perspective mode
-                       if (G.vd->persp == V3D_ORTHO) {
-                               fval[0] = fval[0] * 0.05f;
-                               fval[1] = fval[1] * 0.05f;
-                               fval[2] = fval[2] * 0.05f;
-                               fval[3] = fval[3] * 0.9f;
-                               fval[4] = fval[4] * 0.9f;
-                               fval[5] = fval[5] * 0.9f;
-                               zsens *= 8;
-                       }
+    // scale more if not in perspective mode
+    if (G.vd->persp == V3D_ORTHO) {
+        fval[0] = fval[0] * 0.05f;
+        fval[1] = fval[1] * 0.05f;
+        fval[2] = fval[2] * 0.05f;
+        fval[3] = fval[3] * 0.9f;
+        fval[4] = fval[4] * 0.9f;
+        fval[5] = fval[5] * 0.9f;
+        zsens *= 8;
+    }
                        
        
     /* set object offset */