Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/core/input/InputManager.h @ 1788

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

Added a master InputState that is always active (except of course in game state 'ioConsole' when there is no InputManager in the first place)
This is necessary to call the console whenever you like. The state is of 'extended' nature, so it can hold an arbitrary number of Handlers.
The KeyBinder however is not yet configured to manage multiple keybindings.ini —> next job ;)

  • Property svn:eol-style set to native
File size: 8.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/**
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 class ClassIdentifier<InputManager>;
88        // let Core class use tick(.)
89        friend class Core;
90
91    public:
92        enum InputManagerState
93        {
94            Uninitialised    = 0x00,
95            OISReady         = 0x01,
96            InternalsReady   = 0x02,
97            Ticking          = 0x04,
98            Calibrating      = 0x08,
99            ReloadRequest    = 0x10,
100            JoyStickSupport  = 0x20 // used with ReloadRequest to store a bool
101        };
102
103        InputManager ();
104        ~InputManager();
105
106        void initialise(size_t windowHnd, int windowWidth, int windowHeight, bool joyStickSupport = true);
107
108        void reloadInputSystem(bool joyStickSupport = true);
109
110        int  numberOfKeyboards() { return keyboard_ ? 1 : 0; }
111        int  numberOfMice()      { return mouse_    ? 1 : 0; }
112        int  numberOfJoySticks() { return joySticksSize_; }
113
114        void setWindowExtents(const int width, const int height);
115
116        template <class T>
117        T* createInputState(const std::string& name, int priority)
118        {
119            T* state = new T;
120            if (_configureInputState(state, name, priority))
121                return state;
122            else
123            {
124                delete state;
125                return 0;
126            }
127        }
128
129        InputState* getState       (const std::string& name);
130        InputState* getCurrentState();
131        ExtendedInputState* getMasterInputState() { return this->stateMaster_; }
132        bool requestDestroyState   (const std::string& name);
133        bool requestEnterState     (const std::string& name);
134        bool requestLeaveState     (const std::string& name);
135
136        void tick(float dt);
137
138        static InputManager& getInstance()    { assert(singletonRef_s); return *singletonRef_s; }
139        static InputManager* getInstancePtr() { return singletonRef_s; }
140
141    public: // console commands
142        static void storeKeyStroke(const std::string& name);
143        static void keyBind(const std::string& command);
144        static void calibrate();
145        static void reload(bool joyStickSupport = true);
146
147    private: // functions
148        // don't mess with a Singleton
149        InputManager (const InputManager&);
150
151        // Intenal methods
152        void _initialiseKeyboard();
153        void _initialiseMouse();
154        void _initialiseJoySticks();
155        void _redimensionLists();
156
157        void _destroyKeyboard();
158        void _destroyMouse();
159        void _destroyJoySticks();
160        void _destroyState(InputState* state);
161        void _clearBuffers();
162
163        void _reload(bool joyStickSupport);
164
165        void _completeCalibration();
166
167        void _fireAxis(unsigned int iJoyStick, int axis, int value);
168        unsigned int _getJoystick(const OIS::JoyStickEvent& arg);
169
170        void _updateActiveStates();
171        bool _configureInputState(InputState* state, const std::string& name, int priority);
172
173        // input events
174        bool mousePressed  (const OIS::MouseEvent    &arg, OIS::MouseButtonID id);
175        bool mouseReleased (const OIS::MouseEvent    &arg, OIS::MouseButtonID id);
176        bool mouseMoved    (const OIS::MouseEvent    &arg);
177        bool keyPressed    (const OIS::KeyEvent      &arg);
178        bool keyReleased   (const OIS::KeyEvent      &arg);
179        bool buttonPressed (const OIS::JoyStickEvent &arg, int button);
180        bool buttonReleased(const OIS::JoyStickEvent &arg, int button);
181        bool axisMoved     (const OIS::JoyStickEvent &arg, int axis);
182        bool sliderMoved   (const OIS::JoyStickEvent &arg, int id);
183        bool povMoved      (const OIS::JoyStickEvent &arg, int id);
184        // don't remove that! Or else add OIS as dependency library to orxonox.
185        bool vector3Moved  (const OIS::JoyStickEvent &arg, int id) { return true; }
186
187        void setConfigValues();
188
189    private: // variables
190        OIS::InputManager*                  inputSystem_;          //!< OIS input manager
191        OIS::Keyboard*                      keyboard_;             //!< OIS mouse
192        OIS::Mouse*                         mouse_;                //!< OIS keyboard
193        std::vector<OIS::JoyStick*>         joySticks_;            //!< OIS joy sticks
194        unsigned int                        joySticksSize_;
195        unsigned int                        devicesNum_;
196        size_t                              windowHnd_;            //!< Render window handle
197        InputManagerState                   internalState_;        //!< Current internal state
198
199        // some internally handled states
200        SimpleInputState*                   stateDetector_;        //!< KeyDetector instance
201        SimpleInputState*                   stateCalibrator_;
202        SimpleInputState*                   stateEmpty_;
203        ExtendedInputState*                 stateMaster_;          //!< Always active master input state
204
205        std::map<std::string, InputState*>  inputStatesByName_;
206        std::map<int, InputState*>          inputStatesByPriority_;
207
208        std::set<InputState*>               stateEnterRequests_;   //!< Request to enter a new state
209        std::set<InputState*>               stateLeaveRequests_;   //!< Request to leave a running state
210        std::set<InputState*>               stateDestroyRequests_; //!< Request to destroy a state
211
212        std::map<int, InputState*>          activeStates_;
213        std::vector<InputState*>            activeStatesTop_;      //!< Current input states for joy stick events.
214        std::vector<InputState*>            activeStatesTicked_;   //!< Current input states for joy stick events.
215
216        // joystick calibration
217        //std::vector<int> marginalsMaxConfig_;
218        //std::vector<int> marginalsMinConfig_;
219        int                                 marginalsMax_[24];
220        int                                 marginalsMin_[24];
221        bool                                bCalibrated_;
222        bool                                bCalibrating_;
223
224        unsigned int                        keyboardModifiers_;    //!< Bit mask representing keyboard modifiers.
225        std::vector<POVStates>              povStates_;            //!< Keeps track of the joy stick POV states.
226        std::vector<SliderStates>           sliderStates_;         //!< Keeps track of the possibly two slider axes.
227        std::vector<JoyStickCalibration>    joySticksCalibration_; 
228
229        std::vector<Key>                    keysDown_;
230        std::vector<MouseButton::Enum>      mouseButtonsDown_;
231        std::vector<std::vector<JoyStickButton::Enum> >  joyStickButtonsDown_;
232
233        static std::string                  bindingCommmandString_s;
234        static InputManager*                singletonRef_s;
235    };
236}
237
238#endif /* _InputManager_H__ */
Note: See TracBrowser for help on using the repository browser.