Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 9819 was 7861, checked in by landauf, 13 years ago

added function to KeyBinder which allows to change the keybind mode (OnPress, OnRelease, OnHold) of a command which is bound to a key.
enhanced ConsoleCommand (+Manipulator) to use this feature.

input system experts, please review :D

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