Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core4/src/core/input/KeyBinder.h @ 4967

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

Keybindings should now map to the correct joy stick by device name (like "WingMan Action Pad" or so).

  • Property svn:eol-style set to native
File size: 8.2 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    Different definitions of input processing.
33*/
34
35#ifndef _KeyBinder_H__
36#define _KeyBinder_H__
37
38#include "InputPrereqs.h"
39
40#include <cassert>
41#include <string>
42#include <vector>
43
44#include "InputHandler.h"
45#include "Button.h"
46#include "HalfAxis.h"
47#include "InputCommands.h"
48#include "JoyStickQuantityListener.h"
49
50namespace orxonox
51{
52    /**
53    @brief
54        Handles mouse, keyboard and joy stick input while in the actual game mode.
55        Manages the key bindings.
56    */
57    class _CoreExport KeyBinder : public InputHandler, public JoyStickQuantityListener
58    {
59    public:
60        KeyBinder ();
61        virtual ~KeyBinder();
62
63        void loadBindings(const std::string& filename);
64        void clearBindings();
65        bool setBinding(const std::string& binding, const std::string& name, bool bTemporary = false);
66        void setConfigValues();
67        void resetJoyStickAxes();
68
69    protected: // functions
70        void allDevicesUpdated(float dt);
71        void mouseUpdated(float dt);
72        void joyStickUpdated(unsigned int joyStick, float dt);
73        // internal
74        void tickHalfAxis(HalfAxis& halfAxis);
75
76        void buttonThresholdChanged();
77        // from JoyStickQuantityListener interface
78        virtual void JoyStickQuantityChanged(const std::vector<JoyStick*>& joyStickList);
79        void initialiseJoyStickBindings();
80        void compilePointerLists();
81
82        void buttonPressed (const KeyEvent& evt);
83        void buttonReleased(const KeyEvent& evt);
84        void buttonHeld    (const KeyEvent& evt);
85
86        void buttonPressed (MouseButtonCode::ByEnum button);
87        void buttonReleased(MouseButtonCode::ByEnum button);
88        void buttonHeld    (MouseButtonCode::ByEnum button);
89        void mouseMoved    (IntVector2 abs, IntVector2 rel, IntVector2 clippingSize);
90        void mouseScrolled (int abs, int rel);
91
92        void buttonPressed (unsigned int device, JoyStickButtonCode::ByEnum button);
93        void buttonReleased(unsigned int device, JoyStickButtonCode::ByEnum button);
94        void buttonHeld    (unsigned int device, JoyStickButtonCode::ByEnum button);
95        void axisMoved     (unsigned int device, unsigned int axis, float value);
96
97    protected: // variables
98        //! Currently active joy sticks
99        std::vector<JoyStick*>  joySticks_;
100
101        //! Actual key bindings for keys on the keyboard
102        Button keys_            [KeyCode::numberOfKeys];
103        //! Number of mouse buttons in KeyBinder (+4)
104        static const unsigned int numberOfMouseButtons_ = MouseButtonCode::numberOfButtons + 4;
105        //! Actual key bindings for mouse buttons including the wheel(s)
106        Button mouseButtons_    [numberOfMouseButtons_];
107        //! Actual key bindings for mouse axes
108        HalfAxis mouseAxes_     [MouseAxisCode::numberOfAxes * 2];
109
110        //! Helper class to use something like std:vector<Button[64]>
111        struct JoyStickButtonVector
112        {
113            Button& operator[](unsigned int index) { return buttons[index]; }
114            Button buttons[JoyStickButtonCode::numberOfButtons];
115        };
116        //! Actual key bindings for joy stick buttons
117        std::vector<JoyStickButtonVector> joyStickButtons_;
118        //! Helper class to use something like std:vector<HalfAxis[48]>
119        struct JoyStickAxisVector
120        {
121            HalfAxis& operator[](unsigned int index) { return halfAxes[index]; }
122            HalfAxis halfAxes[JoyStickAxisCode::numberOfAxes * 2];
123        };
124        //! Actual key bindings for joy stick axes (and sliders)
125        std::vector<JoyStickAxisVector> joyStickAxes_;
126
127        //! Pointer map with all Buttons, including half axes
128        std::map<std::string, Button*> allButtons_;
129        //! Pointer list with all half axes
130        std::vector<HalfAxis*> allHalfAxes_;
131
132        /**
133        @brief
134            Commands that have additional parameters (axes) are executed at the end of
135            update() so that all values can be buffered for single execution.
136        */
137        std::vector<BufferedParamCommand*> paramCommandBuffer_;
138
139        //! Keeps track of the absolute mouse value (incl. scroll wheel)
140        int mousePosition_[2];
141        //! Used to derive mouse input if requested
142        int mouseRelative_[2];
143        float deriveTime_;
144
145        //! Config file used. ConfigFileType::NoType in case of KeyDetector. Also indicates whether we've already loaded.
146        ConfigFileType configFile_;
147
148    private:
149        //##### ConfigValues #####
150        //! Whether to filter small value analog input
151        bool bFilterAnalogNoise_;
152        //! Threshold for analog triggers until which the state is 0.
153        float analogThreshold_;
154        //! Threshold for analog triggers until which the button is not pressed.
155        float buttonThreshold_;
156        //! Derive mouse input for absolute values?
157        bool bDeriveMouseInput_;
158        //! Accuracy of the mouse input deriver. The higher the more precise, but laggier.
159        float derivePeriod_;
160        //! mouse sensitivity
161        float mouseSensitivity_;
162        //! mouse sensitivity if mouse input is derived
163        float mouseSensitivityDerived_;
164        //! Equals one step of the mousewheel
165        int mouseWheelStepSize_;
166
167        //##### Constant config variables #####
168        // Use some value at about 1000. This can be configured with mouseSensitivity_ anyway.
169        static const int mouseClippingSize_ = 1024;
170    };
171
172    inline void KeyBinder::buttonPressed (const KeyEvent& evt)
173    { assert(!keys_[evt.getKeyCode()].name_.empty()); keys_[evt.getKeyCode()].execute(KeybindMode::OnPress); }
174
175    inline void KeyBinder::buttonReleased(const KeyEvent& evt)
176    { assert(!keys_[evt.getKeyCode()].name_.empty()); keys_[evt.getKeyCode()].execute(KeybindMode::OnRelease); }
177
178    inline void KeyBinder::buttonHeld    (const KeyEvent& evt)
179    { assert(!keys_[evt.getKeyCode()].name_.empty()); keys_[evt.getKeyCode()].execute(KeybindMode::OnHold); }
180
181
182    inline void KeyBinder::buttonPressed (MouseButtonCode::ByEnum button)
183    { mouseButtons_[button].execute(KeybindMode::OnPress); }
184
185    inline void KeyBinder::buttonReleased(MouseButtonCode::ByEnum button)
186    { mouseButtons_[button].execute(KeybindMode::OnRelease); }
187
188    inline void KeyBinder::buttonHeld    (MouseButtonCode::ByEnum button)
189    { mouseButtons_[button].execute(KeybindMode::OnHold); }
190
191
192    inline void KeyBinder::buttonPressed (unsigned int device, JoyStickButtonCode::ByEnum button)
193    { joyStickButtons_[device][button].execute(KeybindMode::OnPress); }
194
195    inline void KeyBinder::buttonReleased(unsigned int device, JoyStickButtonCode::ByEnum button)
196    { joyStickButtons_[device][button].execute(KeybindMode::OnRelease); }
197
198    inline void KeyBinder::buttonHeld    (unsigned int device, JoyStickButtonCode::ByEnum button)
199    { joyStickButtons_[device][button].execute(KeybindMode::OnHold); }
200
201    inline void KeyBinder::allDevicesUpdated(float dt)
202    {
203        // execute all buffered bindings (additional parameter)
204        for (unsigned int i = 0; i < paramCommandBuffer_.size(); i++)
205        {
206            paramCommandBuffer_[i]->rel_ *= dt;
207            paramCommandBuffer_[i]->execute();
208        }
209
210        // always reset the relative movement of the mouse
211        for (unsigned int i = 0; i < MouseAxisCode::numberOfAxes * 2; i++)
212            mouseAxes_[i].relVal_ = 0.0f;
213    }
214}
215
216#endif /* _KeyBinder_H__ */
Note: See TracBrowser for help on using the repository browser.