Revision: 31286
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31286
Author:   merwin
Date:     2010-08-12 15:04:00 +0200 (Thu, 12 Aug 2010)

Log Message:
-----------
Better Intuos4 support on Windows.

Modified Paths:
--------------
    branches/soc-2010-merwin/intern/ghost/intern/GHOST_SystemWin32.cpp
    branches/soc-2010-merwin/intern/ghost/intern/GHOST_TabletManagerWin32.cpp
    branches/soc-2010-merwin/intern/ghost/intern/GHOST_TabletManagerWin32.h

Modified: branches/soc-2010-merwin/intern/ghost/intern/GHOST_SystemWin32.cpp
===================================================================
--- branches/soc-2010-merwin/intern/ghost/intern/GHOST_SystemWin32.cpp  
2010-08-12 12:17:47 UTC (rev 31285)
+++ branches/soc-2010-merwin/intern/ghost/intern/GHOST_SystemWin32.cpp  
2010-08-12 13:04:00 UTC (rev 31286)
@@ -140,7 +140,9 @@
 
 GHOST_TUns64 GHOST_SystemWin32::getMilliSeconds() const
 {
-       // Hardware does not support high resolution timers. We will use 
GetTickCount instead then.
+       // If hardware does not support high resolution timers,
+       // we will use GetTickCount instead.
+
        if (!m_hasPerformanceCounter) {
                return ::GetTickCount();
        }
@@ -153,7 +155,7 @@
        __int64 delta = 1000*(count-m_start);
 
        GHOST_TUns64 t = (GHOST_TUns64)(delta/m_freq);
-       return t; 
+       return t;
 }
 
 
@@ -174,7 +176,7 @@
 
 
 GHOST_IWindow* GHOST_SystemWin32::createWindow(
-       const STR_String& title, 
+       const STR_String& title,
        GHOST_TInt32 left, GHOST_TInt32 top, GHOST_TUns32 width, GHOST_TUns32 
height,
        GHOST_TWindowState state, GHOST_TDrawingContextType type,
        bool stereoVisual, const GHOST_TUns16 numOfAASamples, const 
GHOST_TEmbedderWindowID parentWindow )
@@ -195,7 +197,7 @@
 
                        delete window;
                        window = 0;
-                       
+
                        // If another window is found, let the wm know about 
that one, but not the old one
                        if (other_window)
                        {
@@ -222,7 +224,7 @@
 #else
                        GHOST_TUns64 next = timerMgr->nextFireTime();
                        GHOST_TInt64 maxSleep = next - getMilliSeconds();
-                       
+
                        if (next == GHOST_kFireTimeNever) {
                                ::WaitMessage();
                        } else if(maxSleep >= 0.0) {
@@ -565,7 +567,7 @@
 {
        // short fwKeys = LOWORD(wParam);                       // key flags
        int zDelta = (short) HIWORD(wParam);    // wheel rotation
-       
+
        // zDelta /= WHEEL_DELTA;
        // temporary fix below: microsoft now has added more precision, making 
the above division not work
        if (zDelta <= 0 ) zDelta= -1; else zDelta= 1;   
@@ -930,14 +932,22 @@
                // Tablet events, processed
                
////////////////////////////////////////////////////////////////////////
                case WT_PACKET:
-                       puts("WT_PACKET");
+                       // puts("WT_PACKET");
                        // window->processWin32TabletEvent(wParam, lParam);
-                       m_tabletManager->processPackets(window);
+                       m_tabletManager->processPackets((HCTX)lParam);
                        break;
                case WT_CSRCHANGE:
+                       m_tabletManager->changeTool((HCTX)lParam, wParam);
+                       break;
                case WT_PROXIMITY:
+                       // description was weird.. give me numbers!
+                       // printf("prox: %d %d\n", LOWORD(lParam), 
HIWORD(lParam));
+                       if (LOWORD(lParam) == 0)
+                               {
+                               puts("-- dropping tool --");
+                               m_tabletManager->dropTool();
+                               }
                        // window->processWin32TabletInitEvent();
-                       m_tabletManager->changeTool(window);
                        break;
 
                
////////////////////////////////////////////////////////////////////////
@@ -997,9 +1007,15 @@
 
                                if (m_input_fidelity_hint == HI_FI)
                                        {
-                                       // int n =
-                                       getMoreMousePoints(mousePosX, 
mousePosY, xPrev, yPrev, window);
-                                       // printf("%d more mouse points 
found\n", n);
+                                       int buttons;
+                                       getButtons(buttons);
+                                       // don't bother grabbing extra mouse 
motion unless we're in a stroke
+                                       if (buttons)
+                                               {
+                                               // int n =
+                                               getMoreMousePoints(mousePosX, 
mousePosY, xPrev, yPrev, window);
+                                               // printf("%d more mouse points 
found\n", n);
+                                               }
                                        }
 
                                // uncomment here and in getMoreMousePoints to 
show effectiveness of hi-fi input

Modified: 
branches/soc-2010-merwin/intern/ghost/intern/GHOST_TabletManagerWin32.cpp
===================================================================
--- branches/soc-2010-merwin/intern/ghost/intern/GHOST_TabletManagerWin32.cpp   
2010-08-12 12:17:47 UTC (rev 31285)
+++ branches/soc-2010-merwin/intern/ghost/intern/GHOST_TabletManagerWin32.cpp   
2010-08-12 13:04:00 UTC (rev 31286)
@@ -2,18 +2,19 @@
 #include "GHOST_WindowWin32.h"
 #include <stdio.h>
 #include <stdlib.h>
+#include <math.h>
 
-#define PACKETDATA     PK_CURSOR | PK_X | PK_Y | PK_BUTTONS | 
PK_NORMAL_PRESSURE
-#define PACKETTILT     PKEXT_ABSOLUTE
-#define PACKETMODE     PK_BUTTONS
+#define PACKETDATA PK_CURSOR | PK_X | PK_Y | PK_BUTTONS | PK_NORMAL_PRESSURE | 
PK_ORIENTATION
+#define PACKETMODE PK_BUTTONS
+// #define PACKETTILT PKEXT_ABSOLUTE
 
 #include "pktdef.h"
 
-#define MAX_QUEUE_SIZE 128
+#define MAX_QUEUE_SIZE 100
 
 GHOST_TabletManagerWin32::GHOST_TabletManagerWin32()
        {
-       resetActiveTool();
+       dropTool();
 
        // open WinTab
        lib_Wintab = LoadLibrary("wintab32.dll");
@@ -26,11 +27,12 @@
                func_Info = (WTINFOA) GetProcAddress(lib_Wintab,"WTInfoA");
                func_QueueSizeSet = (WTQUEUESIZESET) 
GetProcAddress(lib_Wintab,"WTQueueSizeSet");
                func_PacketsGet = (WTPACKETSGET) 
GetProcAddress(lib_Wintab,"WTPacketsGet");
+               func_Packet = (WTPACKET) GetProcAddress(lib_Wintab,"WTPacket");
 
                WORD specV, implV;
                func_Info(WTI_INTERFACE, IFC_SPECVERSION, &specV);
                func_Info(WTI_INTERFACE, IFC_IMPLVERSION, &implV);
-               printf("Wintab version %d.%d (%d.%d)\n",
+               printf("WinTab version %d.%d (%d.%d)\n",
                        HIBYTE(specV), LOBYTE(specV), HIBYTE(implV), 
LOBYTE(implV));
 
                // query for overall capabilities and ranges
@@ -44,8 +46,11 @@
 
                printf("active area: %dx%d\n", xRange.axMax, yRange.axMax);
 
+               func_Info(WTI_DEVICES, DVC_NCSRTYPES, &cursorCount);
+               func_Info(WTI_DEVICES, DVC_FIRSTCSR, &cursorBase);
+
                AXIS pressureRange;
-               hasPressure = func_Info(WTI_DEVICES, DVC_NPRESSURE, 
&pressureRange) && pressureRange.axMax != 0;
+               hasPressure = func_Info(WTI_DEVICES, DVC_NPRESSURE, 
&pressureRange);// && pressureRange.axMax != 0;
 
                printf("pressure sensitivity: ");
                if (hasPressure)
@@ -59,20 +64,71 @@
                        pressureScale = 0.f;
                        }
 
-               AXIS tiltRange;
-               hasTilt = func_Info(WTI_DEVICES, DVC_ORIENTATION, &tiltRange) 
&& tiltRange.axMax != 0;
+               printf("tilt sensitivity:\n");
+               AXIS tiltRange[3];
+               hasTilt = func_Info(WTI_DEVICES, DVC_ORIENTATION, tiltRange);
 
-               printf("tilt sensitivity: ");
                if (hasTilt)
                        {
-                       printf("%d to %d\n", tiltRange.axMin, tiltRange.axMax);
-                       tiltScale = 1.f / tiltRange.axMax;
+                       // cheat by using available data from Intuos4. test on 
other tablets!!!
+                       azimuthScale = 1.f / HIWORD(tiltRange[1].axResolution);
+                       altitudeScale = 1.f / tiltRange[1].axMax;
+                       printf("azi scale %f\n", azimuthScale);
+                       printf("alt scale %f\n", altitudeScale);
+
+                       // leave this code in place to help support tablets I 
haven't tested
+                       const char* axisName[] = {"azimuth","altitude","twist"};
+                       const char* unitName[] = {NULL,"inch","cm","circle"};
+                       for (int i = 0; i < 3; ++i)
+                               {
+                               AXIS const& t = tiltRange[i];
+                               if (t.axResolution)
+                                       printf("%s: %d to %d values per %d.%d 
%s\n",
+                                               axisName[i], t.axMin, t.axMax,
+                                               HIWORD(t.axResolution), 
LOWORD(t.axResolution),
+                                               unitName[t.axUnits]);
+                               }
                        }
                else
                        {
                        printf("none\n");
-                       tiltScale = 0.f;
                        }
+
+#if 0 // WTX_TILT -- cartesian tilt extension, no conversion needed
+               // this isn't working for [mce], so let it rest for now
+               printf("raw tilt sensitivity:\n");
+               hasTilt = false;
+               UINT tag = 0;
+               UINT extensionCount;
+               func_Info(WTI_INTERFACE, IFC_NEXTENSIONS, &extensionCount);
+//             for (UINT i = 0; func_Info(WTI_EXTENSIONS + i, EXT_TAG, &tag); 
++i)
+               for (UINT i = 0; i < extensionCount; ++i)
+                       {
+                       printf("trying extension %d\n", i);
+                       func_Info(WTI_EXTENSIONS + i, EXT_TAG, &tag);
+                       if (tag == WTX_TILT)
+                               {
+                               hasTilt = true;
+                               break;
+                               }
+                       }
+
+               if (hasTilt)
+                       {
+                       func_Info(WTI_EXTENSIONS + tag, EXT_MASK, &tiltMask);
+                       AXIS tiltRange[2];
+                       func_Info(WTI_EXTENSIONS + tag, EXT_AXES, tiltRange);
+                       printf("%d to %d along x\n", tiltRange[0].axMin, 
tiltRange[0].axMax);
+                       printf("%d to %d along y\n", tiltRange[1].axMin, 
tiltRange[1].axMax);
+                       tiltScaleX = 1.f / tiltRange[0].axMax;
+                       tiltScaleY = 1.f / tiltRange[1].axMax;
+                       }
+               else
+                       {
+                       printf("none\n");
+                       tiltScaleX = tiltScaleY = 0.f;
+                       }
+#endif // WTX_TILT
                }
        }
 
@@ -88,13 +144,6 @@
                && func_Info(0,0,NULL); // tablet plugged in
        }
 
-void GHOST_TabletManagerWin32::resetActiveTool()
-       {
-       activeTool.type = TABLET_NONE;
-       activeTool.hasPressure = false;
-       activeTool.hasTilt = false;
-       }
-
 HCTX GHOST_TabletManagerWin32::contextForWindow(GHOST_WindowWin32* window)
        {
        std::map<GHOST_WindowWin32*,HCTX>::iterator i = contexts.find(window);
@@ -112,20 +161,20 @@
 
        // set up context
        LOGCONTEXT archetype;
-       func_Info(WTI_DEFCONTEXT, 0, &archetype);
+       func_Info(WTI_DEFSYSCTX, 0, &archetype);
 
-       strcpy(archetype.lcName, "merwin special");
+       strcpy(archetype.lcName, "blender special");
        archetype.lcPktData = PACKETDATA;
        archetype.lcPktMode = PACKETMODE;
-       archetype.lcOptions |= CXO_SYSTEM | CXO_MESSAGES;
+       archetype.lcOptions |= CXO_MESSAGES | CXO_CSRMESSAGES;
 
-// BEGIN from Wacom's TILTTEST.c
-       /* output the data in screen coords */
-       archetype.lcOutOrgX = archetype.lcOutOrgY = 0;
-       archetype.lcOutExtX = GetSystemMetrics(SM_CXSCREEN);
-       /* move origin to upper left */
-       archetype.lcOutExtY = -GetSystemMetrics(SM_CYSCREEN);
-// END
+/*
+       if (hasTilt)
+               {
+               archetype.lcPktData |= tiltMask;
+               archetype.lcMoveMask |= tiltMask;
+               }
+*/
 
        // open the context
        HCTX context = func_Open(window->getHWND(), &archetype, TRUE);
@@ -151,150 +200,160 @@
                }
        }
 
-void GHOST_TabletManagerWin32::processPackets(GHOST_WindowWin32* window)
+void GHOST_TabletManagerWin32::convertTilt(ORIENTATION const& ort, 
TabletToolData& data)
        {
-       HCTX context = contextForWindow(window);
+       // this code used to live in GHOST_WindowWin32
+       // now it lives here
 
-       if (context)
+       float vecLen;
+       float altRad, azmRad;   /* in radians */
+
+       /*
+       from the wintab spec:
+       orAzimuth       Specifies the clockwise rotation of the
+       cursor about the z axis through a full circular range.
+
+       orAltitude      Specifies the angle with the x-y plane
+       through a signed, semicircular range.  Positive values
+       specify an angle upward toward the positive z axis;
+       negative values specify an angle downward toward the negative z axis.
+
+       wintab.h defines .orAltitude as a UINT but documents .orAltitude
+       as positive for upward angles and negative for downward angles.
+       WACOM uses negative altitude values to show that the pen is inverted;
+       therefore we cast .orAltitude as an (int) and then use the absolute 
value.
+       */
+
+       /* convert raw fixed point data to radians */
+       altRad = fabs(ort.orAltitude) * altitudeScale * M_PI/2.0;
+       azmRad = ort.orAzimuth * azimuthScale * M_PI*2.0;
+
+       /* find length of the stylus' projected vector on the XY plane */
+       vecLen = cos(altRad);
+

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to