From 652722e760fab2959c74e2fa65452f334c8b8478 Mon Sep 17 00:00:00 2001 From: Bastien Bouclet Date: Thu, 7 Nov 2019 11:02:00 +0100 Subject: 3DS: Rework mouse cursor movement - Fix clipping the cursor position - Ensure the mouse has the same vertical and horizontal speed --- backends/platform/3ds/osystem-events.cpp | 35 ++++++++++++++++-------------- backends/platform/3ds/osystem-graphics.cpp | 25 ++++++++++++++------- backends/platform/3ds/osystem.h | 3 +++ backends/platform/3ds/sprite.h | 8 +++---- 4 files changed, 43 insertions(+), 28 deletions(-) (limited to 'backends') diff --git a/backends/platform/3ds/osystem-events.cpp b/backends/platform/3ds/osystem-events.cpp index fb30d665a0..1ee550ed66 100644 --- a/backends/platform/3ds/osystem-events.cpp +++ b/backends/platform/3ds/osystem-events.cpp @@ -51,8 +51,6 @@ static void eventThreadFunc(void *arg) { uint32 touchStartTime = osys->getMillis(); touchPosition lastTouch = {0, 0}; bool isRightClick = false; - float cursorX = 0; - float cursorY = 0; float cursorDeltaX = 0; float cursorDeltaY = 0; int circleDeadzone = 20; @@ -93,8 +91,7 @@ static void eventThreadFunc(void *arg) { if (touch.py > 239 - borderSnapZone) touch.py = 239; } - cursorX = touch.px; - cursorY = touch.py; + osys->transformPoint(touch); osys->warpMouse(touch.px, touch.py); @@ -130,16 +127,14 @@ static void eventThreadFunc(void *arg) { pushEventQueue(eventQueue, event); } } else if (cursorDeltaX != 0 || cursorDeltaY != 0) { - cursorX += cursorDeltaX; - cursorY -= cursorDeltaY; - if (cursorX < 0) cursorX = 0; - if (cursorY < 0) cursorY = 0; - if (cursorX > 320) cursorX = 320; - if (cursorY > 240) cursorY = 240; - lastTouch.px = cursorX; - lastTouch.py = cursorY; - osys->transformPoint(lastTouch); + float scaleRatio = osys->getScaleRatio(); + + lastTouch.px += cursorDeltaX / scaleRatio; + lastTouch.py -= cursorDeltaY / scaleRatio; + + osys->clipPoint(lastTouch); osys->warpMouse(lastTouch.px, lastTouch.py); + event.mouse.x = lastTouch.px; event.mouse.y = lastTouch.py; event.type = Common::EVENT_MOUSEMOVE; @@ -312,10 +307,18 @@ void OSystem_3DS::transformPoint(touchPosition &point) { if (!_overlayVisible) { point.px = static_cast(point.px) / _gameBottomTexture.getScaleX() - _gameBottomTexture.getPosX(); point.py = static_cast(point.py) / _gameBottomTexture.getScaleY() - _gameBottomTexture.getPosY(); + } + + clipPoint(point); +} + +void OSystem_3DS::clipPoint(touchPosition &point) { + if (_overlayVisible) { + point.px = CLIP(point.px, 0, getOverlayWidth() - 1); + point.py = CLIP(point.py, 0, getOverlayHeight() - 1); } else { - if (config.screen == kScreenTop) { - point.px = (uint32) point.px * 400 / 320; // TODO: Fix horizontal speed - } + point.px = CLIP(point.px, 0, _gameTopTexture.actualWidth - 1); + point.py = CLIP(point.py, 0, _gameTopTexture.actualHeight - 1); } } diff --git a/backends/platform/3ds/osystem-graphics.cpp b/backends/platform/3ds/osystem-graphics.cpp index 8fb92f4d48..c3864c143f 100644 --- a/backends/platform/3ds/osystem-graphics.cpp +++ b/backends/platform/3ds/osystem-graphics.cpp @@ -233,6 +233,16 @@ OSystem::TransactionError OSystem_3DS::endGFXTransaction() { return OSystem::kTransactionSuccess; } +float OSystem_3DS::getScaleRatio() const { + if (_overlayVisible) { + return 1.0; + } else if (config.screen == kScreenTop) { + return _gameTopTexture.getScaleX(); + } else { + return _gameBottomTexture.getScaleX(); + } +} + void OSystem_3DS::setPalette(const byte *colors, uint start, uint num) { assert(start + num <= 256); memcpy(_palette + 3 * start, colors, 3 * num); @@ -578,18 +588,17 @@ void OSystem_3DS::warpMouse(int x, int y) { _cursorY = y; // TODO: adjust for _cursorScalable ? - int offsetx = 0; - int offsety = 0; x -= _cursorHotspotX; y -= _cursorHotspotY; + + int offsetx = 0; + int offsety = 0; if (!_overlayVisible) { - offsetx += config.screen == kScreenTop ? _gameTopX : _gameBottomX; - offsety += config.screen == kScreenTop ? _gameTopY : _gameBottomY; + offsetx = config.screen == kScreenTop ? _gameTopTexture.getPosX() : _gameBottomTexture.getPosX(); + offsety = config.screen == kScreenTop ? _gameTopTexture.getPosY() : _gameBottomTexture.getPosY(); } - float scalex = config.screen == kScreenTop ? (float)_gameTopTexture.actualWidth / _gameWidth : 1.f; - float scaley = config.screen == kScreenTop ? (float)_gameTopTexture.actualHeight / _gameHeight : 1.f; - _cursorTexture.setPosition(scalex * x + offsetx, - scaley * y + offsety); + + _cursorTexture.setPosition(x + offsetx, y + offsety); } void OSystem_3DS::setCursorDelta(float deltaX, float deltaY) { diff --git a/backends/platform/3ds/osystem.h b/backends/platform/3ds/osystem.h index 70cd475cf9..c15c353c24 100644 --- a/backends/platform/3ds/osystem.h +++ b/backends/platform/3ds/osystem.h @@ -111,6 +111,7 @@ public: OSystem::TransactionError endGFXTransaction(); int16 getHeight(){ return _gameHeight; } int16 getWidth(){ return _gameWidth; } + float getScaleRatio() const; void setPalette(const byte *colors, uint start, uint num); void grabPalette(byte *colors, uint start, uint num) const; void copyRectToScreen(const void *buf, int pitch, int x, int y, int w, @@ -142,6 +143,8 @@ public: // Transform point from touchscreen coords into gamescreen coords void transformPoint(touchPosition &point); + // Clip point to gamescreen coords + void clipPoint(touchPosition &point); void setCursorDelta(float deltaX, float deltaY); diff --git a/backends/platform/3ds/sprite.h b/backends/platform/3ds/sprite.h index a7d8b77842..7bb4d36c3a 100644 --- a/backends/platform/3ds/sprite.h +++ b/backends/platform/3ds/sprite.h @@ -54,10 +54,10 @@ public: void setPosition(int x, int y); void setOffset(uint16 x, uint16 y); void setScale(float x, float y); - float getScaleX(){ return scaleX; } - float getScaleY(){ return scaleY; } - int getPosX(){ return posX; } - int getPosY(){ return posY; } + float getScaleX() const { return scaleX; } + float getScaleY() const { return scaleY; } + int getPosX() const { return posX; } + int getPosY() const { return posY; } C3D_Mtx* getMatrix(); uint16 actualWidth; -- cgit v1.2.3