From b5ad3b535250e449e6285d4d613debec6d14f1b2 Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Wed, 21 Dec 2022 22:23:51 +0530 Subject: [PATCH] fix clipping --- src/gui/GuiControl.hx | 2 +- src/gui/GuiImage.hx | 48 +++++++++++++++++++++++++++++-------------- src/gui/Rect.hx | 3 +-- 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/gui/GuiControl.hx b/src/gui/GuiControl.hx index c732746f..7fa6499e 100644 --- a/src/gui/GuiControl.hx +++ b/src/gui/GuiControl.hx @@ -131,7 +131,7 @@ class GuiControl { rect.position = parentRect.position.add(this.position.multiply(uiScaleFactor)); } - var scaleFactor = 1.0 / Window.getInstance().windowToPixelRatio; + var scaleFactor = 1.0; #if (js || android) scaleFactor = 1 / Settings.zoomRatio; // 768 / js.Browser.window.innerHeight * js.Browser.window.devicePixelRatio; // 0.5; // 768 / js.Browser.window.innerHeight; // js.Browser.window.innerHeight * js.Browser.window.devicePixelRatio / 768; #end diff --git a/src/gui/GuiImage.hx b/src/gui/GuiImage.hx index 259e2f46..8de563cf 100644 --- a/src/gui/GuiImage.hx +++ b/src/gui/GuiImage.hx @@ -1,5 +1,6 @@ package gui; +import h2d.Flow; import shaders.GuiClipFilter; import h2d.filter.Mask; import gui.GuiControl.MouseState; @@ -11,6 +12,7 @@ import src.MarbleGame; @:publicFields class GuiImage extends GuiControl { var bmp:Bitmap; + var bmpFlow:Flow; public var pressedAction:GuiEvent->Void = null; @@ -24,30 +26,43 @@ class GuiImage extends GuiControl { public override function render(scene2d:Scene) { var renderRect = this.getRenderRectangle(); var hittestRect = this.getHitTestRect(); - if (doClipping - && (hittestRect.position.x > renderRect.position.x - || hittestRect.position.y > renderRect.position.y - || hittestRect.extent.x < renderRect.extent.x - || hittestRect.extent.y < renderRect.extent.y)) { - if (bmp.filter == null) { - bmp.filter = new GuiClipFilter(hittestRect); - } + + var obj:h2d.Object = bmp; + if (doClipping) { + bmpFlow = new Flow(); + bmpFlow.addChild(bmp); + bmpFlow.overflow = FlowOverflow.Hidden; + bmpFlow.multiline = true; + bmpFlow.setPosition(hittestRect.position.x, hittestRect.position.y); + obj = bmpFlow; + } + + if (doClipping) { + var fp = bmpFlow.getProperties(bmp); + fp.offsetX = -Std.int(hittestRect.position.x - renderRect.position.x); + fp.offsetY = -Std.int(hittestRect.position.y - renderRect.position.y); + } else { + bmp.setPosition(Math.floor(renderRect.position.x), Math.floor(renderRect.position.y)); } - bmp.setPosition(Math.floor(renderRect.position.x), Math.floor(renderRect.position.y)); - // bmp.scaleX = renderRect.extent.x / bmp.tile.width; - // bmp.scaleY = renderRect.extent.y / bmp.tile.height; bmp.width = renderRect.extent.x; bmp.height = renderRect.extent.y; - if (scene2d.contains(bmp)) { - scene2d.removeChild(bmp); // Refresh "layer" + if (doClipping) { + bmpFlow.maxWidth = Std.int(hittestRect.extent.x); + bmpFlow.maxHeight = Std.int(hittestRect.extent.y); } - scene2d.addChild(bmp); + if (scene2d.contains(obj)) { + scene2d.removeChild(obj); // Refresh "layer" + } + scene2d.addChild(obj); super.render(scene2d); } public override function dispose() { super.dispose(); - this.bmp.remove(); + if (this.doClipping) { + bmpFlow.remove(); + } else + this.bmp.remove(); } public override function onMouseRelease(mouseState:MouseState) { @@ -59,6 +74,9 @@ class GuiImage extends GuiControl { public override function onRemove() { super.onRemove(); + if (MarbleGame.canvas.scene2d.contains(bmpFlow)) { + MarbleGame.canvas.scene2d.removeChild(bmpFlow); // Refresh "layer" + } if (MarbleGame.canvas.scene2d.contains(bmp)) { MarbleGame.canvas.scene2d.removeChild(bmp); // Refresh "layer" } diff --git a/src/gui/Rect.hx b/src/gui/Rect.hx index be1e658f..07e90132 100644 --- a/src/gui/Rect.hx +++ b/src/gui/Rect.hx @@ -15,8 +15,7 @@ class Rect { } public function inRect(point:Vector) { - return (position.x <= point.x && (position.x + extent.x) >= point.x) - && (position.y <= point.y && (position.y + extent.y) >= point.y); + return (position.x < point.x && (position.x + extent.x) > point.x) && (position.y < point.y && (position.y + extent.y) > point.y); } public function intersect(other:Rect) {