From 80543e3f82679eb5313d5c47d7be4e93f277bb3f Mon Sep 17 00:00:00 2001 From: Lendemor Date: Fri, 5 Jan 2018 19:42:10 +0100 Subject: [PATCH 1/4] started to add a gui window for key mapping --- src/engine.cpp | 4 +++ src/engine.h | 3 +++ src/keymapper.cpp | 46 +++++++++++++++++++++++++++++++++ src/keymapper.h | 20 ++++++++++++++ src/sparrowshell/scriptnode.cpp | 6 +++++ src/sparrowshell/scriptnode.h | 1 + 6 files changed, 80 insertions(+) create mode 100644 src/keymapper.cpp create mode 100644 src/keymapper.h diff --git a/src/engine.cpp b/src/engine.cpp index 87120fd..aa765b4 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -14,6 +14,7 @@ #include "imgui/imgui.h" #include "tools/loader.h" #include "editor.h" +#include "keymapper.h" #include "tools/loadingthread.h" Engine::Engine() : @@ -67,6 +68,7 @@ void Engine::createWindow(std::string title, m_renderer->initGL(w, h); m_sparrowshell = new SparrowShell(m_window); m_editor = new Editor(); + m_keymapper = new KeyMapper(); m_loadingThread = LoadingThread::init(); } @@ -180,12 +182,14 @@ void Engine::setScene(std::string scene) previous_scene->getRootObject()->removeChild(m_sparrowshell); previous_scene->getRootObject()->removeChild(m_editor); + previous_scene->getRootObject()->removeChild(m_keymapper); m_renderer->setScene(new_scene); m_renderer->resizeGL(m_window->getSize().x, m_window->getSize().y); new_scene->getRootObject()->addChild(m_sparrowshell); new_scene->getRootObject()->addChild(m_editor); + new_scene->getRootObject()->addChild(m_keymapper); } void Engine::enablePhysicsDebug() diff --git a/src/engine.h b/src/engine.h index 586dc33..9dbee66 100644 --- a/src/engine.h +++ b/src/engine.h @@ -9,6 +9,7 @@ class SceneTree; class SparrowShell; class PhysicsDebugNode; class Editor; +class KeyMapper; class LoadingThread; namespace sf @@ -54,6 +55,7 @@ public: SparrowShell* getShell() const {return m_sparrowshell;} PhysicsDebugNode* getPhysicsDebug() const {return m_physicsDebugNode;} Editor* getEditor() const {return m_editor;} + KeyMapper* getKeyMapper() const{return m_keymapper;} LoadingThread* getLoadingThread() const {return m_loadingThread;} SceneTree* getScene() const; @@ -81,6 +83,7 @@ private: PhysicsDebugNode *m_physicsDebugNode; SparrowRenderer* m_renderer; Editor* m_editor; + KeyMapper* m_keymapper; LoadingThread* m_loadingThread; void update(); diff --git a/src/keymapper.cpp b/src/keymapper.cpp new file mode 100644 index 0000000..67c2086 --- /dev/null +++ b/src/keymapper.cpp @@ -0,0 +1,46 @@ +#include "keymapper.h" + +#include +#include "engine.h" +#include "SparrowInput/input.h" +#include + +KeyMapper::KeyMapper() : + m_enabled(false) +{ +} + +void KeyMapper::update() +{ + if(m_enabled) + gui(); +} + +void KeyMapper::gui() +{ + std::vector contexts = getEngine().getInput()->getContextsList(); + std::vector types_binding = {"pressed","released","hold"}; + + ImGui::Begin("KeyMapper"); + ImGui::Combo("Context",&m_selected_context,contexts); + for (Binding b : m_keysmap.data()){ + ImGui::Text("%d",b.action); + ImGui::SameLine(50); + ImGui::Text("%d",b.key); + ImGui::SameLine(100); + ImGui::PushItemWidth(100); + ImGui::Combo("",&(b.type),types_binding); + ImGui::PopItemWidth(); + } + ImGui::End(); +} + + + +void KeyMapper::toggle() +{ + m_enabled = !m_enabled; + if(m_enabled){ + m_keysmap = getEngine().getInput()->getKeysMap(); + } +} diff --git a/src/keymapper.h b/src/keymapper.h new file mode 100644 index 0000000..541e014 --- /dev/null +++ b/src/keymapper.h @@ -0,0 +1,20 @@ +#ifndef KEYMAPPER_H +#define KEYMAPPER_H + +#include "scene/containernode.h" +#include "SparrowInput/keybindings.h" + +class KeyMapper : public ContainerNode +{ + bool m_enabled; + int m_selected_context; + IKeysMap m_keysmap; + + void gui(); +public: + KeyMapper(); + void update(); + void toggle(); +}; + +#endif // KEYMAPPER_H diff --git a/src/sparrowshell/scriptnode.cpp b/src/sparrowshell/scriptnode.cpp index 5703425..2a53c42 100644 --- a/src/sparrowshell/scriptnode.cpp +++ b/src/sparrowshell/scriptnode.cpp @@ -10,6 +10,7 @@ #include "SparrowSerializer/Version.h" #include "tools/utils.h" #include "editor.h" +#include "keymapper.h" #define LUA_DEFINE(var) S[#var]=var #define LUA_SET_FUN(var) m_script.set_function(#var,&ScriptNode::var,this);this->functions_name.push_back(#var); @@ -29,6 +30,7 @@ ScriptNode::ScriptNode() LUA_SET_FUN(rendering); LUA_SET_FUN(resourcePackEditor); LUA_SET_FUN(editor); + LUA_SET_FUN(keymapper); m_script.new_usertype("Engine", "time",&Engine::getTime @@ -118,3 +120,7 @@ void ScriptNode::resourcePackEditor(){ void ScriptNode::editor(){ this->getEngine().getEditor()->toggleEditor(); } + +void ScriptNode::keymapper(){ + this->getEngine().getKeyMapper()->toggle(); +} diff --git a/src/sparrowshell/scriptnode.h b/src/sparrowshell/scriptnode.h index 8cbe80d..726daab 100644 --- a/src/sparrowshell/scriptnode.h +++ b/src/sparrowshell/scriptnode.h @@ -28,6 +28,7 @@ public: void rendering(); void resourcePackEditor(); void editor(); + void keymapper(); }; #endif // SCRIPTNODE_H From 40e21b291ebc61ba6699a0c650a2c6c898d5d590 Mon Sep 17 00:00:00 2001 From: Lendemor Date: Sat, 6 Jan 2018 01:48:38 +0100 Subject: [PATCH 2/4] added mapping between numerical value and text value for keymapping --- src/keymapper.cpp | 114 +++++++++++++++++++++++++++++++++++++++++++--- src/keymapper.h | 5 ++ 2 files changed, 113 insertions(+), 6 deletions(-) diff --git a/src/keymapper.cpp b/src/keymapper.cpp index 67c2086..d556b4e 100644 --- a/src/keymapper.cpp +++ b/src/keymapper.cpp @@ -3,11 +3,97 @@ #include #include "engine.h" #include "SparrowInput/input.h" +#include "defaultkeysmap.h" #include KeyMapper::KeyMapper() : m_enabled(false) { + // mapping between action numerical value and text value + m_actions_list[DefaultKeysMap::MAIN_ACTION] = "Main Action"; + m_actions_list[DefaultKeysMap::SECONDARY_ACTION] = "Secondary Action"; + m_actions_list[DefaultKeysMap::TERTIARY_ACTION] = "Tertiary Action"; + m_actions_list[DefaultKeysMap::MOVE_FORWARD] = "Move Forward"; + m_actions_list[DefaultKeysMap::MOVE_BACKWARD] = "Move Backward"; + m_actions_list[DefaultKeysMap::STRAFE_LEFT] = "Strafe Left"; + m_actions_list[DefaultKeysMap::STRAFE_RIGHT] = "Strafe Right"; + m_actions_list[DefaultKeysMap::RUN] = "Run"; + m_actions_list[DefaultKeysMap::MAIN_ACTION_HOLD] = "Main Action Hold"; + m_actions_list[DefaultKeysMap::SECONDARY_ACTION_HOLD] = "Secondary Action Hold"; + m_actions_list[DefaultKeysMap::JUMP] = "Jump"; + m_actions_list[DefaultKeysMap::TOGGLE_NOCLIP] = "Toggle NoClip"; + m_actions_list[DefaultKeysMap::TOGGLE_PHYSICS_DEBUG] = "Toggle Physics Debug"; + m_actions_list[DefaultKeysMap::TOGGLE_CONSOLE] = "Toggle Console"; + m_actions_list[DefaultKeysMap::MOVE_CURSOR_LEFT] = "Move Cursor Left"; + m_actions_list[DefaultKeysMap::MOVE_CURSOR_RIGHT] = "Move Cursor Right"; + m_actions_list[DefaultKeysMap::HISTORY_UP] = "History Up"; + m_actions_list[DefaultKeysMap::HISTORY_DOWN] = "History Down"; + m_actions_list[DefaultKeysMap::TOGGLE_MOUSE_CURSOR] = "Toggle Mouse Cursor"; + m_actions_list[DefaultKeysMap::EXIT_GAME] = "Exit Game"; + m_actions_list[DefaultKeysMap::LEFT_CLICK] = "Left Click"; + + + // mapping between mouse numerical value and text value + m_mouse_buttons[sf::Mouse::Left] = "Mouse Left"; + m_mouse_buttons[sf::Mouse::Middle] = "Mouse Middle"; + m_mouse_buttons[sf::Mouse::Right] = "Mouse Left"; + m_mouse_buttons[sf::Mouse::XButton1] = "Mouse Extra 1"; + m_mouse_buttons[sf::Mouse::XButton2] = "Mouse Extra 2"; + + // mapping between keyboard numerical value and text value + m_keyboard_keys[sf::Keyboard::A] = "A"; + m_keyboard_keys[sf::Keyboard::Z] = "Z"; + m_keyboard_keys[sf::Keyboard::E] = "E"; + m_keyboard_keys[sf::Keyboard::R] = "R"; + m_keyboard_keys[sf::Keyboard::T] = "T"; + m_keyboard_keys[sf::Keyboard::Y] = "Y"; + m_keyboard_keys[sf::Keyboard::U] = "U"; + m_keyboard_keys[sf::Keyboard::I] = "I"; + m_keyboard_keys[sf::Keyboard::O] = "O"; + m_keyboard_keys[sf::Keyboard::P] = "P"; + + m_keyboard_keys[sf::Keyboard::Q] = "Q"; + m_keyboard_keys[sf::Keyboard::S] = "S"; + m_keyboard_keys[sf::Keyboard::D] = "D"; + m_keyboard_keys[sf::Keyboard::F] = "F"; + m_keyboard_keys[sf::Keyboard::G] = "G"; + m_keyboard_keys[sf::Keyboard::H] = "H"; + m_keyboard_keys[sf::Keyboard::J] = "J"; + m_keyboard_keys[sf::Keyboard::K] = "K"; + m_keyboard_keys[sf::Keyboard::L] = "L"; + m_keyboard_keys[sf::Keyboard::M] = "M"; + + m_keyboard_keys[sf::Keyboard::W] = "W"; + m_keyboard_keys[sf::Keyboard::X] = "X"; + m_keyboard_keys[sf::Keyboard::C] = "C"; + m_keyboard_keys[sf::Keyboard::V] = "V"; + m_keyboard_keys[sf::Keyboard::B] = "B"; + m_keyboard_keys[sf::Keyboard::N] = "N"; + + m_keyboard_keys[sf::Keyboard::F1] = "F1"; + m_keyboard_keys[sf::Keyboard::F2] = "F2"; + m_keyboard_keys[sf::Keyboard::F3] = "F3"; + m_keyboard_keys[sf::Keyboard::F4] = "F4"; + m_keyboard_keys[sf::Keyboard::F5] = "F5"; + m_keyboard_keys[sf::Keyboard::F6] = "F6"; + m_keyboard_keys[sf::Keyboard::F7] = "F7"; + m_keyboard_keys[sf::Keyboard::F8] = "F8"; + m_keyboard_keys[sf::Keyboard::F9] = "F9"; + m_keyboard_keys[sf::Keyboard::F10] = "F10"; + m_keyboard_keys[sf::Keyboard::F11] = "F11"; + m_keyboard_keys[sf::Keyboard::F12] = "F12"; + + m_keyboard_keys[sf::Keyboard::Left] = "Arrow Left"; + m_keyboard_keys[sf::Keyboard::Right] = "Arrow Right"; + m_keyboard_keys[sf::Keyboard::Up] = "Arrow Up"; + m_keyboard_keys[sf::Keyboard::Down] = "Arrow Down"; + + + m_keyboard_keys[sf::Keyboard::Escape]= "Escape"; + m_keyboard_keys[sf::Keyboard::Space] = "Space"; + m_keyboard_keys[sf::Keyboard::LShift]= "Left Shift"; + m_keyboard_keys[sf::Keyboard::LControl] = "Left Control"; + } void KeyMapper::update() @@ -23,13 +109,29 @@ void KeyMapper::gui() ImGui::Begin("KeyMapper"); ImGui::Combo("Context",&m_selected_context,contexts); - for (Binding b : m_keysmap.data()){ - ImGui::Text("%d",b.action); - ImGui::SameLine(50); - ImGui::Text("%d",b.key); - ImGui::SameLine(100); + for(unsigned int i = 0;i class KeyMapper : public ContainerNode { @@ -10,6 +11,10 @@ class KeyMapper : public ContainerNode int m_selected_context; IKeysMap m_keysmap; + std::map m_mouse_buttons; + std::map m_keyboard_keys; + std::map m_actions_list; + void gui(); public: KeyMapper(); From d7cd7f09ba64cd10a9f5c361801b244113650417 Mon Sep 17 00:00:00 2001 From: Lendemor Date: Mon, 8 Jan 2018 13:08:52 +0100 Subject: [PATCH 3/4] change keybindings with keymapper : DONE --- src/keymapper.cpp | 70 ++++++++++++++++++++++++++++++++++++++++++----- src/keymapper.h | 2 ++ 2 files changed, 65 insertions(+), 7 deletions(-) diff --git a/src/keymapper.cpp b/src/keymapper.cpp index d556b4e..da2c4b9 100644 --- a/src/keymapper.cpp +++ b/src/keymapper.cpp @@ -7,7 +7,8 @@ #include KeyMapper::KeyMapper() : - m_enabled(false) + m_enabled(false), + m_waiting_for_input(-1) { // mapping between action numerical value and text value m_actions_list[DefaultKeysMap::MAIN_ACTION] = "Main Action"; @@ -36,7 +37,7 @@ KeyMapper::KeyMapper() : // mapping between mouse numerical value and text value m_mouse_buttons[sf::Mouse::Left] = "Mouse Left"; m_mouse_buttons[sf::Mouse::Middle] = "Mouse Middle"; - m_mouse_buttons[sf::Mouse::Right] = "Mouse Left"; + m_mouse_buttons[sf::Mouse::Right] = "Mouse Right"; m_mouse_buttons[sf::Mouse::XButton1] = "Mouse Extra 1"; m_mouse_buttons[sf::Mouse::XButton2] = "Mouse Extra 2"; @@ -108,10 +109,10 @@ void KeyMapper::gui() std::vector types_binding = {"pressed","released","hold"}; ImGui::Begin("KeyMapper"); - ImGui::Combo("Context",&m_selected_context,contexts); + std::vector& keys = m_keysmap.data(); for(unsigned int i = 0;isetKeysMap(m_keysmap); + //save + + //load ImGui::End(); } diff --git a/src/keymapper.h b/src/keymapper.h index 35c2428..f57daeb 100644 --- a/src/keymapper.h +++ b/src/keymapper.h @@ -4,6 +4,7 @@ #include "scene/containernode.h" #include "SparrowInput/keybindings.h" #include +#include class KeyMapper : public ContainerNode { @@ -14,6 +15,7 @@ class KeyMapper : public ContainerNode std::map m_mouse_buttons; std::map m_keyboard_keys; std::map m_actions_list; + int m_waiting_for_input; void gui(); public: From 5350efab8d8b8bfaba5e8871e282a4026f0b0bb4 Mon Sep 17 00:00:00 2001 From: Lendemor Date: Mon, 8 Jan 2018 13:50:42 +0100 Subject: [PATCH 4/4] small fix, update keybindings after changing keysmap --- src/keymapper.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/keymapper.cpp b/src/keymapper.cpp index da2c4b9..8eb1488 100644 --- a/src/keymapper.cpp +++ b/src/keymapper.cpp @@ -185,8 +185,10 @@ void KeyMapper::gui() } } //apply - if(ImGui::Button("Apply changes")) + if(ImGui::Button("Apply changes")){ getEngine().getInput()->setKeysMap(m_keysmap); + getEngine().getInput()->updateKeyBindings(); + } //save //load