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:
parent
997e15878a
commit
7a05624e1b
15 changed files with 271 additions and 2039 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue