From d8be6fc06f1645c5e2d5b2bc8f917fab6358bdbf Mon Sep 17 00:00:00 2001 From: Kevin Trogant Date: Thu, 8 Dec 2022 12:59:54 +0100 Subject: [PATCH] Scrollwheel and "raw" keyboard input --- app/src/main/cpp/NativeEngine.cpp | 9 +++- app/src/main/cpp/win32_kde.cpp | 68 ++++++++++++++++++++++--------- 2 files changed, 56 insertions(+), 21 deletions(-) diff --git a/app/src/main/cpp/NativeEngine.cpp b/app/src/main/cpp/NativeEngine.cpp index e52494f..6866f26 100644 --- a/app/src/main/cpp/NativeEngine.cpp +++ b/app/src/main/cpp/NativeEngine.cpp @@ -194,18 +194,23 @@ void NativeEngine::gameLoop() // den GameState, input_events und input_event_count und die Displaygröße bekommen sollte: // // kUpdate(&m_state, input_events, input_event_count, + // 0.0, + // nullptr, 0, // nullptr, 0, // m_display_width, m_display_height) // - // (Für Kompatibilität zu Windows sollte die funktion auch tastatur input akzeptieren, + // (Für Kompatibilität zu Windows sollte die funktion auch Tastatur und Scroll input akzeptieren, // den es unter Android aber momentan nicht gibt.) // // Die Funktion könnte folgende Definition haben: // void kUpdate(GameState* state, // const TouchInputEvent* touch_events, // unsigned int touch_event_count, - // unsigned int* pressed_codepoints, + // double scroll_offset, + // const unsigned int* pressed_codepoints, // unsigned int codepoint_count, + // const int* pressed_keys, + // unsigned int pressed_key_count, // float display_width, // float display_height) // ENDE INTEGRATION diff --git a/app/src/main/cpp/win32_kde.cpp b/app/src/main/cpp/win32_kde.cpp index 2922b49..2e32a63 100644 --- a/app/src/main/cpp/win32_kde.cpp +++ b/app/src/main/cpp/win32_kde.cpp @@ -21,6 +21,12 @@ struct CodePointsArray unsigned int cap; }; +struct UserData +{ + CodePointsArray cp_array; + double scroll_offset; +}; + static void errorCallback(int error, const char* desc) { MessageBoxA(NULL, desc, "Error", MB_ICONERROR | MB_OK); @@ -28,10 +34,17 @@ static void errorCallback(int error, const char* desc) static void charCallback(GLFWwindow* window, unsigned int cp) { - CodePointsArray* cp_array = reinterpret_cast(glfwGetWindowUserPointer(window)); - assert(cp_array != nullptr); - if (cp_array->count < cp_array->cap) - cp_array->cps[cp_array->count++] = cp; + UserData* ud = reinterpret_cast(glfwGetWindowUserPointer(window)); + assert(ud != nullptr); + if (ud->cp_array.count < ud->cp_array.cap) + ud->cp_array.cps[ud->cp_array.count++] = cp; +} + +static void scrollCallback(GLFWwindow* window, double /* xoffset */, double yoffset) +{ + UserData* ud = reinterpret_cast(glfwGetWindowUserPointer(window)); + assert(ud != nullptr); + ud->scroll_offset = yoffset; } int main() @@ -43,10 +56,8 @@ int main() } unsigned int pressed_codepoints[100]; - CodePointsArray cp_array; - cp_array.cps = pressed_codepoints; - cp_array.cap = 100; - cp_array.count = 0; + UserData ud = {}; + ud.cp_array = {pressed_codepoints, 0, 100}; glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); @@ -56,8 +67,9 @@ int main() glfwTerminate(); return 1; } - glfwSetWindowUserPointer(window, &cp_array); + glfwSetWindowUserPointer(window, &ud); glfwSetCharCallback(window, charCallback); + glfwSetScrollCallback(window, scrollCallback); glfwMakeContextCurrent(window); int ret = gladLoadGLES2Loader((GLADloadproc)glfwGetProcAddress); @@ -82,14 +94,21 @@ int main() glfwSwapInterval(1); while (!glfwWindowShouldClose(window)) { - /* Reset the pressed codepoints array, - * because glfwPollEvents() will call our characterCallback + /* Reset the pressed codepoints array and scroll offset + * because glfwPollEvents() will call our callbacks */ - cp_array.count = 0; - + ud.cp_array.count = 0; + ud.scroll_offset = 0.0; glfwPollEvents(); /* Gather keyboard input */ + int pressed_keys[GLFW_KEY_LAST + 1]; + unsigned int pressed_key_count = 0; + for (int key = GLFW_KEY_SPACE; key <= GLFW_KEY_LAST; ++key) { + if (glfwGetKey(window, key) == GLFW_PRESS) { + pressed_keys[pressed_key_count++] = key; + } + } /* Gather mouse input */ TouchInputEvent input_events[1] = {}; @@ -103,10 +122,6 @@ int main() input_event_count = 1; } - if (cp_array.count > 0) { - printf("CP: %u\n", cp_array.cps[0]); - } - int w, h; glfwGetFramebufferSize(window, &w, &h); @@ -117,7 +132,9 @@ int main() // den GameState, input_events und input_event_count und die Displaygröße bekommen sollte: // // kUpdate(&state, input_events, input_event_count, - // cp_array.cps, cp_array.count, + // ud.scroll_offset, + // ud.cp_array.cps, ud.cp_array.count, + // pressed_keys, pressed_key_count, // display_width, display_height) // // @@ -125,8 +142,11 @@ int main() // void kUpdate(GameState* state, // const TouchInputEvent* touch_events, // unsigned int touch_event_count, - // unsigned int* pressed_codepoints, + // double scroll_offset, + // const unsigned int* pressed_codepoints, // unsigned int codepoint_count, + // const int* pressed_keys, + // unsigned int pressed_key_count, // float display_width, // float display_height) // ENDE INTEGRATION @@ -145,6 +165,16 @@ int main() smiley_pos.x -= 250; smiley_pos.y -= 250; } + if (ud.scroll_offset != 0) { + smiley_pos.y += ud.scroll_offset; + } + + if (pressed_key_count > 0) { + for (unsigned int i = 0; i < pressed_key_count; ++i) { + if (pressed_keys[i] == GLFW_KEY_LEFT_CONTROL) + smiley_pos = {100, 100}; + } + } Renderer::ptr->addRect(100, 100, 500, 500, 0.3f, 0.3f, 0.3f, 1.f); Renderer::ptr->addRect(smiley_pos.x, smiley_pos.y, 500, 500, 0.f, x * x, 1.f - x * x, 1.f, smiley);