564b0f6f2393af16bc01394bf31079f74e027f35
[blender.git] / intern / ghost / intern / GHOST_NDOFManager.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version. 
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s):
19  *   Mike Erwin
20  *
21  * ***** END GPL LICENSE BLOCK *****
22  */
23  
24 #ifndef _GHOST_NDOFMANAGER_H_
25 #define _GHOST_NDOFMANAGER_H_
26
27 #include "GHOST_System.h"
28
29
30 // --- the following type definitions will find a home somewhere else once finished ---
31
32 // #define DEBUG_NDOF_MOTION
33 #define DEBUG_NDOF_BUTTONS
34
35 typedef enum { NDOF_UnknownDevice, NDOF_SpaceNavigator, NDOF_SpaceExplorer, NDOF_SpacePilotPro } NDOF_DeviceT;
36
37 // NDOF device button event types
38 typedef enum {
39         // used internally, never sent
40         NDOF_BUTTON_NONE,
41         // these two are available from any 3Dconnexion device
42         NDOF_BUTTON_MENU,
43         NDOF_BUTTON_FIT,
44         // standard views
45         NDOF_BUTTON_TOP,
46         NDOF_BUTTON_BOTTOM,
47         NDOF_BUTTON_LEFT,
48         NDOF_BUTTON_RIGHT,
49         NDOF_BUTTON_FRONT,
50         NDOF_BUTTON_BACK,
51         // more views
52         NDOF_BUTTON_ISO1,
53         NDOF_BUTTON_ISO2,
54         // 90 degree rotations
55         NDOF_BUTTON_ROLL_CW,
56         NDOF_BUTTON_ROLL_CCW,
57         NDOF_BUTTON_SPIN_CW,
58         NDOF_BUTTON_SPIN_CCW,
59         NDOF_BUTTON_TILT_CW,
60         NDOF_BUTTON_TILT_CCW,
61         // device control
62         NDOF_BUTTON_ROTATE,
63         NDOF_BUTTON_PANZOOM,
64         NDOF_BUTTON_DOMINANT,
65         NDOF_BUTTON_PLUS,
66         NDOF_BUTTON_MINUS,
67         // general-purpose buttons
68         NDOF_BUTTON_1,
69         NDOF_BUTTON_2,
70         NDOF_BUTTON_3,
71         NDOF_BUTTON_4,
72         NDOF_BUTTON_5,
73         NDOF_BUTTON_6,
74         NDOF_BUTTON_7,
75         NDOF_BUTTON_8,
76         NDOF_BUTTON_9,
77         NDOF_BUTTON_10,
78         } NDOF_ButtonT;
79
80 class GHOST_NDOFManager
81 {
82 public:
83         GHOST_NDOFManager(GHOST_System&);
84
85         virtual ~GHOST_NDOFManager() {};
86
87         // whether multi-axis functionality is available (via the OS or driver)
88         // does not imply that a device is plugged in or being used
89         virtual bool available() = 0;
90
91         // the latest raw data from the device
92         void updateTranslation(short t[3], GHOST_TUns64 time);
93         void updateRotation(short r[3], GHOST_TUns64 time);
94         // send events immediately for changed buttons
95         void updateButton(int button_number, bool press, GHOST_TUns64 time);
96         void updateButtons(int button_bits, GHOST_TUns64 time);
97
98         // processes most recent raw data into an NDOFMotion event and sends it
99         // returns whether an event was sent
100         bool sendMotionEvent();
101
102 private:
103         void sendButtonEvent(NDOF_ButtonT, bool press, GHOST_TUns64 time, GHOST_IWindow*);
104         void sendKeyEvent(GHOST_TKey, bool press, GHOST_TUns64 time, GHOST_IWindow*);
105
106 protected:
107         GHOST_System& m_system;
108
109         NDOF_DeviceT m_deviceType;
110
111         short m_translation[3];
112         short m_rotation[3];
113         int m_buttons; // bit field
114
115         GHOST_TUns64 m_motionTime; // in milliseconds
116         GHOST_TUns64 m_prevMotionTime; // time of most recent Motion event sent
117         bool m_atRest;
118 };
119
120 #endif