Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/gamestate/src/libraries/core/input/KeyBinder.h @ 6432

Last change on this file since 6432 was 6432, checked in by rgrieder, 14 years ago

Changed the way config values associated with general settings (ConfigFileType::Settings) are handled:

  • ConfigFileManager only handles config files listed in the ConfigFileType enum (normal enum again)
  • ConfigFileManager only takes care of ConfigFiles and returns a pointer to the right one, just two functions left. —> use like: ConfigFileManager::getInstance().getConfigFile(myType)→doSomething();
  • Moved all code (except for the argument completion functions) relating to ConfigFileType::Settings to a new class: SettingsConfigFile, which is a Singleton (it doesn't make sense to have multiple instances unless you start coding a lot more)
  • SettingsConfigFile handles config value containers according to their section and entry in the ini file, not according to class and variables names. (In most cases it will be class and variable names though)
  • SettingsConfigFile supports:
    • clear() (removes any file entries not associated to a config value container)
    • updateConfigValues() (does exactly that through the identifier)
    • config, tconfig and getConfig
    • commands listed above are exported to tolua, and tconfig, config and getConfig were given shortcuts in Lua (e.g. orxonox.config)
  • If you need to organise ConfigFiles yourself, just do it without the ConfigFileManager, like the KeyBinder does.
  • All getValue() functions have been split into getOrCreateValue() and getValue(), which is const
  • Removed obsolete config value management code in the Identifier (it still stores and destroys them and provides access to them)

All of that leads to one HUGE advantage:
"config OutputHandler softDebugLevelInGameConsole"
works now :D (any further implications are up to the reader…)
(it didn't work before because the actual config value container is in the InGameConsole singleton)

  • Property svn:eol-style set to native
File size: 9.3 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();
[1349]76
[1755]77    protected: // functions
[5929]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
[3327]85        void allDevicesUpdated(float dt);
86        void mouseUpdated(float dt);
87        void joyStickUpdated(unsigned int joyStick, float dt);
[1887]88        // internal
[2087]89        void tickHalfAxis(HalfAxis& halfAxis);
[1413]90
[3327]91        void buttonPressed (const KeyEvent& evt);
92        void buttonReleased(const KeyEvent& evt);
93        void buttonHeld    (const KeyEvent& evt);
[1022]94
[3327]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);
[1022]100
[3327]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);
[1349]105
[1755]106    protected: // variables
[1887]107        //! Currently active joy sticks
[3327]108        std::vector<JoyStick*>  joySticks_;
[1022]109
[1887]110        //! Actual key bindings for keys on the keyboard
111        Button keys_            [KeyCode::numberOfKeys];
112        //! Number of mouse buttons in KeyBinder (+4)
[1888]113        static const unsigned int numberOfMouseButtons_ = MouseButtonCode::numberOfButtons + 4;
[1887]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];
[1219]118
[1887]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
[5695]126        std::vector<shared_ptr<JoyStickButtonVector> > joyStickButtons_;
[1887]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)
[5695]134        std::vector<shared_ptr<JoyStickAxisVector> > joyStickAxes_;
[1219]135
[1887]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_;
[6417]140        //! Maps input commands to all Button names, including half axes
141        std::map< std::string, std::vector<std::string> > allCommands_;
[1349]142
[1755]143        /**
144        @brief
145            Commands that have additional parameters (axes) are executed at the end of
[2896]146            update() so that all values can be buffered for single execution.
[1755]147        */
148        std::vector<BufferedParamCommand*> paramCommandBuffer_;
[1349]149
[6417]150        //! Keeps track of the absolute mouse value
151        float mousePosition_[2];
[1755]152        //! Used to derive mouse input if requested
153        int mouseRelative_[2];
154        float deriveTime_;
[1349]155
[5929]156        //! Name of the file used in this KeyBinder (constant!)
157        const std::string filename_;
[6432]158        //! Config file used. NULL in case of KeyDetector. Also indicates whether we've already loaded.
159        ConfigFile* configFile_;
[1755]160
[1887]161    private:
[6417]162        void addButtonToCommand(const std::string& command, Button* button);
163
[1755]164        //##### ConfigValues #####
[2087]165        //! Whether to filter small value analog input
166        bool bFilterAnalogNoise_;
[1755]167        //! Threshold for analog triggers until which the state is 0.
168        float analogThreshold_;
169        //! Threshold for analog triggers until which the button is not pressed.
170        float buttonThreshold_;
171        //! Derive mouse input for absolute values?
172        bool bDeriveMouseInput_;
173        //! Accuracy of the mouse input deriver. The higher the more precise, but laggier.
174        float derivePeriod_;
175        //! mouse sensitivity
176        float mouseSensitivity_;
177        //! mouse sensitivity if mouse input is derived
178        float mouseSensitivityDerived_;
[6417]179        //! Equals one step of the mouse wheel
[2087]180        int mouseWheelStepSize_;
[1887]181
[6417]182        //! Multiplication of mouse sensitivity and clipping size
183        float totalMouseSensitivity_;
184
[1887]185        //##### Constant config variables #####
186        // Use some value at about 1000. This can be configured with mouseSensitivity_ anyway.
187        static const int mouseClippingSize_ = 1024;
[6417]188    };// tolua_export
[1887]189
[5929]190
[3327]191    inline void KeyBinder::buttonPressed (const KeyEvent& evt)
192    { assert(!keys_[evt.getKeyCode()].name_.empty()); keys_[evt.getKeyCode()].execute(KeybindMode::OnPress); }
[1887]193
[3327]194    inline void KeyBinder::buttonReleased(const KeyEvent& evt)
195    { assert(!keys_[evt.getKeyCode()].name_.empty()); keys_[evt.getKeyCode()].execute(KeybindMode::OnRelease); }
[1887]196
[3327]197    inline void KeyBinder::buttonHeld    (const KeyEvent& evt)
198    { assert(!keys_[evt.getKeyCode()].name_.empty()); keys_[evt.getKeyCode()].execute(KeybindMode::OnHold); }
[1887]199
200
[3327]201    inline void KeyBinder::buttonPressed (MouseButtonCode::ByEnum button)
202    { mouseButtons_[button].execute(KeybindMode::OnPress); }
[1887]203
[3327]204    inline void KeyBinder::buttonReleased(MouseButtonCode::ByEnum button)
205    { mouseButtons_[button].execute(KeybindMode::OnRelease); }
[1887]206
[3327]207    inline void KeyBinder::buttonHeld    (MouseButtonCode::ByEnum button)
208    { mouseButtons_[button].execute(KeybindMode::OnHold); }
[1887]209
210
[3327]211    inline void KeyBinder::buttonPressed (unsigned int device, JoyStickButtonCode::ByEnum button)
[5695]212    { (*joyStickButtons_[device])[button].execute(KeybindMode::OnPress); }
[1887]213
[3327]214    inline void KeyBinder::buttonReleased(unsigned int device, JoyStickButtonCode::ByEnum button)
[5695]215    { (*joyStickButtons_[device])[button].execute(KeybindMode::OnRelease); }
[1887]216
[3327]217    inline void KeyBinder::buttonHeld    (unsigned int device, JoyStickButtonCode::ByEnum button)
[5695]218    { (*joyStickButtons_[device])[button].execute(KeybindMode::OnHold); }
[1887]219
[3327]220    inline void KeyBinder::allDevicesUpdated(float dt)
[1887]221    {
222        // execute all buffered bindings (additional parameter)
223        for (unsigned int i = 0; i < paramCommandBuffer_.size(); i++)
[2087]224        {
225            paramCommandBuffer_[i]->rel_ *= dt;
[1887]226            paramCommandBuffer_[i]->execute();
[2087]227        }
[1887]228
229        // always reset the relative movement of the mouse
230        for (unsigned int i = 0; i < MouseAxisCode::numberOfAxes * 2; i++)
231            mouseAxes_[i].relVal_ = 0.0f;
232    }
[6417]233}// tolua_export
[973]234
[1413]235#endif /* _KeyBinder_H__ */
Note: See TracBrowser for help on using the repository browser.