diff --git a/examples/common/entry/input.cpp b/examples/common/entry/input.cpp index 2ee3b516..2f6933fd 100644 --- a/examples/common/entry/input.cpp +++ b/examples/common/entry/input.cpp @@ -89,10 +89,10 @@ struct Keyboard return state; } - static void decodeKeyState(uint32_t _state, uint8_t& _modifiers, bool& _down) + static bool decodeKeyState(uint32_t _state, uint8_t& _modifiers) { _modifiers = (_state>>16)&0xff; - _down = 0 != ( (_state>>8)&0xff); + return 0 != ( (_state>> 8)&0xff); } void setKeyState(entry::Key::Enum _key, uint8_t _modifiers, bool _down) @@ -101,6 +101,14 @@ struct Keyboard m_once[_key] = false; } + bool getKeyState(entry::Key::Enum _key, uint8_t* _modifiers) + { + uint8_t modifiers; + _modifiers = NULL == _modifiers ? &modifiers : _modifiers; + + return decodeKeyState(m_key[_key], *_modifiers); + } + void pushChar(uint8_t _len, const uint8_t _char[4]) { for (uint32_t len = m_ring.reserve(4) @@ -196,8 +204,7 @@ struct Input for (const InputBinding* binding = _bindings; binding->m_key != entry::Key::None; ++binding) { uint8_t modifiers; - bool down; - Keyboard::decodeKeyState(m_keyboard.m_key[binding->m_key], modifiers, down); + bool down = Keyboard::decodeKeyState(m_keyboard.m_key[binding->m_key], modifiers); if (binding->m_flags == 1) { @@ -302,6 +309,11 @@ void inputSetKeyState(entry::Key::Enum _key, uint8_t _modifiers, bool _down) s_input->m_keyboard.setKeyState(_key, _modifiers, _down); } +bool inputGetKeyState(entry::Key::Enum _key, uint8_t* _modifiers) +{ + return s_input->m_keyboard.getKeyState(_key, _modifiers); +} + void inputChar(uint8_t _len, const uint8_t _char[4]) { s_input->m_keyboard.pushChar(_len, _char); diff --git a/examples/common/entry/input.h b/examples/common/entry/input.h index c3f7ef18..f18b899b 100644 --- a/examples/common/entry/input.h +++ b/examples/common/entry/input.h @@ -39,6 +39,9 @@ void inputProcess(); /// void inputSetKeyState(entry::Key::Enum _key, uint8_t _modifiers, bool _down); +/// +bool inputGetKeyState(entry::Key::Enum _key, uint8_t* _modifiers = NULL); + /// Adds single UTF-8 encoded character into input buffer. void inputChar(uint8_t _len, const uint8_t _char[4]); diff --git a/examples/common/imgui/ocornut_imgui.cpp b/examples/common/imgui/ocornut_imgui.cpp index 820cbc3c..7cc6448b 100644 --- a/examples/common/imgui/ocornut_imgui.cpp +++ b/examples/common/imgui/ocornut_imgui.cpp @@ -7,6 +7,7 @@ #include #include #include +#include "../entry/input.h" #include "imgui.h" #include "ocornut_imgui.h" #include @@ -61,6 +62,11 @@ struct OcornutImguiContext uint32_t vtx_offset = 0; for (const ImDrawCmd* pcmd = pcmd_begin; pcmd != pcmd_end; pcmd++) { + if (0 == pcmd->vtx_count) + { + continue; + } + bgfx::setState(0 | BGFX_STATE_RGB_WRITE | BGFX_STATE_ALPHA_WRITE @@ -105,6 +111,11 @@ struct OcornutImguiContext io.IniFilename = NULL; // io.PixelCenterOffset = bgfx::RendererType::Direct3D9 == bgfx::getRendererType() ? -0.5f : 0.0f; + for (uint32_t ii = 0; ii < ImGuiKey_COUNT; ++ii) + { + io.KeyMap[ii] = ImGuiKey_(ii); + } + const bgfx::Memory* vsmem; const bgfx::Memory* fsmem; @@ -182,6 +193,24 @@ struct OcornutImguiContext io.MousePos = ImVec2((float)_mx, (float)_my); io.MouseDown[0] = 0 != (_button & IMGUI_MBUT_LEFT); + io.KeysDown[ImGuiKey_Tab] = inputGetKeyState(entry::Key::Tab); + io.KeysDown[ImGuiKey_LeftArrow] = inputGetKeyState(entry::Key::Left); + io.KeysDown[ImGuiKey_RightArrow] = inputGetKeyState(entry::Key::Right); + io.KeysDown[ImGuiKey_UpArrow] = inputGetKeyState(entry::Key::Up); + io.KeysDown[ImGuiKey_DownArrow] = inputGetKeyState(entry::Key::Down); + io.KeysDown[ImGuiKey_Home] = inputGetKeyState(entry::Key::Home); + io.KeysDown[ImGuiKey_End] = inputGetKeyState(entry::Key::End); + io.KeysDown[ImGuiKey_Delete] = inputGetKeyState(entry::Key::Delete); + io.KeysDown[ImGuiKey_Backspace] = inputGetKeyState(entry::Key::Backspace); + io.KeysDown[ImGuiKey_Enter] = inputGetKeyState(entry::Key::Return); + io.KeysDown[ImGuiKey_Escape] = inputGetKeyState(entry::Key::Esc); + io.KeysDown[ImGuiKey_A] = inputGetKeyState(entry::Key::KeyA); + io.KeysDown[ImGuiKey_C] = inputGetKeyState(entry::Key::KeyC); + io.KeysDown[ImGuiKey_V] = inputGetKeyState(entry::Key::KeyV); + io.KeysDown[ImGuiKey_X] = inputGetKeyState(entry::Key::KeyX); + io.KeysDown[ImGuiKey_Y] = inputGetKeyState(entry::Key::KeyY); + io.KeysDown[ImGuiKey_Z] = inputGetKeyState(entry::Key::KeyZ); + ImGui::NewFrame(); //ImGui::ShowTestWindow(); //Debug only.