Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

reload feature tested and works under windows, but only with one joy stick. Will have to test it with multiple ones when that is properly supported.

  • Property svn:eol-style set to native
File size: 8.4 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        bool destroyState          (const std::string& name);
130        InputState* getState       (const std::string& name);
131        InputState* getCurrentState();
132        bool requestEnterState     (const std::string& name);
133        bool requestLeaveState     (const std::string& name);
134
135        static InputManager& getInstance()    { assert(singletonRef_s); return *singletonRef_s; }
136        static InputManager* getInstancePtr() { return singletonRef_s; }
137
138    public: // console commands
139        static void storeKeyStroke(const std::string& name);
140        static void keyBind(const std::string& command);
141        static void calibrate();
142        static void reload(bool joyStickSupport = true);
143
144    private: // functions
145        // don't mess with a Singleton
146        InputManager (const InputManager&);
147
148        // Intenal methods
149        void _initialiseKeyboard();
150        void _initialiseMouse();
151        void _initialiseJoySticks();
152        void _redimensionLists();
153
154        void _destroyKeyboard();
155        void _destroyMouse();
156        void _destroyJoySticks();
157        void _destroyState(InputState* state);
158        void _clearBuffers();
159
160        void _reload(bool joyStickSupport);
161
162        void _completeCalibration();
163
164        void _fireAxis(unsigned int iJoyStick, int axis, int value);
165        unsigned int _getJoystick(const OIS::JoyStickEvent& arg);
166
167        void _updateActiveStates();
168        bool _configureInputState(InputState* state, const std::string& name, int priority);
169
170        void tick(float dt);
171
172        // input events
173        bool mousePressed  (const OIS::MouseEvent    &arg, OIS::MouseButtonID id);
174        bool mouseReleased (const OIS::MouseEvent    &arg, OIS::MouseButtonID id);
175        bool mouseMoved    (const OIS::MouseEvent    &arg);
176        bool keyPressed    (const OIS::KeyEvent      &arg);
177        bool keyReleased   (const OIS::KeyEvent      &arg);
178        bool buttonPressed (const OIS::JoyStickEvent &arg, int button);
179        bool buttonReleased(const OIS::JoyStickEvent &arg, int button);
180        bool axisMoved     (const OIS::JoyStickEvent &arg, int axis);
181        bool sliderMoved   (const OIS::JoyStickEvent &arg, int id);
182        bool povMoved      (const OIS::JoyStickEvent &arg, int id);
183        // don't remove that! Or else add OIS as dependency library to orxonox.
184        bool vector3Moved  (const OIS::JoyStickEvent &arg, int id) { return true; }
185
186        void setConfigValues();
187
188    private: // variables
189        OIS::InputManager*                  inputSystem_;          //!< OIS input manager
190        OIS::Keyboard*                      keyboard_;             //!< OIS mouse
191        OIS::Mouse*                         mouse_;                //!< OIS keyboard
192        std::vector<OIS::JoyStick*>         joySticks_;            //!< OIS joy sticks
193        unsigned int                        joySticksSize_;
194        unsigned int                        devicesNum_;
195        size_t                              windowHnd_;            //!< Render window handle
196        InputManagerState                   internalState_;        //!< Current internal state
197
198        // some internally handled states
199        SimpleInputState*                   stateDetector_;        //!< KeyDetector instance
200        SimpleInputState*                   stateCalibrator_;
201        SimpleInputState*                   stateEmpty_;
202
203        std::map<std::string, InputState*>  inputStatesByName_;
204        std::map<int, InputState*>          inputStatesByPriority_;
205
206        std::vector<InputState*>            stateEnterRequests_;   //!< Request to enter a new state
207        std::vector<InputState*>            stateLeaveRequests_;   //!< Request to leave the current state
208
209        std::map<int, InputState*>          activeStates_;
210        std::vector<InputState*>            activeStatesTop_;      //!< Current input states for joy stick events.
211        std::vector<InputState*>            activeStatesTicked_;   //!< Current input states for joy stick events.
212
213        // joystick calibration
214        //std::vector<int> marginalsMaxConfig_;
215        //std::vector<int> marginalsMinConfig_;
216        int                                 marginalsMax_[24];
217        int                                 marginalsMin_[24];
218        bool                                bCalibrated_;
219        bool                                bCalibrating_;
220
221        unsigned int                        keyboardModifiers_;    //!< Bit mask representing keyboard modifiers.
222        std::vector<POVStates>              povStates_;            //!< Keeps track of the joy stick POV states.
223        std::vector<SliderStates>           sliderStates_;         //!< Keeps track of the possibly two slider axes.
224        std::vector<JoyStickCalibration>    joySticksCalibration_; 
225
226        std::vector<Key>                    keysDown_;
227        std::vector<MouseButton::Enum>      mouseButtonsDown_;
228        std::vector<std::vector<JoyStickButton::Enum> >  joyStickButtonsDown_;
229
230        static std::string                  bindingCommmandString_s;
231        static InputManager*                singletonRef_s;
232    };
233}
234
235#endif /* _InputManager_H__ */
Note: See TracBrowser for help on using the repository browser.