From 6566b83dee202586ae8704ee856dbab922f7d768 Mon Sep 17 00:00:00 2001 From: nodoteve Date: Mon, 15 Feb 2021 23:29:36 +0300 Subject: [PATCH] Done mousePressEvent() and mouseReleaseEvent() --- src/Magnum/Platform/AndroidApplication.cpp | 45 ++++++++++++++++++++-- src/Magnum/Platform/AndroidApplication.h | 32 +++++++++++++-- 2 files changed, 69 insertions(+), 8 deletions(-) diff --git a/src/Magnum/Platform/AndroidApplication.cpp b/src/Magnum/Platform/AndroidApplication.cpp index abc5e983c..61824f407 100644 --- a/src/Magnum/Platform/AndroidApplication.cpp +++ b/src/Magnum/Platform/AndroidApplication.cpp @@ -251,7 +251,7 @@ std::int32_t AndroidApplication::inputEvent(android_app* state, AInputEvent* eve /* On a touch screen move events aren't reported when the finger is moving above (of course), so remember the position always */ - app._previousMouseMovePosition = {Int(AMotionEvent_getX(event, 0)), Int(AMotionEvent_getY(event, 0))}; + app._previousMouseMovePosition[0] = {Int(AMotionEvent_getX(event, 0)), Int(AMotionEvent_getY(event, 0))}; MouseEvent e(event); action == AMOTION_EVENT_ACTION_DOWN ? app.mousePressEvent(e) : app.mouseReleaseEvent(e); return e.isAccepted() ? 1 : 0; @@ -260,12 +260,49 @@ std::int32_t AndroidApplication::inputEvent(android_app* state, AInputEvent* eve case AMOTION_EVENT_ACTION_MOVE: { Vector2i position{Int(AMotionEvent_getX(event, 0)), Int(AMotionEvent_getY(event, 0))}; MouseMoveEvent e{event, - app._previousMouseMovePosition == Vector2i{-1} ? Vector2i{} : - position - app._previousMouseMovePosition}; - app._previousMouseMovePosition = position; + app._previousMouseMovePosition[0] == Vector2i{-1} ? Vector2i{} : + position - app._previousMouseMovePosition[0]}; + app._previousMouseMovePosition[0] = position; app.mouseMoveEvent(e); return e.isAccepted() ? 1 : 0; } + + /* Look here: + https://android-developers.googleblog.com/2010/06/making-sense-of-multitouch.html + for ACTION_POINTER_UP and ACTION_POINTER_DOWN */ + + case AMOTION_EVENT_ACTION_POINTER_DOWN: + case AMOTION_EVENT_ACTION_POINTER_UP: { + // Extract the index of the pointer that left the touch sensor + // ! Don't mix up AMotionEvent_getAction(event) and 'action' ! + const std::size_t pointerIndex = (AMotionEvent_getAction(event) & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) + >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; + + const std::size_t pointerCount = AMotionEvent_getPointerCount(event); + + // Get the persistent id from the index + std::int32_t pointerId = AMotionEvent_getPointerId(event, pointerIndex); + /* Do we need an assert or something like unordered_map in case of (pointerId < 0) or (pointerId > 2^(~20)) + or we can just trust AMotionEvent_getPointerId() ? + + Btw, looks like 'pointerIndex' works well. + */ + pointerId = (pointerId < 0 ? 0 : (size_t)pointerId); + + + if(pointerId >= arraySize(app._previousMouseMovePosition)) + Containers::arrayAppend(app._previousMouseMovePosition, + {Int(AMotionEvent_getX(event, pointerIndex)), + Int(AMotionEvent_getY(event, pointerIndex))}); + else + app._previousMouseMovePosition[pointerId] = {Int(AMotionEvent_getX(event, pointerIndex)), + Int(AMotionEvent_getY(event, pointerIndex))}; + + MouseEvent e(event, pointerIndex, pointerId); + action == AMOTION_EVENT_ACTION_POINTER_DOWN ? + app.mousePressEvent(e) : app.mouseReleaseEvent(e); + return e.isAccepted() ? 1 : 0; + } } /** @todo Implement also other input events */ diff --git a/src/Magnum/Platform/AndroidApplication.h b/src/Magnum/Platform/AndroidApplication.h index dd12a508d..50040cf89 100644 --- a/src/Magnum/Platform/AndroidApplication.h +++ b/src/Magnum/Platform/AndroidApplication.h @@ -40,6 +40,10 @@ #include "Magnum/Math/Vector4.h" #include "Magnum/Platform/Platform.h" +//Is it ok? +#include "Corrade/Containers/Array.h" +#include "Corrade/Containers/GrowableArray.h" + #if defined(CORRADE_TARGET_ANDROID) || defined(DOXYGEN_GENERATING_OUTPUT) #include @@ -433,7 +437,11 @@ class AndroidApplication { EGLDisplay _display; EGLSurface _surface; EGLContext _glContext; - Vector2i _previousMouseMovePosition{-1}; + /* Create array from given value like here: + https://doc.magnum.graphics/corrade/classCorrade_1_1Containers_1_1Array.html + The exact number of pointers is unknown, isn't it? + */ + Containers::Array _previousMouseMovePosition{Containers::InPlaceInit, {{-1,-1}}}; Containers::Pointer _context; Containers::Pointer _logOutput; @@ -710,12 +718,28 @@ class AndroidApplication::MouseEvent: public InputEvent { /** @brief Position */ Vector2i position() { - return {Int(AMotionEvent_getX(_event, 0)), - Int(AMotionEvent_getY(_event, 0))}; + return {Int(AMotionEvent_getX(_event, _pointerIndex)), + Int(AMotionEvent_getY(_event, _pointerIndex))}; } + /** @brief Pointer Index Do we need both of them? + * Index != Id + */ + std::size_t pointerIndex() const { return _pointerIndex; } + + /** @brief Pointer Id + * Index != Id + */ + std::size_t pointerId() const { return _pointerId; } + private: - explicit MouseEvent(AInputEvent* event): InputEvent(event) {} + // Did it almost like MouseMoveEvent with _relativePosition + explicit MouseEvent(AInputEvent* event, std::size_t pointerIndex = 0, std::int32_t pointerId = 0): + /* why not {}, but () instead? */ InputEvent(event), + _pointerId{pointerId},_pointerIndex{pointerIndex} {} + + const std::int32_t _pointerId; + const std::size_t _pointerIndex; }; /**