ANDROID: Rewrite to make use of OpenGLGraphicsManager (#1695)

* ANDROID: Rewrite to make use of OpenGLGraphicsManager

* ANDROID: Fix emulated mouse button up events
This commit is contained in:
Cameron Cawley 2019-09-08 19:37:48 +01:00 committed by GitHub
parent 997e15878a
commit 7a05624e1b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 271 additions and 2039 deletions

View file

@ -40,6 +40,7 @@
#define FORBIDDEN_SYMBOL_EXCEPTION_printf
#include "backends/platform/android/android.h"
#include "backends/platform/android/graphics.h"
#include "backends/platform/android/events.h"
#include "backends/platform/android/jni.h"
@ -76,69 +77,6 @@ void OSystem_Android::setupKeymapper() {
#endif
}
void OSystem_Android::warpMouse(int x, int y) {
ENTER("%d, %d", x, y);
Common::Event e;
e.type = Common::EVENT_MOUSEMOVE;
e.mouse.x = x;
e.mouse.y = y;
clipMouse(e.mouse);
pushEvent(e);
}
void OSystem_Android::clipMouse(Common::Point &p) {
const GLESBaseTexture *tex;
if (_show_overlay)
tex = _overlay_texture;
else
tex = _game_texture;
p.x = CLIP(p.x, int16(0), int16(tex->width() - 1));
p.y = CLIP(p.y, int16(0), int16(tex->height() - 1));
}
void OSystem_Android::scaleMouse(Common::Point &p, int x, int y,
bool deductDrawRect, bool touchpadMode) {
const GLESBaseTexture *tex;
if (_show_overlay)
tex = _overlay_texture;
else
tex = _game_texture;
const Common::Rect &r = tex->getDrawRect();
if (touchpadMode) {
x = x * 100 / _touchpad_scale;
y = y * 100 / _touchpad_scale;
}
if (deductDrawRect) {
x -= r.left;
y -= r.top;
}
p.x = scalef(x, tex->width(), r.width());
p.y = scalef(y, tex->height(), r.height());
}
void OSystem_Android::updateEventScale() {
const GLESBaseTexture *tex;
if (_show_overlay)
tex = _overlay_texture;
else
tex = _game_texture;
_eventScaleY = 100 * 480 / tex->height();
_eventScaleX = 100 * 640 / tex->width();
}
void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
int arg4, int arg5, int arg6) {
Common::Event e;
@ -199,7 +137,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
else
e.type = Common::EVENT_RBUTTONUP;
e.mouse = getEventManager()->getMousePos();
e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();
pushEvent(e);
@ -324,7 +262,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
e.type = Common::EVENT_MOUSEMOVE;
e.mouse = getEventManager()->getMousePos();
e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();
{
int16 *c;
@ -348,8 +286,6 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
*c += f;
}
clipMouse(e.mouse);
pushEvent(e);
return;
@ -367,7 +303,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
return;
}
e.mouse = getEventManager()->getMousePos();
e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();
pushEvent(e);
@ -375,7 +311,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
}
case JE_DOWN:
_touch_pt_down = getEventManager()->getMousePos();
_touch_pt_down = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();
_touch_pt_scroll.x = -1;
_touch_pt_scroll.y = -1;
break;
@ -390,13 +326,13 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
return;
}
scaleMouse(e.mouse, arg3 - _touch_pt_scroll.x,
arg4 - _touch_pt_scroll.y, false, true);
e.mouse.x = (arg3 - _touch_pt_scroll.x) * 100 / _touchpad_scale;
e.mouse.y = (arg4 - _touch_pt_scroll.y) * 100 / _touchpad_scale;
e.mouse += _touch_pt_down;
clipMouse(e.mouse);
} else {
scaleMouse(e.mouse, arg3, arg4);
clipMouse(e.mouse);
e.mouse.x = arg3;
e.mouse.y = arg4;
}
pushEvent(e);
@ -412,10 +348,10 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
e.type = Common::EVENT_MOUSEMOVE;
if (_touchpad_mode) {
e.mouse = getEventManager()->getMousePos();
e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();
} else {
scaleMouse(e.mouse, arg1, arg2);
clipMouse(e.mouse);
e.mouse.x = arg1;
e.mouse.y = arg2;
}
{
@ -457,10 +393,10 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
e.type = Common::EVENT_MOUSEMOVE;
if (_touchpad_mode) {
e.mouse = getEventManager()->getMousePos();
e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();
} else {
scaleMouse(e.mouse, arg1, arg2);
clipMouse(e.mouse);
e.mouse.x = arg1;
e.mouse.y = arg2;
}
{
@ -486,11 +422,9 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
dptype = Common::EVENT_MOUSEMOVE;
if (_touchpad_mode) {
scaleMouse(e.mouse, arg1 - _touch_pt_dt.x,
arg2 - _touch_pt_dt.y, false, true);
e.mouse.x = (arg1 - _touch_pt_dt.x) * 100 / _touchpad_scale;
e.mouse.y = (arg2 - _touch_pt_dt.y) * 100 / _touchpad_scale;
e.mouse += _touch_pt_down;
clipMouse(e.mouse);
}
break;
@ -537,7 +471,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
return;
}
e.mouse = getEventManager()->getMousePos();
e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();
lockMutex(_event_queue_lock);
@ -562,7 +496,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
return;
case JE_BALL:
e.mouse = getEventManager()->getMousePos();
e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();
switch (arg1) {
case JACTION_DOWN:
@ -578,8 +512,6 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
e.mouse.x += arg2 * _trackball_scale / _eventScaleX;
e.mouse.y += arg3 * _trackball_scale / _eventScaleY;
clipMouse(e.mouse);
break;
default:
LOGE("unhandled jaction on system key: %d", arg1);
@ -592,9 +524,8 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
case JE_MOUSE_MOVE:
e.type = Common::EVENT_MOUSEMOVE;
scaleMouse(e.mouse, arg1, arg2);
clipMouse(e.mouse);
e.mouse.x = arg1;
e.mouse.y = arg2;
pushEvent(e);
@ -602,9 +533,8 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
case JE_LMB_DOWN:
e.type = Common::EVENT_LBUTTONDOWN;
scaleMouse(e.mouse, arg1, arg2);
clipMouse(e.mouse);
e.mouse.x = arg1;
e.mouse.y = arg2;
pushEvent(e);
@ -612,9 +542,8 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
case JE_LMB_UP:
e.type = Common::EVENT_LBUTTONUP;
scaleMouse(e.mouse, arg1, arg2);
clipMouse(e.mouse);
e.mouse.x = arg1;
e.mouse.y = arg2;
pushEvent(e);
@ -622,9 +551,8 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
case JE_RMB_DOWN:
e.type = Common::EVENT_RBUTTONDOWN;
scaleMouse(e.mouse, arg1, arg2);
clipMouse(e.mouse);
e.mouse.x = arg1;
e.mouse.y = arg2;
pushEvent(e);
@ -632,9 +560,8 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
case JE_RMB_UP:
e.type = Common::EVENT_RBUTTONUP;
scaleMouse(e.mouse, arg1, arg2);
clipMouse(e.mouse);
e.mouse.x = arg1;
e.mouse.y = arg2;
pushEvent(e);
@ -669,7 +596,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
break;
}
e.mouse = getEventManager()->getMousePos();
e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();
break;
@ -692,7 +619,7 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
break;
case JE_JOYSTICK:
e.mouse = getEventManager()->getMousePos();
e.mouse = dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->getMousePosition();
switch (arg1) {
case JACTION_MULTIPLE:
@ -702,8 +629,6 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
e.mouse.x += arg2 * _joystick_scale / _eventScaleX;
e.mouse.y += arg3 * _joystick_scale / _eventScaleY;
clipMouse(e.mouse);
break;
default:
LOGE("unhandled jaction on joystick: %d", arg1);
@ -745,23 +670,19 @@ bool OSystem_Android::pollEvent(Common::Event &event) {
if (pthread_self() == _main_thread) {
if (_screen_changeid != JNI::surface_changeid) {
_screen_changeid = JNI::surface_changeid;
if (JNI::egl_surface_width > 0 && JNI::egl_surface_height > 0) {
// surface changed
JNI::deinitSurface();
initSurface();
initViewport();
updateScreenRect();
updateEventScale();
// double buffered, flip twice
clearScreen(kClearUpdate, 2);
dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->deinitSurface();
dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->initSurface();
event.type = Common::EVENT_SCREEN_CHANGED;
return true;
} else {
// surface lost
deinitSurface();
dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->deinitSurface();
}
}
@ -777,24 +698,28 @@ bool OSystem_Android::pollEvent(Common::Event &event) {
if (_queuedEventTime && (getMillis() > _queuedEventTime)) {
event = _queuedEvent;
_queuedEventTime = 0;
unlockMutex(_event_queue_lock);
return true;
}
if (_event_queue.empty()) {
// unlockMutex(_event_queue_lock);
// return true;
} else if (_event_queue.empty()) {
unlockMutex(_event_queue_lock);
return false;
} else {
event = _event_queue.pop();
}
event = _event_queue.pop();
unlockMutex(_event_queue_lock);
if (event.type == Common::EVENT_MOUSEMOVE) {
const Common::Point &m = getEventManager()->getMousePos();
if (m != event.mouse)
_force_redraw = true;
switch (event.type) {
case Common::EVENT_MOUSEMOVE:
case Common::EVENT_LBUTTONDOWN:
case Common::EVENT_LBUTTONUP:
case Common::EVENT_RBUTTONDOWN:
case Common::EVENT_RBUTTONUP:
if (_graphicsManager)
return dynamic_cast<AndroidGraphicsManager *>(_graphicsManager)->notifyMousePosition(event.mouse);
break;
default:
break;
}
return true;