From c9d9c83617c345f616307a19d14afce580ee581a Mon Sep 17 00:00:00 2001 From: saschawillems Date: Mon, 6 Mar 2017 21:16:51 +0100 Subject: [PATCH] Basic Android touch support (rotation only) (Refs #173) --- base/vulkanexamplebase.cpp | 55 +++++++++++++++++++++++++++++--------- base/vulkanexamplebase.h | 5 +++- 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index 8573ca90..62db344b 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -1134,20 +1134,49 @@ int32_t VulkanExampleBase::handleAppInput(struct android_app* app, AInputEvent* VulkanExampleBase* vulkanExample = reinterpret_cast(app->userData); if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) { - if (AInputEvent_getSource(event) == AINPUT_SOURCE_JOYSTICK) - { - // Left thumbstick - vulkanExample->gamePadState.axisLeft.x = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_X, 0); - vulkanExample->gamePadState.axisLeft.y = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_Y, 0); - // Right thumbstick - vulkanExample->gamePadState.axisRight.x = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_Z, 0); - vulkanExample->gamePadState.axisRight.y = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_RZ, 0); + int32_t eventSource = AInputEvent_getSource(event); + switch (eventSource) { + case AINPUT_SOURCE_JOYSTICK: { + // Left thumbstick + vulkanExample->gamePadState.axisLeft.x = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_X, 0); + vulkanExample->gamePadState.axisLeft.y = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_Y, 0); + // Right thumbstick + vulkanExample->gamePadState.axisRight.x = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_Z, 0); + vulkanExample->gamePadState.axisRight.y = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_RZ, 0); + break; + } + + case AINPUT_SOURCE_TOUCHSCREEN: { + int32_t action = AMotionEvent_getAction(event); + + switch (action) { + case AMOTION_EVENT_ACTION_DOWN: { + vulkanExample->touchPos.x = AMotionEvent_getX(event, 0); + vulkanExample->touchPos.y = AMotionEvent_getY(event, 0); + break; + } + case AMOTION_EVENT_ACTION_MOVE: { + int32_t eventX = AMotionEvent_getX(event, 0); + int32_t eventY = AMotionEvent_getY(event, 0); + + vulkanExample->camera.rotate(glm::vec3(0.0f, 1.0f, 0.0f)); + vulkanExample->rotation.x += (float)(vulkanExample->touchPos.y - eventY) * vulkanExample->rotationSpeed * 0.5f; + vulkanExample->rotation.y -= (float)(vulkanExample->touchPos.x - eventX) * vulkanExample->rotationSpeed * 0.5f; + vulkanExample->viewChanged(); + + vulkanExample->touchPos.x = eventX; + vulkanExample->touchPos.y = eventY; + + break; + } + default: + return 1; + break; + } + } + + return 1; } - else - { - // todo : touch input - } - return 1; } if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_KEY) diff --git a/base/vulkanexamplebase.h b/base/vulkanexamplebase.h index 64d94e49..6ebd5d5e 100644 --- a/base/vulkanexamplebase.h +++ b/base/vulkanexamplebase.h @@ -197,7 +197,10 @@ public: #elif defined(__ANDROID__) // true if application has focused, false if moved to background bool focused = false; - + struct TouchPos { + int32_t x; + int32_t y; + } touchPos; #elif defined(VK_USE_PLATFORM_WAYLAND_KHR) wl_display *display = nullptr; wl_registry *registry = nullptr;