fix clipping

This commit is contained in:
RandomityGuy 2022-12-21 22:23:51 +05:30
parent 6e07c4f357
commit b5ad3b5352
3 changed files with 35 additions and 18 deletions

View file

@ -131,7 +131,7 @@ class GuiControl {
rect.position = parentRect.position.add(this.position.multiply(uiScaleFactor)); rect.position = parentRect.position.add(this.position.multiply(uiScaleFactor));
} }
var scaleFactor = 1.0 / Window.getInstance().windowToPixelRatio; var scaleFactor = 1.0;
#if (js || android) #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; 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 #end

View file

@ -1,5 +1,6 @@
package gui; package gui;
import h2d.Flow;
import shaders.GuiClipFilter; import shaders.GuiClipFilter;
import h2d.filter.Mask; import h2d.filter.Mask;
import gui.GuiControl.MouseState; import gui.GuiControl.MouseState;
@ -11,6 +12,7 @@ import src.MarbleGame;
@:publicFields @:publicFields
class GuiImage extends GuiControl { class GuiImage extends GuiControl {
var bmp:Bitmap; var bmp:Bitmap;
var bmpFlow:Flow;
public var pressedAction:GuiEvent->Void = null; public var pressedAction:GuiEvent->Void = null;
@ -24,30 +26,43 @@ class GuiImage extends GuiControl {
public override function render(scene2d:Scene) { public override function render(scene2d:Scene) {
var renderRect = this.getRenderRectangle(); var renderRect = this.getRenderRectangle();
var hittestRect = this.getHitTestRect(); var hittestRect = this.getHitTestRect();
if (doClipping
&& (hittestRect.position.x > renderRect.position.x var obj:h2d.Object = bmp;
|| hittestRect.position.y > renderRect.position.y if (doClipping) {
|| hittestRect.extent.x < renderRect.extent.x bmpFlow = new Flow();
|| hittestRect.extent.y < renderRect.extent.y)) { bmpFlow.addChild(bmp);
if (bmp.filter == null) { bmpFlow.overflow = FlowOverflow.Hidden;
bmp.filter = new GuiClipFilter(hittestRect); 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.width = renderRect.extent.x;
bmp.height = renderRect.extent.y; bmp.height = renderRect.extent.y;
if (scene2d.contains(bmp)) { if (doClipping) {
scene2d.removeChild(bmp); // Refresh "layer" 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); super.render(scene2d);
} }
public override function dispose() { public override function dispose() {
super.dispose(); super.dispose();
this.bmp.remove(); if (this.doClipping) {
bmpFlow.remove();
} else
this.bmp.remove();
} }
public override function onMouseRelease(mouseState:MouseState) { public override function onMouseRelease(mouseState:MouseState) {
@ -59,6 +74,9 @@ class GuiImage extends GuiControl {
public override function onRemove() { public override function onRemove() {
super.onRemove(); super.onRemove();
if (MarbleGame.canvas.scene2d.contains(bmpFlow)) {
MarbleGame.canvas.scene2d.removeChild(bmpFlow); // Refresh "layer"
}
if (MarbleGame.canvas.scene2d.contains(bmp)) { if (MarbleGame.canvas.scene2d.contains(bmp)) {
MarbleGame.canvas.scene2d.removeChild(bmp); // Refresh "layer" MarbleGame.canvas.scene2d.removeChild(bmp); // Refresh "layer"
} }

View file

@ -15,8 +15,7 @@ class Rect {
} }
public function inRect(point:Vector) { public function inRect(point:Vector) {
return (position.x <= point.x && (position.x + extent.x) >= point.x) return (position.x < point.x && (position.x + extent.x) > point.x) && (position.y < point.y && (position.y + extent.y) > point.y);
&& (position.y <= point.y && (position.y + extent.y) >= point.y);
} }
public function intersect(other:Rect) { public function intersect(other:Rect) {