diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index a49a20eafa8..4fcd206d9f9 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -234,8 +234,10 @@ public class Forge implements ApplicationListener { } graphics.begin(screenWidth, screenHeight); + screen.screenPos.setSize(screenWidth, screenHeight); screen.draw(graphics); for (FOverlay overlay : FOverlay.getOverlays()) { + overlay.screenPos.setSize(screenWidth, screenHeight); overlay.setSize(screenWidth, screenHeight); //update overlay sizes as they're rendered if (overlay.getRotate180()) { graphics.startRotateTransform(screenWidth / 2, screenHeight / 2, 180); diff --git a/forge-gui-mobile/src/forge/Graphics.java b/forge-gui-mobile/src/forge/Graphics.java index f36712a805a..ad5623dc121 100644 --- a/forge-gui-mobile/src/forge/Graphics.java +++ b/forge-gui-mobile/src/forge/Graphics.java @@ -98,13 +98,11 @@ public class Graphics { final Rectangle parentBounds = bounds; bounds = new Rectangle(parentBounds.x + displayObj.getLeft(), parentBounds.y + displayObj.getTop(), displayObj.getWidth(), displayObj.getHeight()); - if (!transforms.isEmpty()) { //transform screen position if needed - tmp.set(bounds.x + bounds.width / 2, regionHeight - bounds.y - bounds.height / 2, 0); - tmp.mul(batch.getTransformMatrix()); - displayObj.setScreenPosition(tmp.x - bounds.width / 2, regionHeight - tmp.y - bounds.height / 2); + if (!transforms.isEmpty()) { //transform screen position if needed by applying transform matrix to rectangle + updateScreenPosForRotation(displayObj); } else { - displayObj.setScreenPosition(bounds.x, bounds.y); + displayObj.screenPos.set(bounds); } Rectangle intersection = Utils.getIntersection(bounds, visibleBounds); @@ -114,9 +112,11 @@ public class Graphics { if (displayObj.getRotate90()) { //use top-right corner of bounds as pivot point startRotateTransform(displayObj.getWidth(), 0, -90); + updateScreenPosForRotation(displayObj); } else if (displayObj.getRotate180()) { //use center of bounds as pivot point startRotateTransform(displayObj.getWidth() / 2, displayObj.getHeight() / 2, 180); + //screen position won't change for this object from a 180 degree rotation } displayObj.draw(this); @@ -131,6 +131,39 @@ public class Graphics { bounds = parentBounds; } + private void updateScreenPosForRotation(FDisplayObject displayObj) { + tmp.set(bounds.x, regionHeight - bounds.y, 0); + tmp.mul(batch.getTransformMatrix()); + tmp.y = regionHeight - tmp.y; + float minX = tmp.x; + float maxX = minX; + float minY = tmp.y; + float maxY = minY; + tmp.set(bounds.x + bounds.width, regionHeight - bounds.y, 0); + tmp.mul(batch.getTransformMatrix()); + tmp.y = regionHeight - tmp.y; + if (tmp.x < minX) { minX = tmp.x; } + else if (tmp.x > maxX) { maxX = tmp.x; } + if (tmp.y < minY) { minY = tmp.y; } + else if (tmp.y > maxY) { maxY = tmp.y; } + tmp.set(bounds.x + bounds.width, regionHeight - bounds.y - bounds.height, 0); + tmp.mul(batch.getTransformMatrix()); + tmp.y = regionHeight - tmp.y; + if (tmp.x < minX) { minX = tmp.x; } + else if (tmp.x > maxX) { maxX = tmp.x; } + if (tmp.y < minY) { minY = tmp.y; } + else if (tmp.y > maxY) { maxY = tmp.y; } + tmp.set(bounds.x, regionHeight - bounds.y - bounds.height, 0); + tmp.mul(batch.getTransformMatrix()); + tmp.y = regionHeight - tmp.y; + if (tmp.x < minX) { minX = tmp.x; } + else if (tmp.x > maxX) { maxX = tmp.x; } + if (tmp.y < minY) { minY = tmp.y; } + else if (tmp.y > maxY) { maxY = tmp.y; } + + displayObj.screenPos.set(minX, minY, maxX - minX, maxY - minY); + } + public void drawLine(float thickness, FSkinColor skinColor, float x1, float y1, float x2, float y2) { drawLine(thickness, skinColor.getColor(), x1, y1, x2, y2); } diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java index d42c68c070a..650c52902b3 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java @@ -767,10 +767,9 @@ public class ImageView extends ItemView { if (selectedIndices.isEmpty()) { return null; } ItemInfo itemInfo = orderedItems.get(selectedIndices.get(0)); - Vector2 screenPos = itemInfo.group.getScreenPosition(); Vector2 relPos = itemInfo.group.getChildRelativePosition(itemInfo); - return new Rectangle(screenPos.x + relPos.x - SEL_BORDER_SIZE + itemInfo.group.getLeft(), - screenPos.y + relPos.y - SEL_BORDER_SIZE, + return new Rectangle(itemInfo.group.screenPos.x + relPos.x - SEL_BORDER_SIZE + itemInfo.group.getLeft(), + itemInfo.group.screenPos.y + relPos.y - SEL_BORDER_SIZE, itemInfo.getWidth() + 2 * SEL_BORDER_SIZE, itemInfo.getHeight() + 2 * SEL_BORDER_SIZE); } diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java b/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java index 9da38c2d86c..4dc58936a7d 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java @@ -34,8 +34,6 @@ import forge.toolbox.FDisplayObject; import forge.toolbox.FList; import com.badlogic.gdx.math.Rectangle; -import com.badlogic.gdx.math.Vector2; - import java.util.*; import java.util.Map.Entry; @@ -128,8 +126,7 @@ public final class ItemListView extends ItemView { public Rectangle getSelectionBounds() { if (selectedIndices.isEmpty()) { return null; } - Vector2 screenPos = list.getScreenPosition(); - return new Rectangle(screenPos.x, screenPos.y + list.getItemTop(getSelectedIndex()), list.getWidth(), list.getListItemRenderer().getItemHeight()); + return new Rectangle(list.screenPos.x, list.screenPos.y + list.getItemTop(getSelectedIndex()), list.getWidth(), list.getListItemRenderer().getItemHeight()); } @Override diff --git a/forge-gui-mobile/src/forge/menu/FDropDown.java b/forge-gui-mobile/src/forge/menu/FDropDown.java index 74b8033b5e4..88d002dbabf 100644 --- a/forge-gui-mobile/src/forge/menu/FDropDown.java +++ b/forge-gui-mobile/src/forge/menu/FDropDown.java @@ -1,7 +1,5 @@ package forge.menu; -import com.badlogic.gdx.math.Vector2; - import forge.Forge; import forge.Graphics; import forge.assets.FSkinColor; @@ -119,9 +117,8 @@ public abstract class FDropDown extends FScrollPane { float screenWidth = screen.getWidth(); float screenHeight = screen.getHeight(); - Vector2 tabScreenPos = menuTab.getScreenPosition(); - float x = tabScreenPos.x; - float y = tabScreenPos.y + menuTab.getHeight(); + float x = menuTab.screenPos.x; + float y = menuTab.screenPos.y + menuTab.getHeight(); float maxVisibleHeight = screenHeight - VPrompt.HEIGHT - y; //prevent covering prompt paneSize = updateAndGetPaneSize(screenWidth, maxVisibleHeight); diff --git a/forge-gui-mobile/src/forge/menu/FMagnifyView.java b/forge-gui-mobile/src/forge/menu/FMagnifyView.java index af20cfd2cb4..c2b240a4515 100644 --- a/forge-gui-mobile/src/forge/menu/FMagnifyView.java +++ b/forge-gui-mobile/src/forge/menu/FMagnifyView.java @@ -34,8 +34,8 @@ public class FMagnifyView extends FDropDown { @Override protected void updateSizeAndPosition() { - float x = owner.getScreenPosition().x; - float y = owner.getScreenPosition().y + owner.getHeight(); + float x = owner.screenPos.x; + float y = owner.screenPos.y + owner.getHeight(); paneSize = updateAndGetPaneSize(owner.getWidth(), y); float height = paneSize.getHeight(); if (height > y) { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java b/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java index 335e84bdbe1..2356564c15c 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java @@ -36,7 +36,7 @@ public class VAvatar extends FDisplayObject { } public Vector2 getTargetingArrowOrigin() { - Vector2 origin = new Vector2(getScreenPosition()); + Vector2 origin = new Vector2(screenPos.x, screenPos.y); origin.x += WIDTH * 0.75f; if (origin.y < MatchController.getView().getHeight() / 2) { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java index 7bc15cbc18f..8640baee2b3 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java @@ -307,7 +307,7 @@ public abstract class VCardDisplayArea extends VDisplayArea { //don't show targeting arrow unless in display area that's visible if (displayArea == null || !displayArea.isVisible()) { return null; } - Vector2 origin = new Vector2(getScreenPosition()); + Vector2 origin = new Vector2(screenPos.x, screenPos.y); float left = PADDING; float top = PADDING; diff --git a/forge-gui-mobile/src/forge/screens/match/views/VLog.java b/forge-gui-mobile/src/forge/screens/match/views/VLog.java index e6561447919..6b32a3f236b 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VLog.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VLog.java @@ -48,7 +48,7 @@ public class VLog extends FDropDown { List logEntrys = MatchUtil.getGameView().getLogEntries(logVerbosityFilter); LogEntryDisplay logEntryDisplay; - float width = maxWidth - getMenuTab().getScreenPosition().x; //stretch from tab to edge of screen + float width = maxWidth - getMenuTab().screenPos.x; //stretch from tab to edge of screen float minWidth = 4 * Utils.AVG_FINGER_WIDTH; if (width < minWidth) { width = minWidth; diff --git a/forge-gui-mobile/src/forge/screens/match/views/VStack.java b/forge-gui-mobile/src/forge/screens/match/views/VStack.java index 33423fb10d1..078139e60b0 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VStack.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VStack.java @@ -179,7 +179,7 @@ public class VStack extends FDropDown { activeItem.getTop() + VStack.CARD_HEIGHT * FCardPanel.TARGET_ORIGIN_FACTOR_Y + VStack.PADDING + VStack.BORDER_THICKNESS); PlayerView activator = activeStackInstance.getActivatingPlayer(); - arrowOrigin = arrowOrigin.add(getScreenPosition()); + arrowOrigin = arrowOrigin.add(screenPos.x, screenPos.y); StackItemView instance = activeStackInstance; while (instance != null) { diff --git a/forge-gui-mobile/src/forge/toolbox/FContainer.java b/forge-gui-mobile/src/forge/toolbox/FContainer.java index 272b827fb56..9453ddbf1a1 100644 --- a/forge-gui-mobile/src/forge/toolbox/FContainer.java +++ b/forge-gui-mobile/src/forge/toolbox/FContainer.java @@ -107,7 +107,7 @@ public abstract class FContainer extends FDisplayObject { @Override public void buildTouchListeners(float screenX, float screenY, ArrayList listeners) { - if (isEnabled() && contains(getLeft() + screenToLocalX(screenX), getTop() + screenToLocalY(screenY))) { + if (isEnabled() && isVisible() && screenPos.contains(screenX, screenY)) { for (int i = children.size() - 1; i >= 0; i--) { children.get(i).buildTouchListeners(screenX, screenY, listeners); } diff --git a/forge-gui-mobile/src/forge/toolbox/FDisplayObject.java b/forge-gui-mobile/src/forge/toolbox/FDisplayObject.java index 3c925692e3d..15b0b904d29 100644 --- a/forge-gui-mobile/src/forge/toolbox/FDisplayObject.java +++ b/forge-gui-mobile/src/forge/toolbox/FDisplayObject.java @@ -3,8 +3,6 @@ package forge.toolbox; import java.util.ArrayList; import com.badlogic.gdx.math.Rectangle; -import com.badlogic.gdx.math.Vector2; - import forge.Graphics; public abstract class FDisplayObject { @@ -15,7 +13,7 @@ public abstract class FDisplayObject { private boolean rotate90 = false; private boolean rotate180 = false; private final Rectangle bounds = new Rectangle(); - private final Vector2 screenPosition = new Vector2(); + public final Rectangle screenPos = new Rectangle(); public void setPosition(float x, float y) { bounds.setPosition(x, y); @@ -60,24 +58,17 @@ public abstract class FDisplayObject { return visible && bounds.contains(x, y); } - public Vector2 getScreenPosition() { - return screenPosition; - } - public void setScreenPosition(float x, float y) { //only call from Graphics when drawn - screenPosition.set(x, y); - } - public float screenToLocalX(float x) { - return x - screenPosition.x; + return x - screenPos.x; } public float screenToLocalY(float y) { - return y - screenPosition.y; + return y - screenPos.y; } public float localToScreenX(float x) { - return x + screenPosition.x; + return x + screenPos.x; } public float localToScreenY(float y) { - return y + screenPosition.y; + return y + screenPos.y; } public boolean isEnabled() { @@ -119,7 +110,7 @@ public abstract class FDisplayObject { public abstract void draw(Graphics g); public void buildTouchListeners(float screenX, float screenY, ArrayList listeners) { - if (enabled && contains(getLeft() + screenToLocalX(screenX), getTop() + screenToLocalY(screenY))) { + if (enabled && visible && screenPos.contains(screenX, screenY)) { listeners.add(this); } }