From 6f0a4b7aa4cd9a5af7c366ecbebaa3402f939a31 Mon Sep 17 00:00:00 2001 From: RigidStudios Date: Wed, 7 Feb 2024 18:53:17 +0400 Subject: [PATCH 1/2] Fix S2D event collisions for ScaleMode case --- h2d/Scene.hx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/h2d/Scene.hx b/h2d/Scene.hx index abb458b9a0..64ff035199 100644 --- a/h2d/Scene.hx +++ b/h2d/Scene.hx @@ -523,8 +523,12 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I @:dox(hide) @:noCompletion public function handleEvent( event : hxd.Event, last : hxd.SceneEvents.Interactive ) : hxd.SceneEvents.Interactive { screenToViewport(event); - var ex = event.relX; - var ey = event.relY; + + // Convert window position to scene position + // (support for Scene scaling modes) + var ex = event.relX / window.width * width; + var ey = event.relY / window.height * height; + var index = last == null ? 0 : interactive.indexOf(cast last) + 1; var pt = shapePoint; for( idx in index...interactive.length ) { @@ -539,6 +543,7 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I var dx = ex - i.absX; var dy = ey - i.absY; + var rx = (dx * i.matD - dy * i.matC) * i.invDet; var ry = (dy * i.matA - dx * i.matB) * i.invDet; From a34a24dff332b20b2e6b1373164c50aefe8a235c Mon Sep 17 00:00:00 2001 From: RigidStudios Date: Thu, 8 Feb 2024 15:32:44 +0400 Subject: [PATCH 2/2] Add engineScaleX/Y for all correct resizes. --- h2d/Camera.hx | 22 ++++++++++++++-------- h2d/Scene.hx | 20 ++++++++++++++++---- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/h2d/Camera.hx b/h2d/Camera.hx index c6bf364462..1f1362bf3b 100644 --- a/h2d/Camera.hx +++ b/h2d/Camera.hx @@ -309,6 +309,9 @@ class Camera { Requires Camera being attached to a Scene. **/ inline function screenXToCamera( mx : Float, my : Float ) : Float { + mx *= scene.engineScaleX; + my *= scene.engineScaleY; + return sceneXToCamera((mx - scene.offsetX) / scene.viewportScaleX, (my - scene.offsetY) / scene.viewportScaleY); } @@ -318,25 +321,28 @@ class Camera { Requires Camera being attached to a Scene. **/ inline function screenYToCamera( mx : Float, my : Float ) : Float { + mx *= scene.engineScaleX; + my *= scene.engineScaleY; + return sceneYToCamera((mx - scene.offsetX) / scene.viewportScaleX, (my - scene.offsetY) / scene.viewportScaleY); } /** - Convert local camera position to absolute screen position. + Convert local camera position to absolute screen (engine) position. Requires Camera being attached to a Scene. **/ inline function cameraXToScreen( mx : Float, my : Float ) : Float { - return cameraXToScene(mx, my) * scene.viewportScaleX + scene.offsetX; + return (cameraXToScene(mx, my) * scene.viewportScaleX + scene.offsetX) * scene.engineScaleX; } /** - Convert local camera position to absolute screen position. + Convert local camera position to absolute screen (engine) position. Requires Camera being attached to a Scene. **/ inline function cameraYToScreen( mx : Float, my : Float ) : Float { - return cameraYToScene(mx, my) * scene.viewportScaleY + scene.offsetY; + return (cameraYToScene(mx, my) * scene.viewportScaleY + scene.offsetY) * scene.engineScaleY; } // Scene <-> Camera @@ -380,8 +386,8 @@ class Camera { @:dox(hide) @:noCompletion public function eventToCamera( e : hxd.Event ) { var x = (e.relX - scene.offsetX) / scene.viewportScaleX - absX; var y = (e.relY - scene.offsetY) / scene.viewportScaleY - absY; - e.relX = (x * matD - y * matC) * invDet; - e.relY = (-x * matB + y * matA) * invDet; + e.relX = (x * matD - y * matC) * invDet * scene.engineScaleX; + e.relY = (-x * matB + y * matA) * invDet * scene.engineScaleY; } /** @@ -393,8 +399,8 @@ class Camera { checkScene(); var x = (pt.x - scene.offsetX) / scene.viewportScaleX - absX; var y = (pt.y - scene.offsetY) / scene.viewportScaleY - absY; - pt.x = (x * matD - y * matC) * invDet; - pt.y = (-x * matB + y * matA) * invDet; + pt.x = (x * matD - y * matC) * invDet * scene.engineScaleX; + pt.y = (-x * matB + y * matA) * invDet * scene.engineScaleY; } /** diff --git a/h2d/Scene.hx b/h2d/Scene.hx index 64ff035199..a4c5cb6c05 100644 --- a/h2d/Scene.hx +++ b/h2d/Scene.hx @@ -157,6 +157,15 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I **/ public var viewportScaleY(default, null) : Float; + /** + Ratio of the engine-to-screen X mismatch in case of manual Engine.resize() calls. + **/ + public var engineScaleX(default, null): Float; + /** + Ratio of the engine-to-screen Y mismatch in case of manual Engine.resize() calls. + **/ + public var engineScaleY(default, null): Float; + /** The current mouse X coordinates (in pixels) relative to the current `Scene.interactiveCamera`. **/ @@ -251,6 +260,8 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I eventListeners = new Array(); shapePoint = new h2d.col.Point(); window = hxd.Window.getInstance(); + engineScaleX = e.width / window.width; + engineScaleY = e.height / window.height; posChanged = true; } @@ -334,6 +345,9 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I var engine = h3d.Engine.getCurrent(); if (engine == null) return; + engineScaleX = engine.width / window.width; + engineScaleY = engine.height / window.height; + inline function setSceneSize( w : Int, h : Int ) { if ( w != this.width || h != this.height ) { width = w; @@ -524,10 +538,8 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I public function handleEvent( event : hxd.Event, last : hxd.SceneEvents.Interactive ) : hxd.SceneEvents.Interactive { screenToViewport(event); - // Convert window position to scene position - // (support for Scene scaling modes) - var ex = event.relX / window.width * width; - var ey = event.relY / window.height * height; + var ex = event.relX; + var ey = event.relY; var index = last == null ? 0 : interactive.indexOf(cast last) + 1; var pt = shapePoint;