Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

Renaming "tick" to "update" for all those classes not inheriting from Tickable to avoid confusions.
GameState::ticked still exists, but that's going to change anyway.

  • Property svn:eol-style set to native
File size: 9.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    {
[2662]73        int middleValue[24];
[1755]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>;
[1066]88
[1755]89    public:
90        enum InputManagerState
91        {
92            Uninitialised    = 0x00,
93            OISReady         = 0x01,
94            InternalsReady   = 0x02,
95            Ticking          = 0x04,
96            Calibrating      = 0x08,
97            ReloadRequest    = 0x10,
98            JoyStickSupport  = 0x20 // used with ReloadRequest to store a bool
99        };
[1219]100
[1755]101        InputManager ();
102        ~InputManager();
[1293]103
[1755]104        void initialise(size_t windowHnd, int windowWidth, int windowHeight, bool joyStickSupport = true);
[1219]105
[1755]106        void reloadInputSystem(bool joyStickSupport = true);
[1219]107
[1878]108        void clearBuffers();
109
[1887]110        unsigned int  numberOfKeyboards() { return keyboard_ ? 1 : 0; }
111        unsigned int  numberOfMice()      { return mouse_    ? 1 : 0; }
112        unsigned int  numberOfJoySticks() { return joySticksSize_; }
[1502]113
[1755]114        void setWindowExtents(const int width, const int height);
[1887]115        void setKeyDetectorCallback(const std::string& command);
[1502]116
[1755]117        template <class T>
[1878]118        T* createInputState(const std::string& name, int priority);
[1524]119
[1755]120        InputState* getState       (const std::string& name);
121        InputState* getCurrentState();
[1788]122        ExtendedInputState* getMasterInputState() { return this->stateMaster_; }
[1755]123        bool requestDestroyState   (const std::string& name);
124        bool requestEnterState     (const std::string& name);
125        bool requestLeaveState     (const std::string& name);
[1219]126
[2800]127        void update(const Clock& time);
[1219]128
[1755]129        static InputManager& getInstance()    { assert(singletonRef_s); return *singletonRef_s; }
130        static InputManager* getInstancePtr() { return singletonRef_s; }
[1219]131
[1878]132        // console commands
[1755]133        static void calibrate();
134        static void reload(bool joyStickSupport = true);
[973]135
[1878]136    public: // variables
137        static EmptyHandler                 EMPTY_HANDLER;
[2662]138        static const unsigned int           sliderAxes = 8;
[1878]139
[1755]140    private: // functions
141        // don't mess with a Singleton
142        InputManager (const InputManager&);
[973]143
[1755]144        // Intenal methods
145        void _initialiseKeyboard();
146        void _initialiseMouse();
147        void _initialiseJoySticks();
[2662]148        void _configureJoySticks();
[973]149
[2662]150        void _loadCalibration();
151        void _startCalibration();
152        void _completeCalibration();
153        void _evaluateCalibration();
154
[1755]155        void _destroyKeyboard();
156        void _destroyMouse();
157        void _destroyJoySticks();
158        void _destroyState(InputState* state);
159        void _clearBuffers();
[1349]160
[1755]161        void _reload(bool joyStickSupport);
[1502]162
[1755]163        void _fireAxis(unsigned int iJoyStick, int axis, int value);
164        unsigned int _getJoystick(const OIS::JoyStickEvent& arg);
[1502]165
[1755]166        void _updateActiveStates();
167        bool _configureInputState(InputState* state, const std::string& name, int priority);
[1219]168
[1755]169        // input events
170        bool mousePressed  (const OIS::MouseEvent    &arg, OIS::MouseButtonID id);
171        bool mouseReleased (const OIS::MouseEvent    &arg, OIS::MouseButtonID id);
172        bool mouseMoved    (const OIS::MouseEvent    &arg);
173        bool keyPressed    (const OIS::KeyEvent      &arg);
174        bool keyReleased   (const OIS::KeyEvent      &arg);
175        bool buttonPressed (const OIS::JoyStickEvent &arg, int button);
176        bool buttonReleased(const OIS::JoyStickEvent &arg, int button);
177        bool axisMoved     (const OIS::JoyStickEvent &arg, int axis);
178        bool sliderMoved   (const OIS::JoyStickEvent &arg, int id);
179        bool povMoved      (const OIS::JoyStickEvent &arg, int id);
180        // don't remove that! Or else add OIS as dependency library to orxonox.
181        bool vector3Moved  (const OIS::JoyStickEvent &arg, int id) { return true; }
[1219]182
[1755]183        void setConfigValues();
[2662]184        void _calibrationFileCallback();
[1219]185
[1755]186    private: // variables
187        OIS::InputManager*                  inputSystem_;          //!< OIS input manager
188        OIS::Keyboard*                      keyboard_;             //!< OIS mouse
189        OIS::Mouse*                         mouse_;                //!< OIS keyboard
190        std::vector<OIS::JoyStick*>         joySticks_;            //!< OIS joy sticks
191        unsigned int                        joySticksSize_;
[2662]192        std::vector<std::string>            joyStickIDs_;          //!< Execution unique identification strings for the joy sticks
[1755]193        unsigned int                        devicesNum_;
194        size_t                              windowHnd_;            //!< Render window handle
195        InputManagerState                   internalState_;        //!< Current internal state
[1219]196
[1878]197        // some internally handled states and handlers
[1755]198        SimpleInputState*                   stateEmpty_;
[1788]199        ExtendedInputState*                 stateMaster_;          //!< Always active master input state
[2662]200        KeyDetector*                        keyDetector_;          //!< KeyDetector instance
[1881]201        InputBuffer*                        calibratorCallbackBuffer_;
[1502]202
[1755]203        std::map<std::string, InputState*>  inputStatesByName_;
204        std::map<int, InputState*>          inputStatesByPriority_;
[1219]205
[1755]206        std::set<InputState*>               stateEnterRequests_;   //!< Request to enter a new state
207        std::set<InputState*>               stateLeaveRequests_;   //!< Request to leave a running state
208        std::set<InputState*>               stateDestroyRequests_; //!< Request to destroy a state
[1502]209
[1755]210        std::map<int, InputState*>          activeStates_;
211        std::vector<InputState*>            activeStatesTop_;      //!< Current input states for joy stick events.
212        std::vector<InputState*>            activeStatesTicked_;   //!< Current input states for joy stick events.
[1349]213
[1755]214        // joystick calibration
[2662]215        std::vector<std::vector<int> >      joyStickMinValues_;
216        std::vector<std::vector<int> >      joyStickMaxValues_;
217        std::vector<std::vector<int> >      joyStickMiddleValues_;
218        std::vector<ConfigValueContainer*>  calibrationConfigValueContainers_;
219        std::vector<JoyStickCalibration>    joyStickCalibrations_; 
[1219]220
[1755]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.
[1219]224
[1755]225        std::vector<Key>                    keysDown_;
[1887]226        std::vector<MouseButtonCode::ByEnum>      mouseButtonsDown_;
227        std::vector<std::vector<JoyStickButtonCode::ByEnum> >  joyStickButtonsDown_;
[1219]228
[2662]229        // ConfigValues
230        std::string                         calibrationFilename_;  //!< Joy stick calibration ini filename
231
[1755]232        static InputManager*                singletonRef_s;
233    };
[1878]234
235    /**
236    @brief
237        Creates a new InputState by type, name and priority.
238       
239        You will have to use this method because the
240        c'tors and d'tors are private.
241    @remarks
242        The InputManager will take care of the state completely. That also
243        means it gets deleted when the InputManager is destroyed!
244    @param name
245        Name of the InputState when referenced as string
246    @param priority
247        Priority matters when multiple states are active. You can specify any
248        number, but 1 - 99 is preferred (99 means high).
249    */
250    template <class T>
251    T* InputManager::createInputState(const std::string& name, int priority)
252    {
253        T* state = new T;
254        if (_configureInputState(state, name, priority))
255            return state;
256        else
257        {
258            delete state;
259            return 0;
260        }
261    }
[973]262}
263
264#endif /* _InputManager_H__ */
Note: See TracBrowser for help on using the repository browser.