style cleanup
[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 // #define DEBUG_NDOF_MOTION
31 // #define DEBUG_NDOF_BUTTONS
32
33 typedef enum {
34         NDOF_UnknownDevice,
35
36         // current devices
37         NDOF_SpaceNavigator,
38         NDOF_SpaceExplorer,
39         NDOF_SpacePilotPro,
40         NDOF_SpaceMousePro,
41
42         // older devices
43         NDOF_SpacePilot,
44         NDOF_Spaceball5000,
45         NDOF_SpaceTraveler
46
47 } NDOF_DeviceT;
48
49 // NDOF device button event types
50 typedef enum {
51         // used internally, never sent
52         NDOF_BUTTON_NONE,
53         // these two are available from any 3Dconnexion device
54         NDOF_BUTTON_MENU,
55         NDOF_BUTTON_FIT,
56         // standard views
57         NDOF_BUTTON_TOP,
58         NDOF_BUTTON_BOTTOM,
59         NDOF_BUTTON_LEFT,
60         NDOF_BUTTON_RIGHT,
61         NDOF_BUTTON_FRONT,
62         NDOF_BUTTON_BACK,
63         // more views
64         NDOF_BUTTON_ISO1,
65         NDOF_BUTTON_ISO2,
66         // 90 degree rotations
67         // these don't all correspond to physical buttons
68         NDOF_BUTTON_ROLL_CW,
69         NDOF_BUTTON_ROLL_CCW,
70         NDOF_BUTTON_SPIN_CW,
71         NDOF_BUTTON_SPIN_CCW,
72         NDOF_BUTTON_TILT_CW,
73         NDOF_BUTTON_TILT_CCW,
74         // device control
75         NDOF_BUTTON_ROTATE,
76         NDOF_BUTTON_PANZOOM,
77         NDOF_BUTTON_DOMINANT,
78         NDOF_BUTTON_PLUS,
79         NDOF_BUTTON_MINUS,
80         // keyboard emulation
81         NDOF_BUTTON_ESC,
82         NDOF_BUTTON_ALT,
83         NDOF_BUTTON_SHIFT,
84         NDOF_BUTTON_CTRL,
85         // general-purpose buttons
86         // users can assign functions via keymap editor
87         NDOF_BUTTON_1,
88         NDOF_BUTTON_2,
89         NDOF_BUTTON_3,
90         NDOF_BUTTON_4,
91         NDOF_BUTTON_5,
92         NDOF_BUTTON_6,
93         NDOF_BUTTON_7,
94         NDOF_BUTTON_8,
95         NDOF_BUTTON_9,
96         NDOF_BUTTON_10,
97         // more general-purpose buttons
98         NDOF_BUTTON_A,
99         NDOF_BUTTON_B,
100         NDOF_BUTTON_C,
101         // the end
102         NDOF_BUTTON_LAST
103 } NDOF_ButtonT;
104
105 class GHOST_NDOFManager
106 {
107 public:
108         GHOST_NDOFManager(GHOST_System&);
109
110         virtual ~GHOST_NDOFManager() {}
111
112         // whether multi-axis functionality is available (via the OS or driver)
113         // does not imply that a device is plugged in or being used
114         virtual bool available() = 0;
115
116         // each platform's device detection should call this
117         // use standard USB/HID identifiers
118         bool setDevice(unsigned short vendor_id, unsigned short product_id);
119
120         // filter out small/accidental/uncalibrated motions by
121         // setting up a "dead zone" around home position
122         // set to 0 to disable
123         // 0.1 is a safe and reasonable value
124         void setDeadZone(float);
125
126         // the latest raw axis data from the device
127         // NOTE: axis data should be in blender view coordinates
128         //       +X is to the right
129         //       +Y is up
130         //       +Z is out of the screen
131         //       for rotations, look from origin to each +axis
132         //       rotations are + when CCW, - when CW
133         // each platform is responsible for getting axis data into this form
134         // these values should not be scaled (just shuffled or flipped)
135         void updateTranslation(short t[3], GHOST_TUns64 time);
136         void updateRotation(short r[3], GHOST_TUns64 time);
137
138         // the latest raw button data from the device
139         // use HID button encoding (not NDOF_ButtonT)
140         void updateButton(int button_number, bool press, GHOST_TUns64 time);
141         void updateButtons(int button_bits, GHOST_TUns64 time);
142         // NDOFButton events are sent immediately
143
144         // processes and sends most recent raw data as an NDOFMotion event
145         // returns whether an event was sent
146         bool sendMotionEvent();
147
148 protected:
149         GHOST_System& m_system;
150
151 private:
152         void sendButtonEvent(NDOF_ButtonT, bool press, GHOST_TUns64 time, GHOST_IWindow *);
153         void sendKeyEvent(GHOST_TKey, bool press, GHOST_TUns64 time, GHOST_IWindow *);
154
155         NDOF_DeviceT m_deviceType;
156         int m_buttonCount;
157         int m_buttonMask;
158         const NDOF_ButtonT *m_hidMap;
159
160         short m_translation[3];
161         short m_rotation[3];
162         int m_buttons; // bit field
163
164         GHOST_TUns64 m_motionTime; // in milliseconds
165         GHOST_TUns64 m_prevMotionTime; // time of most recent Motion event sent
166
167         GHOST_TProgress m_motionState;
168         bool m_motionEventPending;
169         float m_deadZone; // discard motion with each component < this
170 };
171
172 #endif