Basic Android touch support (rotation only) (Refs #173)

This commit is contained in:
saschawillems 2017-03-06 21:16:51 +01:00
parent 519dab3855
commit c9d9c83617
2 changed files with 46 additions and 14 deletions

View file

@ -1134,20 +1134,49 @@ int32_t VulkanExampleBase::handleAppInput(struct android_app* app, AInputEvent*
VulkanExampleBase* vulkanExample = reinterpret_cast<VulkanExampleBase*>(app->userData); VulkanExampleBase* vulkanExample = reinterpret_cast<VulkanExampleBase*>(app->userData);
if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION)
{ {
if (AInputEvent_getSource(event) == AINPUT_SOURCE_JOYSTICK) int32_t eventSource = AInputEvent_getSource(event);
{ switch (eventSource) {
case AINPUT_SOURCE_JOYSTICK: {
// Left thumbstick // Left thumbstick
vulkanExample->gamePadState.axisLeft.x = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_X, 0); vulkanExample->gamePadState.axisLeft.x = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_X, 0);
vulkanExample->gamePadState.axisLeft.y = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_Y, 0); vulkanExample->gamePadState.axisLeft.y = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_Y, 0);
// Right thumbstick // Right thumbstick
vulkanExample->gamePadState.axisRight.x = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_Z, 0); vulkanExample->gamePadState.axisRight.x = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_Z, 0);
vulkanExample->gamePadState.axisRight.y = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_RZ, 0); vulkanExample->gamePadState.axisRight.y = AMotionEvent_getAxisValue(event, AMOTION_EVENT_AXIS_RZ, 0);
break;
} }
else
{ case AINPUT_SOURCE_TOUCHSCREEN: {
// todo : touch input 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; return 1;
break;
}
}
return 1;
}
} }
if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_KEY) if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_KEY)

View file

@ -197,7 +197,10 @@ public:
#elif defined(__ANDROID__) #elif defined(__ANDROID__)
// true if application has focused, false if moved to background // true if application has focused, false if moved to background
bool focused = false; bool focused = false;
struct TouchPos {
int32_t x;
int32_t y;
} touchPos;
#elif defined(VK_USE_PLATFORM_WAYLAND_KHR) #elif defined(VK_USE_PLATFORM_WAYLAND_KHR)
wl_display *display = nullptr; wl_display *display = nullptr;
wl_registry *registry = nullptr; wl_registry *registry = nullptr;