Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/input/src/core/input/InputManager.h @ 1637

Last change on this file since 1637 was 1637, checked in by rgrieder, 16 years ago

Finally! The InputManager is now working like I imagined it to. And it's even easier to use it as well.
A little explanation: Every time you change something about the input distribution, it is a change of 'state' represented by the class 'InputState'.
That can be for instance: "console", "game", "gui", etc. Every state has a name and a priority which describes who comes first. Now if one state doesn't handle mouse input or instance, then the one with the next lower priority gets it. To prevent that, you can add the 'EmptyHandler' to the state with setMouseHandler.
InputState is just an abstract base class. There are two classes implementing it: SimpleInputState and ExtendedInputState. The latter allows for multiple input handlers for one single device.

Basically, what you need to know is what you see in Orxonox.cc, InGameConsole.cc and Shell.cc.

  • Property svn:eol-style set to native
File size: 7.8 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/**
30@file
31@brief
32    Implementation of a little Input handler that distributes everything
33    coming from OIS.
34*/
35
36#ifndef _InputManager_H__
37#define _InputManager_H__
38
39#include "core/CorePrereqs.h"
40
41#include <map>
42#include <vector>
43#include <stack>
44#include "util/Math.h"
45#include "core/OrxonoxClass.h"
46#include "InputInterfaces.h"
47
48namespace orxonox
49{
50    /**
51    @brief
52        Helper class to realise a vector<int[4]>
53    */
54    class POVStates
55    {
56    public:
57        int operator[](unsigned int index) { return povStates[index]; }
58        int povStates[4];
59    };
60
61    /**
62    @brief
63        Helper class to realise a vector< {int[4], int[4]} >
64    */
65    class SliderStates
66    {
67    public:
68        IntVector2 sliderStates[4];
69    };
70
71    struct JoyStickCalibration
72    {
73        int zeroStates[24];
74        float positiveCoeff[24];
75        float negativeCoeff[24];
76    };
77
78    /**
79    @brief
80        Captures and distributes mouse and keyboard input.
81    */
82    class _CoreExport InputManager
83        : public OrxonoxClass,
84        public OIS::KeyListener, public OIS::MouseListener, public OIS::JoyStickListener
85    {
86        // --> setConfigValues is private
87        friend ClassIdentifier<InputManager>;
88
89    public: // static functions
90        static bool initialise(const size_t windowHnd, int windowWidth, int windowHeight,
91                               bool createKeyboard = true, bool createMouse = true, bool createJoySticks = false);
92        static bool initialiseKeyboard();
93        static bool initialiseMouse();
94        static bool initialiseJoySticks();
95        static int  numberOfKeyboards();
96        static int  numberOfMice();
97        static int  numberOfJoySticks();
98
99        static void destroy();
100        static void destroyKeyboard();
101        static void destroyMouse();
102        static void destroyJoySticks();
103
104        //static bool isModifierDown(KeyboardModifier::Enum modifier);
105        //static bool isKeyDown(KeyCode::Enum key);
106        //static const MouseState getMouseState();
107        //static const JoyStickState getJoyStickState(unsigned int ID);
108
109        static void setWindowExtents(const int width, const int height);
110
111        static void storeKeyStroke(const std::string& name);
112        static void keyBind(const std::string& command);
113
114        static void calibrate();
115
116        static void tick(float dt);
117
118        static SimpleInputState*   createSimpleInputState  (const std::string& name, int priority);
119        static ExtendedInputState* createExtendedInputState(const std::string& name, int priority);
120        static bool destroyState (const std::string& name);
121        //static bool removeState (const std::string& name);
122        static InputState* getState       (const std::string& name);
123        static InputState* getCurrentState();
124        static bool requestEnterState     (const std::string& name);
125        static bool requestLeaveState     (const std::string& name);
126
127    private: // functions
128        // don't mess with a Singleton
129        InputManager ();
130        InputManager (const InputManager&);
131        ~InputManager();
132
133        // Intenal methods
134        bool _initialise(const size_t, int, int, bool, bool, bool);
135        bool _initialiseKeyboard();
136        bool _initialiseMouse();
137        bool _initialiseJoySticks();
138        void _redimensionLists();
139
140        void _destroy();
141        void _destroyKeyboard();
142        void _destroyMouse();
143        void _destroyJoySticks();
144        void _destroyState(InputState* state);
145
146        void _completeCalibration();
147
148        void _fireAxis(unsigned int iJoyStick, int axis, int value);
149        unsigned int _getJoystick(const OIS::JoyStickEvent& arg);
150
151        void _tick(float dt);
152
153        void _updateActiveStates();
154        bool _configureInputState(InputState* state, const std::string& name, int priority);
155
156        // input events
157        bool mousePressed  (const OIS::MouseEvent    &arg, OIS::MouseButtonID id);
158        bool mouseReleased (const OIS::MouseEvent    &arg, OIS::MouseButtonID id);
159        bool mouseMoved    (const OIS::MouseEvent    &arg);
160        bool keyPressed    (const OIS::KeyEvent      &arg);
161        bool keyReleased   (const OIS::KeyEvent      &arg);
162        bool buttonPressed (const OIS::JoyStickEvent &arg, int button);
163        bool buttonReleased(const OIS::JoyStickEvent &arg, int button);
164        bool axisMoved     (const OIS::JoyStickEvent &arg, int axis);
165        bool sliderMoved   (const OIS::JoyStickEvent &arg, int id);
166        bool povMoved      (const OIS::JoyStickEvent &arg, int id);
167
168        void setConfigValues();
169
170        static InputManager& _getInstance();
171
172    private: // variables
173        OIS::InputManager*                          inputSystem_;     //!< OIS input manager
174        OIS::Keyboard*                              keyboard_;        //!< OIS mouse
175        OIS::Mouse*                                 mouse_;           //!< OIS keyboard
176        std::vector<OIS::JoyStick*>                 joySticks_;       //!< OIS joy sticks
177        unsigned int                                joySticksSize_;
178        unsigned int                                devicesNum_;
179
180        // some internally handled states
181        SimpleInputState*                                 stateDetector_;   //!< KeyDetector instance
182        SimpleInputState*                                 stateCalibrator_;
183        SimpleInputState*                                 stateEmpty_;
184
185        std::map<std::string, InputState*>          inputStatesByName_;
186        std::map<int, InputState*>                  inputStatesByPriority_;
187
188        std::vector<InputState*> stateEnterRequests_;                  //!< Request to enter a new state
189        std::vector<InputState*> stateLeaveRequests_;                    //!< Request to leave the current state
190
191        std::map<int, InputState*> activeStates_;
192        std::vector<InputState*>   activeStatesTop_;    //!< Current input states for joy stick events.
193        std::vector<InputState*>   activeStatesTicked_;    //!< Current input states for joy stick events.
194
195        // joystick calibration
196        //std::vector<int> marginalsMaxConfig_;
197        //std::vector<int> marginalsMinConfig_;
198        int marginalsMax_[24];
199        int marginalsMin_[24];
200        bool bCalibrated_;
201        bool bCalibrating_;
202
203        unsigned int keyboardModifiers_;           //!< Bit mask representing keyboard modifiers
204        //! Keeps track of the joy stick POV states
205        std::vector<POVStates>                      povStates_;
206        //! Keeps track of the possibly two slider axes
207        std::vector<SliderStates>                   sliderStates_;
208        std::vector<JoyStickCalibration>            joySticksCalibration_;
209
210        std::vector<Key>                            keysDown_;
211        std::vector<MouseButton::Enum>              mouseButtonsDown_;
212        std::vector<std::vector<int> >              joyStickButtonsDown_;
213
214        static std::string                          bindingCommmandString_s;
215    };
216
217}
218
219#endif /* _InputManager_H__ */
Note: See TracBrowser for help on using the repository browser.