Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 1801 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
RevLine 
[918]1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
[1502]3 *                    > www.orxonox.net <
[918]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 */
[973]28
[918]29/**
[1755]30@file
31@brief
32    Implementation of a little Input handler that distributes everything
33    coming from OIS.
34*/
[973]35
36#ifndef _InputManager_H__
37#define _InputManager_H__
38
[1519]39#include "core/CorePrereqs.h"
[1062]40
[1219]41#include <map>
[1293]42#include <vector>
[1755]43#include <stack>
[1349]44#include "util/Math.h"
[1524]45#include "core/OrxonoxClass.h"
[1293]46#include "InputInterfaces.h"
[973]47
48namespace orxonox
49{
[1755]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    };
[1349]60
[1219]61    /**
[1755]62    @brief
63        Helper class to realise a vector< {int[4], int[4]} >
[1219]64    */
[1755]65    class SliderStates
[1219]66    {
[1755]67    public:
68        IntVector2 sliderStates[4];
[1219]69    };
[973]70
[1755]71    struct JoyStickCalibration
72    {
73        int zeroStates[24];
74        float positiveCoeff[24];
75        float negativeCoeff[24];
76    };
[1502]77
[1755]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;
[1066]90
[1755]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        };
[1219]102
[1755]103        InputManager ();
104        ~InputManager();
[1293]105
[1755]106        void initialise(size_t windowHnd, int windowWidth, int windowHeight, bool joyStickSupport = true);
[1219]107
[1755]108        void reloadInputSystem(bool joyStickSupport = true);
[1219]109
[1755]110        int  numberOfKeyboards() { return keyboard_ ? 1 : 0; }
111        int  numberOfMice()      { return mouse_    ? 1 : 0; }
112        int  numberOfJoySticks() { return joySticksSize_; }
[1502]113
[1755]114        void setWindowExtents(const int width, const int height);
[1502]115
[1755]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        }
[1524]128
[1755]129        InputState* getState       (const std::string& name);
130        InputState* getCurrentState();
[1788]131        ExtendedInputState* getMasterInputState() { return this->stateMaster_; }
[1755]132        bool requestDestroyState   (const std::string& name);
133        bool requestEnterState     (const std::string& name);
134        bool requestLeaveState     (const std::string& name);
[1219]135
[1755]136        void tick(float dt);
[1219]137
[1755]138        static InputManager& getInstance()    { assert(singletonRef_s); return *singletonRef_s; }
139        static InputManager* getInstancePtr() { return singletonRef_s; }
[1219]140
[1755]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);
[973]146
[1755]147    private: // functions
148        // don't mess with a Singleton
149        InputManager (const InputManager&);
[973]150
[1755]151        // Intenal methods
152        void _initialiseKeyboard();
153        void _initialiseMouse();
154        void _initialiseJoySticks();
155        void _redimensionLists();
[973]156
[1755]157        void _destroyKeyboard();
158        void _destroyMouse();
159        void _destroyJoySticks();
160        void _destroyState(InputState* state);
161        void _clearBuffers();
[1349]162
[1755]163        void _reload(bool joyStickSupport);
[1502]164
[1755]165        void _completeCalibration();
[1502]166
[1755]167        void _fireAxis(unsigned int iJoyStick, int axis, int value);
168        unsigned int _getJoystick(const OIS::JoyStickEvent& arg);
[1502]169
[1755]170        void _updateActiveStates();
171        bool _configureInputState(InputState* state, const std::string& name, int priority);
[1219]172
[1755]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; }
[1219]186
[1755]187        void setConfigValues();
[1219]188
[1755]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
[1219]198
[1755]199        // some internally handled states
200        SimpleInputState*                   stateDetector_;        //!< KeyDetector instance
201        SimpleInputState*                   stateCalibrator_;
202        SimpleInputState*                   stateEmpty_;
[1788]203        ExtendedInputState*                 stateMaster_;          //!< Always active master input state
[1502]204
[1755]205        std::map<std::string, InputState*>  inputStatesByName_;
206        std::map<int, InputState*>          inputStatesByPriority_;
[1219]207
[1755]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
[1502]211
[1755]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.
[1349]215
[1755]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_;
[1219]223
[1755]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_; 
[1219]228
[1755]229        std::vector<Key>                    keysDown_;
230        std::vector<MouseButton::Enum>      mouseButtonsDown_;
231        std::vector<std::vector<JoyStickButton::Enum> >  joyStickButtonsDown_;
[1219]232
[1755]233        static std::string                  bindingCommmandString_s;
234        static InputManager*                singletonRef_s;
235    };
[973]236}
237
238#endif /* _InputManager_H__ */
Note: See TracBrowser for help on using the repository browser.