1 | /*
|
---|
2 | -----------------------------------------------------------------------------
|
---|
3 | This source file is part of OGRE
|
---|
4 | (Object-oriented Graphics Rendering Engine)
|
---|
5 | For the latest info, see http://www.ogre3d.org/
|
---|
6 |
|
---|
7 | Copyright (c) 2000-2005 The OGRE Team
|
---|
8 | Also see acknowledgements in Readme.html
|
---|
9 |
|
---|
10 | This program is free software; you can redistribute it and/or modify it under
|
---|
11 | the terms of the GNU Lesser General Public License as published by the Free Software
|
---|
12 | Foundation; either version 2 of the License, or (at your option) any later
|
---|
13 | version.
|
---|
14 |
|
---|
15 | This program is distributed in the hope that it will be useful, but WITHOUT
|
---|
16 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
---|
17 | FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
---|
18 |
|
---|
19 | You should have received a copy of the GNU Lesser General Public License along with
|
---|
20 | this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
---|
21 | Place - Suite 330, Boston, MA 02111-1307, USA, or go to
|
---|
22 | http://www.gnu.org/copyleft/lesser.txt.
|
---|
23 | -----------------------------------------------------------------------------
|
---|
24 | */
|
---|
25 | #ifndef __Input_H__
|
---|
26 | #define __Input_H__
|
---|
27 |
|
---|
28 | #include "OgrePrerequisites.h"
|
---|
29 |
|
---|
30 | namespace Ogre {
|
---|
31 |
|
---|
32 | /** Keyboard scan codes - copied from DirectInput for now for speed.
|
---|
33 | */
|
---|
34 | enum KeyCode
|
---|
35 | {
|
---|
36 | KC_ESCAPE =0x01,
|
---|
37 | KC_1 =0x02,
|
---|
38 | KC_2 =0x03,
|
---|
39 | KC_3 =0x04,
|
---|
40 | KC_4 =0x05,
|
---|
41 | KC_5 =0x06,
|
---|
42 | KC_6 =0x07,
|
---|
43 | KC_7 =0x08,
|
---|
44 | KC_8 =0x09,
|
---|
45 | KC_9 =0x0A,
|
---|
46 | KC_0 =0x0B,
|
---|
47 | KC_MINUS =0x0C, /* - on main keyboard */
|
---|
48 | KC_EQUALS =0x0D,
|
---|
49 | KC_BACK =0x0E, /* backspace */
|
---|
50 | KC_TAB =0x0F,
|
---|
51 | KC_Q =0x10,
|
---|
52 | KC_W =0x11,
|
---|
53 | KC_E =0x12,
|
---|
54 | KC_R =0x13,
|
---|
55 | KC_T =0x14,
|
---|
56 | KC_Y =0x15,
|
---|
57 | KC_U =0x16,
|
---|
58 | KC_I =0x17,
|
---|
59 | KC_O =0x18,
|
---|
60 | KC_P =0x19,
|
---|
61 | KC_LBRACKET =0x1A,
|
---|
62 | KC_RBRACKET =0x1B,
|
---|
63 | KC_RETURN =0x1C, /* Enter on main keyboard */
|
---|
64 | KC_LCONTROL =0x1D,
|
---|
65 | KC_A =0x1E,
|
---|
66 | KC_S =0x1F,
|
---|
67 | KC_D =0x20,
|
---|
68 | KC_F =0x21,
|
---|
69 | KC_G =0x22,
|
---|
70 | KC_H =0x23,
|
---|
71 | KC_J =0x24,
|
---|
72 | KC_K =0x25,
|
---|
73 | KC_L =0x26,
|
---|
74 | KC_SEMICOLON =0x27,
|
---|
75 | KC_APOSTROPHE =0x28,
|
---|
76 | KC_GRAVE =0x29, /* accent grave */
|
---|
77 | KC_LSHIFT =0x2A,
|
---|
78 | KC_BACKSLASH =0x2B,
|
---|
79 | KC_Z =0x2C,
|
---|
80 | KC_X =0x2D,
|
---|
81 | KC_C =0x2E,
|
---|
82 | KC_V =0x2F,
|
---|
83 | KC_B =0x30,
|
---|
84 | KC_N =0x31,
|
---|
85 | KC_M =0x32,
|
---|
86 | KC_COMMA =0x33,
|
---|
87 | KC_PERIOD =0x34, /* . on main keyboard */
|
---|
88 | KC_SLASH =0x35, /* '/' on main keyboard */
|
---|
89 | KC_RSHIFT =0x36,
|
---|
90 | KC_MULTIPLY =0x37, /* * on numeric keypad */
|
---|
91 | KC_LMENU =0x38, /* left Alt */
|
---|
92 | KC_SPACE =0x39,
|
---|
93 | KC_CAPITAL =0x3A,
|
---|
94 | KC_F1 =0x3B,
|
---|
95 | KC_F2 =0x3C,
|
---|
96 | KC_F3 =0x3D,
|
---|
97 | KC_F4 =0x3E,
|
---|
98 | KC_F5 =0x3F,
|
---|
99 | KC_F6 =0x40,
|
---|
100 | KC_F7 =0x41,
|
---|
101 | KC_F8 =0x42,
|
---|
102 | KC_F9 =0x43,
|
---|
103 | KC_F10 =0x44,
|
---|
104 | KC_NUMLOCK =0x45,
|
---|
105 | KC_SCROLL =0x46, /* Scroll Lock */
|
---|
106 | KC_NUMPAD7 =0x47,
|
---|
107 | KC_NUMPAD8 =0x48,
|
---|
108 | KC_NUMPAD9 =0x49,
|
---|
109 | KC_SUBTRACT =0x4A, /* - on numeric keypad */
|
---|
110 | KC_NUMPAD4 =0x4B,
|
---|
111 | KC_NUMPAD5 =0x4C,
|
---|
112 | KC_NUMPAD6 =0x4D,
|
---|
113 | KC_ADD =0x4E, /* + on numeric keypad */
|
---|
114 | KC_NUMPAD1 =0x4F,
|
---|
115 | KC_NUMPAD2 =0x50,
|
---|
116 | KC_NUMPAD3 =0x51,
|
---|
117 | KC_NUMPAD0 =0x52,
|
---|
118 | KC_DECIMAL =0x53, /* . on numeric keypad */
|
---|
119 | KC_OEM_102 =0x56, /* < > | on UK/Germany keyboards */
|
---|
120 | KC_F11 =0x57,
|
---|
121 | KC_F12 =0x58,
|
---|
122 | KC_F13 =0x64, /* (NEC PC98) */
|
---|
123 | KC_F14 =0x65, /* (NEC PC98) */
|
---|
124 | KC_F15 =0x66, /* (NEC PC98) */
|
---|
125 | KC_KANA =0x70, /* (Japanese keyboard) */
|
---|
126 | KC_ABNT_C1 =0x73, /* / ? on Portugese (Brazilian) keyboards */
|
---|
127 | KC_CONVERT =0x79, /* (Japanese keyboard) */
|
---|
128 | KC_NOCONVERT =0x7B, /* (Japanese keyboard) */
|
---|
129 | KC_YEN =0x7D, /* (Japanese keyboard) */
|
---|
130 | KC_ABNT_C2 =0x7E, /* Numpad . on Portugese (Brazilian) keyboards */
|
---|
131 | KC_NUMPADEQUALS =0x8D, /* = on numeric keypad (NEC PC98) */
|
---|
132 | KC_PREVTRACK =0x90, /* Previous Track (KC_CIRCUMFLEX on Japanese keyboard) */
|
---|
133 | KC_AT =0x91, /* (NEC PC98) */
|
---|
134 | KC_COLON =0x92, /* (NEC PC98) */
|
---|
135 | KC_UNDERLINE =0x93, /* (NEC PC98) */
|
---|
136 | KC_KANJI =0x94, /* (Japanese keyboard) */
|
---|
137 | KC_STOP =0x95, /* (NEC PC98) */
|
---|
138 | KC_AX =0x96, /* (Japan AX) */
|
---|
139 | KC_UNLABELED =0x97, /* (J3100) */
|
---|
140 | KC_NEXTTRACK =0x99, /* Next Track */
|
---|
141 | KC_NUMPADENTER =0x9C, /* Enter on numeric keypad */
|
---|
142 | KC_RCONTROL =0x9D,
|
---|
143 | KC_MUTE =0xA0, /* Mute */
|
---|
144 | KC_CALCULATOR =0xA1, /* Calculator */
|
---|
145 | KC_PLAYPAUSE =0xA2, /* Play / Pause */
|
---|
146 | KC_MEDIASTOP =0xA4, /* Media Stop */
|
---|
147 | KC_VOLUMEDOWN =0xAE, /* Volume - */
|
---|
148 | KC_VOLUMEUP =0xB0, /* Volume + */
|
---|
149 | KC_WEBHOME =0xB2, /* Web home */
|
---|
150 | KC_NUMPADCOMMA =0xB3, /* , on numeric keypad (NEC PC98) */
|
---|
151 | KC_DIVIDE =0xB5, /* / on numeric keypad */
|
---|
152 | KC_SYSRQ =0xB7,
|
---|
153 | KC_RMENU =0xB8, /* right Alt */
|
---|
154 | KC_PAUSE =0xC5, /* Pause */
|
---|
155 | KC_HOME =0xC7, /* Home on arrow keypad */
|
---|
156 | KC_UP =0xC8, /* UpArrow on arrow keypad */
|
---|
157 | KC_PGUP =0xC9, /* PgUp on arrow keypad */
|
---|
158 | KC_LEFT =0xCB, /* LeftArrow on arrow keypad */
|
---|
159 | KC_RIGHT =0xCD, /* RightArrow on arrow keypad */
|
---|
160 | KC_END =0xCF, /* End on arrow keypad */
|
---|
161 | KC_DOWN =0xD0, /* DownArrow on arrow keypad */
|
---|
162 | KC_PGDOWN =0xD1, /* PgDn on arrow keypad */
|
---|
163 | KC_INSERT =0xD2, /* Insert on arrow keypad */
|
---|
164 | KC_DELETE =0xD3, /* Delete on arrow keypad */
|
---|
165 | KC_LWIN =0xDB, /* Left Windows key */
|
---|
166 | KC_RWIN =0xDC, /* Right Windows key */
|
---|
167 | KC_APPS =0xDD, /* AppMenu key */
|
---|
168 | KC_POWER =0xDE, /* System Power */
|
---|
169 | KC_SLEEP =0xDF, /* System Sleep */
|
---|
170 | KC_WAKE =0xE3, /* System Wake */
|
---|
171 | KC_WEBSEARCH =0xE5, /* Web Search */
|
---|
172 | KC_WEBFAVORITES =0xE6, /* Web Favorites */
|
---|
173 | KC_WEBREFRESH =0xE7, /* Web Refresh */
|
---|
174 | KC_WEBSTOP =0xE8, /* Web Stop */
|
---|
175 | KC_WEBFORWARD =0xE9, /* Web Forward */
|
---|
176 | KC_WEBBACK =0xEA, /* Web Back */
|
---|
177 | KC_MYCOMPUTER =0xEB, /* My Computer */
|
---|
178 | KC_MAIL =0xEC, /* Mail */
|
---|
179 | KC_MEDIASELECT =0xED /* Media Select */
|
---|
180 | };
|
---|
181 |
|
---|
182 | /** Structure representing a snapshot of the state of the mouse
|
---|
183 | input controller. */
|
---|
184 | struct _OgreExport MouseState
|
---|
185 | {
|
---|
186 | /** Absolute position of the mouse pointer. */
|
---|
187 | long Xabs, Yabs, Zabs;
|
---|
188 | /** Relative position of the mouse pointer. */
|
---|
189 | long Xrel, Yrel, Zrel;
|
---|
190 | /** The buttons that have been pressed. Each bit maps to a mouse
|
---|
191 | button. */
|
---|
192 | long Buttons;
|
---|
193 |
|
---|
194 | /** Retrieves the pressed state of a mouse button. */
|
---|
195 | inline long isButtonDown( uchar button ) const
|
---|
196 | {
|
---|
197 | return Buttons & ( 1 << button );
|
---|
198 | }
|
---|
199 | };
|
---|
200 |
|
---|
201 | /** Abstract class which allows input to be read from various
|
---|
202 | controllers.
|
---|
203 | @remarks
|
---|
204 | You can access an appropriate concrete subclass of this interface by
|
---|
205 | calling PlatformManager::createInputReader.
|
---|
206 | @warning Temporary implementation only. This class is likely to be
|
---|
207 | refactored into a better design when I get time to look at it
|
---|
208 | properly. For now it's a quick-and-dirty way to get what I need.
|
---|
209 | @see
|
---|
210 | PlatformManager::createInputReader
|
---|
211 | */
|
---|
212 | class _OgreExport InputReader
|
---|
213 | {
|
---|
214 | public:
|
---|
215 | InputReader();
|
---|
216 | virtual ~InputReader();
|
---|
217 |
|
---|
218 | /** Tells the reader to use buffered input and update the passed in queue.
|
---|
219 | @remarks
|
---|
220 | The default behaviour of the input reader is simply to capture the
|
---|
221 | current state of the mouse / keyboard on demand. An alternative is to use
|
---|
222 | buffered input where all events are registered on a queue.
|
---|
223 | */
|
---|
224 | void useBufferedInput(EventQueue* pEventQueue, bool keys = true, bool mouse = true) ;
|
---|
225 |
|
---|
226 | virtual void setBufferedInput(bool keys, bool mouse) ;
|
---|
227 |
|
---|
228 |
|
---|
229 | /** Initialise the input system.
|
---|
230 | @note
|
---|
231 | Only keyboard and mouse currently implemented.
|
---|
232 | @param
|
---|
233 | pWindow The window to capture input for
|
---|
234 | @param
|
---|
235 | useKeyboard If true, keyboard input will be supported.
|
---|
236 | @param
|
---|
237 | useMouse If true, mouse input will be supported.
|
---|
238 | @param
|
---|
239 | useGameController If true, joysticks/gamepads will be supported.
|
---|
240 | */
|
---|
241 | virtual void initialise(
|
---|
242 | RenderWindow* pWindow,
|
---|
243 | bool useKeyboard = true,
|
---|
244 | bool useMouse = true,
|
---|
245 | bool useGameController = false ) = 0;
|
---|
246 |
|
---|
247 | /** Captures the state of all the input devices.
|
---|
248 | @remarks
|
---|
249 | This method captures the state of all input devices and
|
---|
250 | stores it internally for use when the enquiry methods are
|
---|
251 | next called. This is done to ensure that all input is
|
---|
252 | captured at once and therefore combinations of input are not
|
---|
253 | subject to time differences when methods are called.
|
---|
254 |
|
---|
255 | */
|
---|
256 | virtual void capture() = 0;
|
---|
257 |
|
---|
258 | /** Determines if the specified key is currently depressed.
|
---|
259 | @note In immediate mode, this enquiry method uses the state of the
|
---|
260 | keyboard at the last 'capture' call.
|
---|
261 | */
|
---|
262 | virtual bool isKeyDown( KeyCode kc ) const;
|
---|
263 |
|
---|
264 | /** Retrieves the relative position of the mouse when capture was
|
---|
265 | called relative to the last time. */
|
---|
266 | virtual long getMouseRelativeX() const { return getMouseRelX(); }
|
---|
267 |
|
---|
268 | /** Retrieves the relative position of the mouse when capture was
|
---|
269 | called relative to the last time. */
|
---|
270 | virtual long getMouseRelativeY() const { return getMouseRelY(); }
|
---|
271 |
|
---|
272 | /** Retrieves the relative position of the mouse when capture was
|
---|
273 | called relative to the last time. */
|
---|
274 | virtual long getMouseRelativeZ() const { return getMouseRelZ(); }
|
---|
275 |
|
---|
276 | /** Retrieves the relative (compared to the last input poll) mouse movement
|
---|
277 | on the X (horizontal) axis. */
|
---|
278 | virtual long getMouseRelX() const = 0;
|
---|
279 |
|
---|
280 | /** Retrieves the relative (compared to the last input poll) mouse movement
|
---|
281 | on the Y (vertical) axis. */
|
---|
282 | virtual long getMouseRelY() const = 0;
|
---|
283 |
|
---|
284 | /** Retrieves the relative (compared to the last input poll) mouse movement
|
---|
285 | on the Z (mouse wheel) axis. */
|
---|
286 | virtual long getMouseRelZ() const = 0;
|
---|
287 |
|
---|
288 | /** Retrieves the absolute mouse position on the X (horizontal) axis. */
|
---|
289 | virtual long getMouseAbsX() const = 0;
|
---|
290 | /** Retrieves the absolute mouse position on the Y (vertical) axis. */
|
---|
291 | virtual long getMouseAbsY() const = 0;
|
---|
292 | /** Retrieves the absolute mouse position on the Z (mouse wheel) axis. */
|
---|
293 | virtual long getMouseAbsZ() const = 0;
|
---|
294 |
|
---|
295 | /** Retrieves the current state of the mouse. */
|
---|
296 | virtual void getMouseState( MouseState& state ) const = 0;
|
---|
297 |
|
---|
298 | /** Retrieves the state of a mouse button. */
|
---|
299 | virtual bool getMouseButton( uchar button ) const = 0;
|
---|
300 |
|
---|
301 | /** Adds a mouse motion listener to the cursor object.
|
---|
302 | This keeps the Cursor object hidden. */
|
---|
303 | void addCursorMoveListener( MouseMotionListener* c );
|
---|
304 |
|
---|
305 | /** Remove a mouse motion listener to the cursor object.
|
---|
306 | This keeps the Cursor object hidden. */
|
---|
307 | void removeCursorMoveListener( MouseMotionListener* c );
|
---|
308 | static char getKeyChar(int keyCode, long modifiers = 0);
|
---|
309 |
|
---|
310 |
|
---|
311 | protected:
|
---|
312 |
|
---|
313 | /** The modifiers are a binary flags that represent what buttons are pressed,
|
---|
314 | and what key modifiers are down (e.g. shift/alt). */
|
---|
315 | long mModifiers;
|
---|
316 |
|
---|
317 | /** Internal Cursor object.
|
---|
318 | @remarks
|
---|
319 | This is a mathematical representation of where the cursor is, it does
|
---|
320 | not draw a cursor.
|
---|
321 | @see CursorGuiElement. */
|
---|
322 |
|
---|
323 | Cursor* mCursor;
|
---|
324 |
|
---|
325 | /** EventQueue is used for buffered input support. */
|
---|
326 | EventQueue* mEventQueue;
|
---|
327 |
|
---|
328 | /** Wether to use buffering input support - buffering support relies on using
|
---|
329 | an EventQueue.
|
---|
330 | @see class EventQueue */
|
---|
331 | bool mUseBufferedKeys, mUseBufferedMouse;
|
---|
332 |
|
---|
333 | /** The mouse state in immediate mode. */
|
---|
334 | MouseState mMouseState;
|
---|
335 |
|
---|
336 | /// Set of all the keys currently depressed based on buffered input events
|
---|
337 | typedef std::set<KeyCode> BufferedKeysDownSet;
|
---|
338 | BufferedKeysDownSet mBufferedKeysDown;
|
---|
339 |
|
---|
340 | /** Creates mouse moved or dragged events depending if any button is pressed. */
|
---|
341 | void mouseMoved();
|
---|
342 |
|
---|
343 | /** Creates a MouseEvent that first gets processed by the cursor, then gets
|
---|
344 | pushed on the queue. */
|
---|
345 | void createMouseEvent(int id, int button);
|
---|
346 |
|
---|
347 | /** Creates mouse pressed, released, and clicked events. */
|
---|
348 | void triggerMouseButton(int nMouseCode, bool mousePressed);
|
---|
349 |
|
---|
350 | void createKeyEvent(int id, int key);
|
---|
351 | void keyChanged(int key, bool down);
|
---|
352 |
|
---|
353 | /** Return whether a key is down in immediate mode. */
|
---|
354 | virtual bool isKeyDownImmediate( KeyCode kc ) const = 0;
|
---|
355 | };
|
---|
356 |
|
---|
357 |
|
---|
358 | /** Defines the interface a platform-specific library must implement.
|
---|
359 | @remarks
|
---|
360 | Any library (.dll, .so) wishing to implement a
|
---|
361 | platform-specific version of this input reader must export the
|
---|
362 | symbol 'createInputReader' with the signature void
|
---|
363 | createPlatformInputReader(InputReader** ppReader).
|
---|
364 | */
|
---|
365 | typedef void (*DLL_CREATEINPUTREADER)(InputReader** ppReader);
|
---|
366 |
|
---|
367 | }
|
---|
368 |
|
---|
369 | #endif
|
---|