Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/libraries/core/input/KeyBinder.h @ 6579

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

Merged revisions 6430-6440 from the gamestate branch to the trunk.
This adds keybindings merging functionality.

(from log of r6437)
When running development builds, the keybinder will merge the local file and the one from the data folder.
Catch: if you want to remove a binding, you'll have to write "NoBinding" (not case sensitive) to override the default command

The keybind command already does that for you though.

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