[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34449] branches/merwin-tablet-2/intern/ ghost/intern: Mac gets a TabletManager, refactored the same on other platforms

Mike Erwin significant.bit at gmail.com
Sat Jan 22 07:41:35 CET 2011


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



More information about the Bf-blender-cvs mailing list