root/OpenSceneGraph/trunk/include/osgGA/GUIEventAdapter @ 11938

Revision 11938, 20.6 kB (checked in by robert, 3 years ago)

Build fixes for building OSG with OSG_USE_REF_PTR_IMPLICIT_OUTPUT_CONVERSION set to OFF

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2 *
3 * This library is open source and may be redistributed and/or modified under 
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version.  The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 * OpenSceneGraph Public License for more details.
12*/
13
14#ifndef OSGGA_EVENT
15#define OSGGA_EVENT 1
16
17#include <osg/Object>
18#include <osg/Matrix>
19#include <osg/GraphicsContext>
20#include <osgGA/Export>
21
22namespace osgGA{
23
24
25/** Event class for storing Keyboard, mouse and window events.
26*/
27class OSGGA_EXPORT GUIEventAdapter : public osg::Object
28{
29public:
30
31        enum MouseButtonMask {
32            LEFT_MOUSE_BUTTON    = 1<<0,
33            MIDDLE_MOUSE_BUTTON  = 1<<1,
34            RIGHT_MOUSE_BUTTON   = 1<<2
35        };
36
37        enum EventType {
38            NONE                = 0,
39            PUSH                = 1<<0,
40            RELEASE             = 1<<1,
41            DOUBLECLICK         = 1<<2,
42            DRAG                = 1<<3,
43            MOVE                = 1<<4,
44            KEYDOWN             = 1<<5,
45            KEYUP               = 1<<6,
46            FRAME               = 1<<7,
47            RESIZE              = 1<<8,
48            SCROLL              = 1<<9,
49            PEN_PRESSURE        = 1<<10,
50            PEN_ORIENTATION     = 1<<11,
51            PEN_PROXIMITY_ENTER = 1<<12,
52            PEN_PROXIMITY_LEAVE = 1<<13,
53            CLOSE_WINDOW        = 1<<14,
54            QUIT_APPLICATION    = 1<<15,
55            USER                = 1<<16
56        };
57
58        enum KeySymbol
59        {
60            KEY_Space           = 0x20,
61           
62            KEY_BackSpace       = 0xFF08,        /* back space, back char */
63            KEY_Tab             = 0xFF09,
64            KEY_Linefeed        = 0xFF0A,        /* Linefeed, LF */
65            KEY_Clear           = 0xFF0B,
66            KEY_Return          = 0xFF0D,        /* Return, enter */
67            KEY_Pause           = 0xFF13,        /* Pause, hold */
68            KEY_Scroll_Lock     = 0xFF14,
69            KEY_Sys_Req         = 0xFF15,
70            KEY_Escape          = 0xFF1B,
71            KEY_Delete          = 0xFFFF,        /* Delete, rubout */
72
73
74            /* Cursor control & motion */
75
76            KEY_Home            = 0xFF50,
77            KEY_Left            = 0xFF51,        /* Move left, left arrow */
78            KEY_Up              = 0xFF52,        /* Move up, up arrow */
79            KEY_Right           = 0xFF53,        /* Move right, right arrow */
80            KEY_Down            = 0xFF54,        /* Move down, down arrow */
81            KEY_Prior           = 0xFF55,        /* Prior, previous */
82            KEY_Page_Up         = 0xFF55,
83            KEY_Next            = 0xFF56,        /* Next */
84            KEY_Page_Down       = 0xFF56,
85            KEY_End             = 0xFF57,        /* EOL */
86            KEY_Begin           = 0xFF58,        /* BOL */
87
88
89            /* Misc Functions */
90
91            KEY_Select          = 0xFF60,        /* Select, mark */
92            KEY_Print           = 0xFF61,
93            KEY_Execute         = 0xFF62,        /* Execute, run, do */
94            KEY_Insert          = 0xFF63,        /* Insert, insert here */
95            KEY_Undo            = 0xFF65,        /* Undo, oops */
96            KEY_Redo            = 0xFF66,        /* redo, again */
97            KEY_Menu            = 0xFF67,        /* On Windows, this is VK_APPS, the context-menu key */
98            KEY_Find            = 0xFF68,        /* Find, search */
99            KEY_Cancel          = 0xFF69,        /* Cancel, stop, abort, exit */
100            KEY_Help            = 0xFF6A,        /* Help */
101            KEY_Break           = 0xFF6B,
102            KEY_Mode_switch     = 0xFF7E,        /* Character set switch */
103            KEY_Script_switch   = 0xFF7E,        /* Alias for mode_switch */
104            KEY_Num_Lock        = 0xFF7F,
105
106            /* Keypad Functions, keypad numbers cleverly chosen to map to ascii */
107
108            KEY_KP_Space        = 0xFF80,        /* space */
109            KEY_KP_Tab          = 0xFF89,
110            KEY_KP_Enter        = 0xFF8D,        /* enter */
111            KEY_KP_F1           = 0xFF91,        /* PF1, KP_A, ... */
112            KEY_KP_F2           = 0xFF92,
113            KEY_KP_F3           = 0xFF93,
114            KEY_KP_F4           = 0xFF94,
115            KEY_KP_Home         = 0xFF95,
116            KEY_KP_Left         = 0xFF96,
117            KEY_KP_Up           = 0xFF97,
118            KEY_KP_Right        = 0xFF98,
119            KEY_KP_Down         = 0xFF99,
120            KEY_KP_Prior        = 0xFF9A,
121            KEY_KP_Page_Up      = 0xFF9A,
122            KEY_KP_Next         = 0xFF9B,
123            KEY_KP_Page_Down    = 0xFF9B,
124            KEY_KP_End          = 0xFF9C,
125            KEY_KP_Begin        = 0xFF9D,
126            KEY_KP_Insert       = 0xFF9E,
127            KEY_KP_Delete       = 0xFF9F,
128            KEY_KP_Equal        = 0xFFBD,        /* equals */
129            KEY_KP_Multiply     = 0xFFAA,
130            KEY_KP_Add          = 0xFFAB,
131            KEY_KP_Separator    = 0xFFAC,       /* separator, often comma */
132            KEY_KP_Subtract     = 0xFFAD,
133            KEY_KP_Decimal      = 0xFFAE,
134            KEY_KP_Divide       = 0xFFAF,
135
136            KEY_KP_0            = 0xFFB0,
137            KEY_KP_1            = 0xFFB1,
138            KEY_KP_2            = 0xFFB2,
139            KEY_KP_3            = 0xFFB3,
140            KEY_KP_4            = 0xFFB4,
141            KEY_KP_5            = 0xFFB5,
142            KEY_KP_6            = 0xFFB6,
143            KEY_KP_7            = 0xFFB7,
144            KEY_KP_8            = 0xFFB8,
145            KEY_KP_9            = 0xFFB9,
146           
147            /*
148             * Auxiliary Functions; note the duplicate definitions for left and right
149             * function keys;  Sun keyboards and a few other manufactures have such
150             * function key groups on the left and/or right sides of the keyboard.
151             * We've not found a keyboard with more than 35 function keys total.
152             */
153
154            KEY_F1              = 0xFFBE,
155            KEY_F2              = 0xFFBF,
156            KEY_F3              = 0xFFC0,
157            KEY_F4              = 0xFFC1,
158            KEY_F5              = 0xFFC2,
159            KEY_F6              = 0xFFC3,
160            KEY_F7              = 0xFFC4,
161            KEY_F8              = 0xFFC5,
162            KEY_F9              = 0xFFC6,
163            KEY_F10             = 0xFFC7,
164            KEY_F11             = 0xFFC8,
165            KEY_F12             = 0xFFC9,
166            KEY_F13             = 0xFFCA,
167            KEY_F14             = 0xFFCB,
168            KEY_F15             = 0xFFCC,
169            KEY_F16             = 0xFFCD,
170            KEY_F17             = 0xFFCE,
171            KEY_F18             = 0xFFCF,
172            KEY_F19             = 0xFFD0,
173            KEY_F20             = 0xFFD1,
174            KEY_F21             = 0xFFD2,
175            KEY_F22             = 0xFFD3,
176            KEY_F23             = 0xFFD4,
177            KEY_F24             = 0xFFD5,
178            KEY_F25             = 0xFFD6,
179            KEY_F26             = 0xFFD7,
180            KEY_F27             = 0xFFD8,
181            KEY_F28             = 0xFFD9,
182            KEY_F29             = 0xFFDA,
183            KEY_F30             = 0xFFDB,
184            KEY_F31             = 0xFFDC,
185            KEY_F32             = 0xFFDD,
186            KEY_F33             = 0xFFDE,
187            KEY_F34             = 0xFFDF,
188            KEY_F35             = 0xFFE0,
189
190            /* Modifiers */
191
192            KEY_Shift_L         = 0xFFE1,        /* Left shift */
193            KEY_Shift_R         = 0xFFE2,        /* Right shift */
194            KEY_Control_L       = 0xFFE3,        /* Left control */
195            KEY_Control_R       = 0xFFE4,        /* Right control */
196            KEY_Caps_Lock       = 0xFFE5,        /* Caps lock */
197            KEY_Shift_Lock      = 0xFFE6,        /* Shift lock */
198
199            KEY_Meta_L          = 0xFFE7,        /* Left meta */
200            KEY_Meta_R          = 0xFFE8,        /* Right meta */
201            KEY_Alt_L           = 0xFFE9,        /* Left alt */
202            KEY_Alt_R           = 0xFFEA,        /* Right alt */
203            KEY_Super_L         = 0xFFEB,        /* Left super */
204            KEY_Super_R         = 0xFFEC,        /* Right super */
205            KEY_Hyper_L         = 0xFFED,        /* Left hyper */
206            KEY_Hyper_R         = 0xFFEE         /* Right hyper */
207        };
208
209
210        enum ModKeyMask
211        {
212            MODKEY_LEFT_SHIFT  = 0x0001,
213            MODKEY_RIGHT_SHIFT = 0x0002,
214            MODKEY_LEFT_CTRL   = 0x0004,
215            MODKEY_RIGHT_CTRL  = 0x0008,
216            MODKEY_LEFT_ALT    = 0x0010,
217            MODKEY_RIGHT_ALT   = 0x0020,
218            MODKEY_LEFT_META   = 0x0040,
219            MODKEY_RIGHT_META  = 0x0080,
220            MODKEY_LEFT_SUPER  = 0x0100,
221            MODKEY_RIGHT_SUPER = 0x0200,
222            MODKEY_LEFT_HYPER  = 0x0400,
223            MODKEY_RIGHT_HYPER = 0x0800,
224            MODKEY_NUM_LOCK    = 0x1000,
225            MODKEY_CAPS_LOCK   = 0x2000,
226            MODKEY_CTRL        = (MODKEY_LEFT_CTRL|MODKEY_RIGHT_CTRL),
227            MODKEY_SHIFT       = (MODKEY_LEFT_SHIFT|MODKEY_RIGHT_SHIFT),
228            MODKEY_ALT         = (MODKEY_LEFT_ALT|MODKEY_RIGHT_ALT),
229            MODKEY_META        = (MODKEY_LEFT_META|MODKEY_RIGHT_META),
230            MODKEY_SUPER       = (MODKEY_LEFT_SUPER|MODKEY_RIGHT_SUPER),
231            MODKEY_HYPER       = (MODKEY_LEFT_HYPER|MODKEY_RIGHT_HYPER)
232        };
233
234        enum MouseYOrientation
235        {
236            Y_INCREASING_UPWARDS,
237            Y_INCREASING_DOWNWARDS
238        };
239
240        enum ScrollingMotion
241        {
242            SCROLL_NONE,
243            SCROLL_LEFT,
244            SCROLL_RIGHT,
245            SCROLL_UP,
246            SCROLL_DOWN,
247            SCROLL_2D
248        };
249
250        enum TabletPointerType
251        {
252            UNKNOWN = 0,
253            PEN,
254            PUCK,
255            ERASER
256        };
257       
258        enum TouchPhase
259        {
260            TOUCH_UNKNOWN,
261            TOUCH_BEGAN,
262            TOUCH_MOVED,
263            TOUCH_STATIONERY,
264            TOUCH_ENDED
265        };
266       
267        class TouchData : public osg::Referenced {
268        public:
269            struct TouchPoint {
270                unsigned int id;
271                TouchPhase phase;
272                float x, y;
273               
274                unsigned int tapCount;
275                TouchPoint() : id(0), phase(TOUCH_UNKNOWN), x(0.0f), y(0.0f), tapCount(0) {}
276                TouchPoint(unsigned int in_id, TouchPhase in_phase, float in_x, float in_y, unsigned int in_tap_count)
277                :    id(in_id),
278                    phase(in_phase),
279                    x(in_x),
280                    y(in_y),
281                    tapCount(in_tap_count)
282                {
283                }
284            };
285                       
286            typedef std::vector<TouchPoint> TouchSet;
287           
288            typedef TouchSet::iterator iterator;
289            typedef TouchSet::const_iterator const_iterator;
290           
291            TouchData() : osg::Referenced() {}
292           
293            unsigned int getNumTouchPoints() const { return _touches.size(); }
294                       
295            iterator begin() { return _touches.begin(); }
296            const_iterator begin() const { return _touches.begin(); }
297           
298            iterator end() { return _touches.end(); }
299            const_iterator end() const { return _touches.end(); }
300           
301            const TouchPoint get(unsigned int i) const { return _touches[i]; }
302                   
303        protected:
304           
305            void addTouchPoint(unsigned int id, TouchPhase phase, float x, float y, unsigned int tap_count) {
306                _touches.push_back(TouchPoint(id, phase, x, y, tap_count));
307            }
308           
309            TouchSet _touches;
310           
311        friend class GUIEventAdapter;   
312        };
313       
314    public:
315
316        GUIEventAdapter();
317
318        GUIEventAdapter(const GUIEventAdapter& rhs, const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY);
319
320        META_Object(osgGA, GUIEventAdapter);
321       
322
323        /** Get the accumulated event state singleton.
324          * Typically all EventQueue will share this single GUIEventAdapter object for tracking
325          * the mouse position, keyboard and mouse masks. */
326        static osg::ref_ptr<GUIEventAdapter>& getAccumulatedEventState();
327
328
329        /** Set whether this event has been handled by an event handler or not.*/
330        void setHandled(bool handled) const { _handled = handled; }
331
332        /** Get whether this event has been handled by an event handler or not.*/
333        bool getHandled() const { return _handled; }
334
335        /** set the event type. */
336        void setEventType(EventType Type) { _eventType = Type; }
337
338        /** get the event type. */
339        virtual EventType getEventType() const { return _eventType; }
340
341        /** set time in seconds of event. */
342        void setTime(double time) { _time = time; }
343
344        /** get time in seconds of event. */
345        double getTime() const { return _time; }
346
347        /** deprecated function for getting time of event. */
348        double time() const { return _time; }
349
350
351        void setGraphicsContext(osg::GraphicsContext* context) { _context = context; }
352        const osg::GraphicsContext* getGraphicsContext() const { return _context.get(); }
353       
354
355        /** set window rectangle. */
356        void setWindowRectangle(int x, int y, int width, int height, bool updateMouseRange = true);
357
358        /** get window x origin.*/
359        int getWindowX() const { return _windowX; }
360
361        /** get window y origin.*/
362        int getWindowY() const { return _windowY; }
363
364        /** get window width.*/
365        int getWindowWidth() const { return _windowWidth; }
366
367        /** get window height.*/
368        int getWindowHeight() const { return _windowHeight; }
369
370
371        /** set key pressed. */
372        inline void setKey(int key) { _key = key; }
373
374        /** get key pressed, return -1 if inappropriate for this GUIEventAdapter. */
375        virtual int getKey() const { return _key; }
376
377        /** set button pressed/released.*/
378        void setButton(int button) { _button = button; }
379
380        /** button pressed/released, return -1 if inappropriate for this GUIEventAdapter.*/
381        int getButton() const { return _button; }
382
383
384        /** set mouse input range. */
385        void setInputRange(float Xmin, float Ymin, float Xmax, float Ymax);
386
387        /** get mouse minimum x. */
388        float getXmin() const { return _Xmin; }
389
390        /** get mouse maximum x. */
391        float getXmax() const { return _Xmax; }
392
393        /** get mouse minimum y. */
394        float getYmin() const { return _Ymin; }
395
396        /** get mouse maximum y. */
397        float getYmax() const { return _Ymax; }
398
399        /** set current mouse x position.*/
400        void setX(float x) { _mx = x; }
401
402        /** get current mouse x position.*/
403        float getX() const { return _mx; }
404
405        /** set current mouse y position.*/
406        void setY(float y) { _my = y; }
407
408        /** get current mouse y position.*/
409        float getY() const { return _my; }
410
411        /**
412         * return the current mouse x value normalized to the range of -1 to 1.
413         * -1 would be the left hand side of the window.
414         * 0.0 would be the middle of the window.
415         * +1 would be the right hand side of the window.
416         */
417        inline float getXnormalized() const { return 2.0f*(getX()-getXmin())/(getXmax()-getXmin())-1.0f; }
418
419        /**
420         * return the current mouse y value normalized to the range of -1 to 1.
421         * -1 would be the bottom of the window.
422         * 0.0 would be the middle of the window.
423         * +1 would be the top of the window.
424         */
425        inline float getYnormalized() const
426        {
427            if (_mouseYOrientation==Y_INCREASING_UPWARDS) return 2.0f*(getY()-getYmin())/(getYmax()-getYmin())-1.0f;
428            else return -(2.0f*(getY()-getYmin())/(getYmax()-getYmin())-1.0f);
429        }
430
431        /// set mouse-Y orientation (mouse-Y increases upwards or downwards).
432        void setMouseYOrientation(MouseYOrientation myo) { _mouseYOrientation = myo; }
433
434        /// get mouse-Y orientation (mouse-Y increases upwards or downwards).
435        MouseYOrientation getMouseYOrientation() const { return _mouseYOrientation; }
436
437        /// set current mouse button state.
438        void setButtonMask(int mask) { _buttonMask = mask; }
439
440        /// get current mouse button state.
441        int getButtonMask() const { return _buttonMask; }
442
443        /// set modifier key mask.
444        void setModKeyMask(int mask) { _modKeyMask = mask; }
445
446        /// get modifier key mask.
447        int getModKeyMask() const { return _modKeyMask; }
448
449        /// set scrolling motion (for EventType::SCROLL).
450        void setScrollingMotion(ScrollingMotion motion) { _scrolling.motion = motion; }
451
452        /// get scrolling motion (for EventType::SCROLL).
453        ScrollingMotion getScrollingMotion() const { return _scrolling.motion; }
454
455        /// set the scrolling delta to x,y and the scrolling motion to SCROLL_2D.
456        void setScrollingMotionDelta(float x, float y) {
457            _scrolling.motion = SCROLL_2D;
458            _scrolling.deltaX = x;
459            _scrolling.deltaY = y;
460        }
461
462        /// get the scrolling x-delta.
463        float getScrollingDeltaX() const { return _scrolling.deltaX; }
464
465        /// get the scrolling y-delta.
466        float getScrollingDeltaY() const { return _scrolling.deltaY; }
467
468
469        /// set the tablet pen pressure (range 0..1).
470        void setPenPressure(float pressure) { _tabletPen.pressure = pressure; }
471
472        /// get the tablet pen pressure (range 0..1).
473        float getPenPressure()  const { return _tabletPen.pressure; }
474
475        /// set the tablet pen tiltX in degrees.
476        void setPenTiltX(float tiltX) { _tabletPen.tiltX = tiltX; }
477
478        /// get the tablet pen tiltX in degrees.
479        float getPenTiltX()  const { return _tabletPen.tiltX; }
480
481        /// set the tablet pen tiltY in degrees.
482        void setPenTiltY(float tiltY) { _tabletPen.tiltY = tiltY; }
483
484        /// get the tablet pen tiltY in degrees.
485        float getPenTiltY()  const { return _tabletPen.tiltY; }
486
487        /// set the tablet pen rotation around the Z-axis in degrees.
488        void setPenRotation(float rotation) { _tabletPen.rotation = rotation; }
489
490        /// get the tablet pen rotation around the Z-axis in degrees.
491        float getPenRotation()  const { return _tabletPen.rotation; }
492
493        /// set the tablet pointer type.
494        void setTabletPointerType(TabletPointerType pt) { _tabletPen.tabletPointerType = pt; }
495
496        /// get the tablet pointer type.
497        TabletPointerType getTabletPointerType() const { return _tabletPen.tabletPointerType; }
498
499        /// set the orientation from a tablet input device as a matrix.
500        const osg::Matrix getPenOrientation() const;
501
502        void addTouchPoint(unsigned int id, TouchPhase phase, float x, float y, unsigned int tapCount = 0);
503       
504        TouchData* getTouchData() const { return _touchData.get(); }
505        bool isMultiTouchEvent() const { return (_touchData.valid()); }
506       
507    protected:
508
509        /** Force users to create on heap, so that multiple referencing is safe.*/
510        virtual ~GUIEventAdapter();
511
512        mutable bool _handled;       
513        EventType _eventType;
514        double _time;
515
516        osg::observer_ptr<osg::GraphicsContext> _context;
517        int _windowX;
518        int _windowY;
519        int _windowWidth;
520        int _windowHeight;
521        int _key;
522        int _button;
523        float _Xmin,_Xmax;
524        float _Ymin,_Ymax;
525        float _mx;
526        float _my;
527        int _buttonMask;
528        int _modKeyMask;
529        MouseYOrientation _mouseYOrientation;
530
531        struct Scrolling {
532            ScrollingMotion motion;
533            float deltaX;
534            float deltaY;
535
536            Scrolling() : motion(SCROLL_NONE), deltaX(0), deltaY(0) {}
537            Scrolling(const Scrolling& rhs) : motion(rhs.motion), deltaX(rhs.deltaX), deltaY(rhs.deltaY) {}
538        };
539        Scrolling _scrolling;
540
541        struct TabletPen {
542            float pressure;
543            float tiltX;
544            float tiltY;
545            float rotation;
546            TabletPointerType tabletPointerType;
547
548            TabletPen() : pressure(0), tiltX(0), tiltY(0), rotation(0), tabletPointerType(UNKNOWN) {}
549            TabletPen(const TabletPen& rhs) : pressure(rhs.pressure), tiltX(rhs.tiltX), tiltY(rhs.tiltY), rotation(rhs.rotation), tabletPointerType(rhs.tabletPointerType) {}
550        };
551        TabletPen _tabletPen;
552               
553        osg::ref_ptr<TouchData> _touchData;
554};
555
556}
557
558#endif
Note: See TracBrowser for help on using the browser.