Revision: 34449
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=34449
Author:   merwin
Date:     2011-01-22 06:41:34 +0000 (Sat, 22 Jan 2011)
Log Message:
-----------
Mac gets a TabletManager, refactored the same on other platforms

Modified Paths:
--------------
    branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManager.cpp
    branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManager.h
    branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerWin32.cpp
    branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerX11.cpp
    branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerX11.h

Added Paths:
-----------
    branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.h
    branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.mm

Modified: branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManager.cpp
===================================================================
--- branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManager.cpp        
2011-01-22 04:40:15 UTC (rev 34448)
+++ branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManager.cpp        
2011-01-22 06:41:34 UTC (rev 34449)
@@ -1,16 +1,28 @@
 
 #include "GHOST_TabletManager.h"
-#include "GHOST_Window.h"
 
+void reset(TabletTool& tool) // to default state
+       {
+       tool.type = TABLET_NONE;
+       tool.hasPressure = false;
+       tool.hasTilt = false;
+       }
+
 GHOST_TabletManager::GHOST_TabletManager()
        : hasPressure(false)
        , hasTilt(false)
        , activeWindow(NULL)
        {
-       activeTool.type = TABLET_NONE;
+       reset(activeTool);
        }
 
 GHOST_TabletManager::~GHOST_TabletManager()
        {
        }
 
+void GHOST_TabletManager::dropTool()
+       {
+       puts("dropped tool");
+       reset(activeTool);
+       activeWindow = NULL;
+       }

Modified: branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManager.h
===================================================================
--- branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManager.h  
2011-01-22 04:40:15 UTC (rev 34448)
+++ branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManager.h  
2011-01-22 06:41:34 UTC (rev 34449)
@@ -1,10 +1,9 @@
 #ifndef GHOST_TABLET_MANAGER_H
 #define GHOST_TABLET_MANAGER_H
 
-// #include <vector>
+#include "GHOST_Types.h"
+#include "GHOST_Window.h"
 
-class GHOST_Window;
-
 // TabletToolData (and its components) are meant to replace GHOST_TabletData
 // and its customdata analogue in the window manager. For now it's confined to 
the
 // TabletManager.
@@ -21,6 +20,7 @@
 
        } TabletTool;
 
+void reset(TabletTool&); // to default state
 
 typedef struct
        {
@@ -31,31 +31,26 @@
 
        } TabletToolData;
 
-/*
-struct Tablet
-       {
-       bool hasPressure;
-       float pressureScale;
 
-       bool hasTilt;
-       float azimuthScale;
-       float altitudeScale;
-       };
-*/
-
 class GHOST_TabletManager
        {
 protected:
        // tablet attributes
        bool hasPressure;
        float pressureScale;
+
        bool hasTilt;
-       float azimuthScale;
-       float altitudeScale;
+       union {
+               struct {
+                       float azimuthScale;
+                       float altitudeScale;
+                       };
+               struct {
+                       float xTiltScale;
+                       float yTiltScale;
+                       };
+               };
 
-//     std::vector<Tablet> tablets;
-//     std::vector<TabletTool> tools;
-
        GHOST_Window* activeWindow;
        TabletTool activeTool;
 
@@ -64,6 +59,8 @@
        virtual ~GHOST_TabletManager();
 
        virtual bool available() = 0;
+
+       virtual void dropTool();
        };
 
 #endif

Added: branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.h
===================================================================
--- branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.h     
                        (rev 0)
+++ branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.h     
2011-01-22 06:41:34 UTC (rev 34449)
@@ -0,0 +1,22 @@
+#ifndef GHOST_TABLET_MANAGER_COCOA_H
+#define GHOST_TABLET_MANAGER_COCOA_H
+
+#include "GHOST_TabletManager.h"
+#include "GHOST_Event.h"
+
+class GHOST_TabletManagerCocoa : public GHOST_TabletManager
+       {
+       void fillTabletData(GHOST_TabletData&, void* nsevent);
+
+public:
+       GHOST_TabletManagerCocoa();
+       ~GHOST_TabletManagerCocoa();
+
+       bool available();
+
+       GHOST_Event* convertEvent(void* nsevent, GHOST_Window*); // send motion 
& button events here
+       void pickupTool(void* nsevent); // send proximity events here
+       };
+
+#endif
+


Property changes on: 
branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.h
___________________________________________________________________
Added: svn:eol-style
   + native

Added: branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.mm
===================================================================
--- branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.mm    
                        (rev 0)
+++ branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.mm    
2011-01-22 06:41:34 UTC (rev 34449)
@@ -0,0 +1,186 @@
+
+#include "GHOST_TabletManagerCocoa.h"
+#include "GHOST_EventCursor.h"
+#include "GHOST_EventButton.h"
+#include <AppKit/AppKit.h>
+
+GHOST_TabletManagerCocoa::GHOST_TabletManagerCocoa()
+       : GHOST_TabletManager()
+       {
+       }
+
+GHOST_TabletManagerCocoa::~GHOST_TabletManagerCocoa()
+       {
+       }
+
+bool GHOST_TabletManagerCocoa::available()
+       {
+       // API is always available, whether or not hardware is present
+       return true;
+       }
+
+void GHOST_TabletManagerCocoa::fillTabletData(GHOST_TabletData& tablet, void* 
nsevent)
+       {
+       NSEvent* event  = (NSEvent*) nsevent;
+
+       tablet.Active = (GHOST_TTabletMode) activeTool.type;
+       tablet.Pressure = [event pressure];
+       if (hasTilt)
+               {
+               NSPoint tilt = [event tilt];
+               tablet.Xtilt = tilt.x;
+               tablet.Ytilt = tilt.y;
+               }
+       else
+               tablet.Xtilt = tablet.Ytilt = 0;
+       }
+
+static GHOST_TButtonMask convert(NSEvent* event)
+       {
+       printf("tablet button %d\n", [event buttonNumber]);
+
+       switch ([event buttonNumber])
+               {
+               case 0: return GHOST_kButtonMaskLeft;
+               case 1: return GHOST_kButtonMaskRight;
+               case 2: return GHOST_kButtonMaskMiddle;
+               case 3: return GHOST_kButtonMaskButton4;
+               case 4: return GHOST_kButtonMaskButton5;
+               default:
+                       printf("<!> strange tablet button: %d\n", [event 
buttonNumber]);
+                       return GHOST_kButtonNumMasks; // this will never be used
+               }
+       }
+
+GHOST_Event* GHOST_TabletManagerCocoa::convertEvent(void* nsevent, 
GHOST_Window* window)
+       {
+       NSEvent* event  = (NSEvent*) nsevent;
+       GHOST_Event* ghostEvent = NULL;
+
+       switch ([event type])
+               {
+               case NSLeftMouseDown:
+               case NSRightMouseDown:
+               case NSOtherMouseDown:
+                       {
+                       printf("tool button %d down\n", [event buttonNumber]);
+                       GHOST_EventButton* e = new GHOST_EventButton([event 
timestamp]*1000, GHOST_kEventButtonDown, window, convert(event));
+                       GHOST_TEventButtonData* data = 
(GHOST_TEventButtonData*) e->getData();
+                       fillTabletData(data->tablet, event);
+                       ghostEvent = e;
+                       break;
+                       }
+               case NSLeftMouseUp:
+               case NSRightMouseUp:
+               case NSOtherMouseUp:
+                       {
+                       printf("tool button %d up\n", [event buttonNumber]);
+                       GHOST_EventButton* e = new GHOST_EventButton([event 
timestamp]*1000, GHOST_kEventButtonUp, window, convert(event));
+                       GHOST_TEventButtonData* data = 
(GHOST_TEventButtonData*) e->getData();
+                       fillTabletData(data->tablet, event);
+                       ghostEvent = e;
+                       break;
+                       }
+               default:
+                       {
+                       printf("tool move ");
+                       NSPoint pos = [event locationInWindow];
+                       if (true) { // display some useful info
+                               float event_dx = [event deltaX];
+                               float event_dy = [event deltaY];
+                               printf("<%.2f,%.2f> to (%.2f,%.2f)\n", 
event_dx, event_dy, pos.x, pos.y);
+                               }
+                       GHOST_EventCursor* e = new GHOST_EventCursor([event 
timestamp]*1000, GHOST_kEventCursorMove, window, pos.x, pos.y);
+                       GHOST_TEventCursorData* data = 
(GHOST_TEventCursorData*) e->getData();
+                       fillTabletData(data->tablet, event);
+                       ghostEvent = e;
+                       break;
+                       }
+               }
+
+       return ghostEvent;
+       }
+
+// these are from Wacom's Mac SDK
+// (no idea whether other vendors use them)
+#define  kTransducerDeviceIdBitMask           0x0001
+#define  kTransducerAbsXBitMask               0x0002
+#define  kTransducerAbsYBitMask               0x0004
+#define  kTransducerVendor1BitMask            0x0008
+#define  kTransducerVendor2BitMask            0x0010
+#define  kTransducerVendor3BitMask            0x0020
+#define  kTransducerButtonsBitMask            0x0040
+#define  kTransducerTiltXBitMask              0x0080
+#define  kTransducerTiltYBitMask              0x0100
+#define  kTransducerAbsZBitMask               0x0200
+#define  kTransducerPressureBitMask           0x0400
+#define  kTransducerTangentialPressureBitMask 0x0800
+#define  kTransducerOrientInfoBitMask         0x1000
+#define  kTransducerRotationBitMask           0x2000
+
+void GHOST_TabletManagerCocoa::pickupTool(void* nsevent)
+       {
+       NSEvent* event  = (NSEvent*) nsevent;
+
+       reset(activeTool);
+
+       printf("picked up ");
+
+       switch ([event pointingDeviceType])
+               {
+               case NSPenPointingDevice:
+                       printf("pen\n");
+                       activeTool.type = TABLET_PEN;
+                       break;
+               case NSEraserPointingDevice:
+                       printf("eraser\n");
+                       activeTool.type = TABLET_ERASER;
+                       break;
+               case NSCursorPointingDevice:
+                       printf("cursor\n");
+                       activeTool.type = TABLET_MOUSE;
+                       break;
+               default:
+                       printf("<!> unknown device %d\n", [event 
pointingDeviceType]);
+               }
+
+       int cap = [event capabilityMask];
+       printf("  capabilities:\n");
+       if (cap & kTransducerDeviceIdBitMask)
+               printf("  - device id\n");
+       if (cap & kTransducerAbsXBitMask)
+               printf("  - abs x\n");
+       if (cap & kTransducerAbsYBitMask)
+               printf("  - abs y\n");
+       if (cap & kTransducerAbsZBitMask)
+               printf("  - abs z\n");
+       if (cap & kTransducerVendor1BitMask)
+               printf("  - vendor 1\n");
+       if (cap & kTransducerVendor2BitMask)
+               printf("  - vendor 2\n");
+       if (cap & kTransducerVendor3BitMask)
+               printf("  - vendor 3\n");
+       if (cap & kTransducerButtonsBitMask)
+               printf("  - buttons\n");
+       if (cap & kTransducerTiltXBitMask)
+               {
+               printf("  - tilt x\n");
+               activeTool.hasTilt = true;
+               }
+       if (cap & kTransducerTiltYBitMask)
+               {
+               printf("  - tilt y\n");
+               activeTool.hasTilt = true;
+               }
+       if (cap & kTransducerPressureBitMask)
+               {
+               printf("  - pressure\n");
+               activeTool.hasPressure = true;
+               }
+       if (cap & kTransducerTangentialPressureBitMask)
+               printf("  - tangential pressure\n");
+       if (cap & kTransducerOrientInfoBitMask)
+               printf("  - orientation\n");
+       if (cap & kTransducerRotationBitMask)
+               printf("  - rotation\n");
+       }

Modified: 
branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerWin32.cpp
===================================================================
--- branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerWin32.cpp   
2011-01-22 04:40:15 UTC (rev 34448)
+++ branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerWin32.cpp   
2011-01-22 06:41:34 UTC (rev 34449)
@@ -646,14 +646,9 @@
 
 void GHOST_TabletManagerWin32::dropTool()
        {
-       activeTool.type = TABLET_NONE;
-       activeTool.hasPressure = false;
-       activeTool.hasTilt = false;
-
+       ::dropTool();
        prevMouseX = prevMouseY = 0;
        prevButtons = 0;
-
-       activeWindow = NULL;
        }
 
 bool GHOST_TabletManagerWin32::anyButtonsDown()

Modified: 
branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerX11.cpp
===================================================================
--- branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerX11.cpp     
2011-01-22 04:40:15 UTC (rev 34448)

@@ 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