Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 6535 was 6105, checked in by rgrieder, 15 years ago

Merged console branch back to trunk.

  • Property svn:eol-style set to native
File size: 5.6 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, const T& button, ButtonEvent::TPress)
115            { this->buttonPressed(button); }
116        template<class T> void buttonEvent(unsigned int device, const T& button, ButtonEvent::TRelease)
117            { this->buttonReleased(button); }
118        template<class T> void buttonEvent(unsigned int device, const T& button, ButtonEvent::THold)
119            { this->buttonHeld(button); }
120        void buttonEvent(unsigned int device, JoyStickButtonCode::ByEnum button, ButtonEvent::TPress)
121            { this->buttonPressed(device - InputDeviceEnumerator::FirstJoyStick, button); }
122        void buttonEvent(unsigned int device, JoyStickButtonCode::ByEnum button, ButtonEvent::TRelease)
123            { this->buttonReleased(device - InputDeviceEnumerator::FirstJoyStick, button); }
124        void buttonEvent(unsigned int device, JoyStickButtonCode::ByEnum button, ButtonEvent::THold)
125            { this->buttonHeld(device - InputDeviceEnumerator::FirstJoyStick, button); }
126
127        virtual void buttonPressed (const KeyEvent& evt) { }
128        virtual void buttonReleased(const KeyEvent& evt) { }
129        virtual void buttonHeld    (const KeyEvent& evt) { }
130
131        virtual void buttonPressed (MouseButtonCode::ByEnum button) { }
132        virtual void buttonReleased(MouseButtonCode::ByEnum button) { }
133        virtual void buttonHeld    (MouseButtonCode::ByEnum button) { }
134        virtual void mouseMoved    (IntVector2 abs, IntVector2 rel, IntVector2 clippingSize) { }
135        virtual void mouseScrolled (int abs, int rel) { }
136
137        virtual void buttonPressed (unsigned int joyStick, JoyStickButtonCode::ByEnum button) { }
138        virtual void buttonReleased(unsigned int joyStick, JoyStickButtonCode::ByEnum button) { }
139        virtual void buttonHeld    (unsigned int joyStick, JoyStickButtonCode::ByEnum button) { }
140        virtual void axisMoved     (unsigned int joyStick, unsigned int axis, float value){ }
141
142        virtual void keyboardUpdated(float dt) { }
143        virtual void mouseUpdated   (float dt) { }
144        virtual void joyStickUpdated(unsigned int joyStick, float dt) { }
145
146        virtual void allDevicesUpdated(float dt) { }
147
148        //! Use this input handler if you want to occupy a device in an input state.
149        static InputHandler EMPTY;
150    };
151}
152
153#endif /* _InputHandler_H__ */
Note: See TracBrowser for help on using the repository browser.