Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/libraries/core/input/InputHandler.h @ 8549

Last change on this file since 8549 was 6746, checked in by rgrieder, 15 years ago

Merged gamestates2 branch back to trunk.
This brings in some heavy changes in the GUI framework.
It should also fix problems with triggered asserts in the InputManager.

Note: PickupInventory does not seem to work —> Segfault when showing because before, the owner in GUIOverlay::setGUIName is already NULL.
I haven't tested it before, so I can't tell whether it's my changes.

  • Property svn:eol-style set to native
File size: 5.7 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Reto Grieder
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#ifndef _InputHandler_H__
30#define _InputHandler_H__
31
32#include "InputPrereqs.h"
33#include "util/Math.h"
34
35namespace orxonox
36{
37    namespace ButtonEvent
38    {
39        //! Helper enum to deploy events with the help of templates
40        enum Value
41        {
42            Press,
43            Release,
44            Hold
45        };
46
47        //! Enables function overloading with integer values
48        template <ButtonEvent::Value Event>
49        struct EnumToType { };
50        typedef EnumToType<Press>   TPress;
51        typedef EnumToType<Release> TRelease;
52        typedef EnumToType<Hold>    THold;
53    }
54
55    namespace KeyboardModifier
56    {
57        //! Keyboard modifiers (shift, ctrl and alt)
58        enum Enum
59        {
60            Shift = 0x0000001,
61            Ctrl  = 0x0000010,
62            Alt   = 0x0000100
63        };
64    }
65
66    //! Event argument for key events
67    class _CoreExport KeyEvent
68    {
69    public:
70        KeyEvent(const OIS::KeyEvent& evt)
71            : key_(static_cast<KeyCode::ByEnum>(evt.key))
72            , text_(evt.text)
73            , modifiers_(0)
74        { }
75        KeyEvent(KeyCode::ByEnum key, unsigned int text, int modifiers)
76            : key_(key)
77            , text_(text)
78            , modifiers_(modifiers)
79        { }
80        bool operator==(const KeyEvent& rhs) const
81            { return rhs.key_ == key_; }
82        bool operator!=(const KeyEvent& rhs) const
83            { return rhs.key_ != key_; }
84        void setModifiers(int modifiers)
85            { modifiers_ = modifiers; }
86
87        bool isModifierDown(KeyboardModifier::Enum modifier) const
88            { return static_cast<KeyboardModifier::Enum>(modifier & modifiers_); }
89        KeyCode::ByEnum getKeyCode() const
90            { return key_; }
91        unsigned int getText() const { return text_; }
92
93    private:
94        KeyCode::ByEnum key_;
95        unsigned int text_;
96        int modifiers_;
97    };
98
99    /**
100    @brief
101        Base class for all input handlers like KeyBinder, InputBuffer, etc.
102
103        Derive from this class if you wish to receive input events.
104        But keep in mind that this is pointless without first having an InputState.
105    @note
106        The definitions for the button events with the weird arguments are simply
107        to avoid redundant code in the input devices.
108    */
109    class _CoreExport InputHandler
110    {
111    public:
112        virtual ~InputHandler() { }
113
114        template<class T> void buttonEvent(unsigned int device, T button, ButtonEvent::TPress)
115            { this->buttonPressed(button); }
116        template<class T> void buttonEvent(unsigned int device, T button, ButtonEvent::TRelease)
117            { this->buttonReleased(button); }
118        template<class T> void buttonEvent(unsigned int device, T button, ButtonEvent::THold)
119            { this->buttonHeld(button); }
120
121        virtual void buttonPressed (const KeyEvent& evt) { }
122        virtual void buttonReleased(const KeyEvent& evt) { }
123        virtual void buttonHeld    (const KeyEvent& evt) { }
124
125        virtual void buttonPressed (MouseButtonCode::ByEnum button) { }
126        virtual void buttonReleased(MouseButtonCode::ByEnum button) { }
127        virtual void buttonHeld    (MouseButtonCode::ByEnum button) { }
128        virtual void mouseMoved    (IntVector2 abs, IntVector2 rel, IntVector2 clippingSize) { }
129        virtual void mouseScrolled (int abs, int rel) { }
130
131        virtual void buttonPressed (unsigned int joyStick, JoyStickButtonCode::ByEnum button) { }
132        virtual void buttonReleased(unsigned int joyStick, JoyStickButtonCode::ByEnum button) { }
133        virtual void buttonHeld    (unsigned int joyStick, JoyStickButtonCode::ByEnum button) { }
134        virtual void axisMoved     (unsigned int joyStick, unsigned int axis, float value){ }
135
136        virtual void keyboardUpdated(float dt) { }
137        virtual void mouseUpdated   (float dt) { }
138        virtual void joyStickUpdated(unsigned int joyStick, float dt) { }
139
140        virtual void allDevicesUpdated(float dt) { }
141
142        //! Use this input handler if you want to occupy a device in an input state.
143        static InputHandler EMPTY;
144    };
145
146    template<> inline void InputHandler::buttonEvent<JoyStickButtonCode::ByEnum>(unsigned int device, JoyStickButtonCode::ByEnum button, ButtonEvent::TPress)
147        { this->buttonPressed(device - InputDeviceEnumerator::FirstJoyStick, button); }
148    template<> inline void InputHandler::buttonEvent<JoyStickButtonCode::ByEnum>(unsigned int device, JoyStickButtonCode::ByEnum button, ButtonEvent::TRelease)
149        { this->buttonReleased(device - InputDeviceEnumerator::FirstJoyStick, button); }
150    template<> inline void InputHandler::buttonEvent<JoyStickButtonCode::ByEnum>(unsigned int device, JoyStickButtonCode::ByEnum button, ButtonEvent::THold)
151        { this->buttonHeld(device - InputDeviceEnumerator::FirstJoyStick, button); }
152}
153
154#endif /* _InputHandler_H__ */
Note: See TracBrowser for help on using the repository browser.