From 4eb8a9be260508efc50e9e8b3eb72188b76826b0 Mon Sep 17 00:00:00 2001 From: Jagged Date: Thu, 15 Mar 2018 09:16:19 +0000 Subject: [PATCH 1/4] First step - restore old ZOrder Comparator --- .../java/net/rptools/maptool/model/Zone.java | 35 +++++++++---------- .../maptool/server/ServerMethodHandler.java | 4 +-- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/maptool/src/main/java/net/rptools/maptool/model/Zone.java b/maptool/src/main/java/net/rptools/maptool/model/Zone.java index 2895ebe109..f4b63e09b6 100644 --- a/maptool/src/main/java/net/rptools/maptool/model/Zone.java +++ b/maptool/src/main/java/net/rptools/maptool/model/Zone.java @@ -1111,7 +1111,7 @@ public void putToken(Token token) { // LATER: optimize this tokenOrderedList.remove(token); tokenOrderedList.add(token); - Collections.sort(tokenOrderedList, getZOrderComparator()); + Collections.sort(tokenOrderedList, TOKEN_Z_ORDER_COMPARATOR); if (newToken) { fireModelChangeEvent(new ModelChangeEvent(this, Event.TOKEN_ADDED, token)); @@ -1151,7 +1151,7 @@ public void putTokens(List tokens) { } tokenOrderedList.removeAll(tokens); tokenOrderedList.addAll(tokens); - Collections.sort(tokenOrderedList, getZOrderComparator()); + Collections.sort(tokenOrderedList, TOKEN_Z_ORDER_COMPARATOR); if (!addedTokens.isEmpty()) fireModelChangeEvent(new ModelChangeEvent(this, Event.TOKEN_ADDED, addedTokens)); @@ -1536,7 +1536,6 @@ public static interface Filter { public boolean matchToken(Token t); } - @Deprecated public static final Comparator TOKEN_Z_ORDER_COMPARATOR = new TokenZOrderComparator(); public static class TokenZOrderComparator implements Comparator { @@ -1554,10 +1553,10 @@ public int compare(Token o1, Token o2) { } /** - * Need to replace static TOKEN_Z_ORDER_COMPARATOR comparator with instantiated version so that grid is available - * and can access token footprint + * Replaces the static TOKEN_Z_ORDER_COMPARATOR comparator with instantiated version so that grid is available + * and can access token footprint. Only used when Rendering just Figure Tokens. **/ - public Comparator getZOrderComparator() { + public Comparator getFigureZOrderComparator() { return new Comparator() { @Override public int compare(Token o1, Token o2) { @@ -1565,19 +1564,17 @@ public int compare(Token o1, Token o2) { * If either token is a figure, get the footprint and find the lowest point but if the same, * return the smallest, else use normal z order */ - if (o1.getShape() == Token.TokenShape.FIGURE || o2.getShape() == Token.TokenShape.FIGURE) { - int v1 = getFigureZOrder(o1); - int v2 = getFigureZOrder(o2); - if ((v1 - v2) != 0) - return v1 - v2; - if (o1.isStamp() && o2.isToken()) - return -1; - if (o2.isStamp() && o1.isToken()) - return +1; - if (o1.getHeight() != o2.getHeight()) { - // Larger tokens at the same position, go behind - return o2.getHeight() - o1.getHeight(); - } + int v1 = getFigureZOrder(o1); + int v2 = getFigureZOrder(o2); + if ((v1 - v2) != 0) + return v1 - v2; + if (o1.isStamp() && o2.isToken()) + return -1; + if (o2.isStamp() && o1.isToken()) + return +1; + if (o1.getHeight() != o2.getHeight()) { + // Larger tokens at the same position, go behind + return o2.getHeight() - o1.getHeight(); } int lval = o1.getZOrder(); int rval = o2.getZOrder(); diff --git a/maptool/src/main/java/net/rptools/maptool/server/ServerMethodHandler.java b/maptool/src/main/java/net/rptools/maptool/server/ServerMethodHandler.java index 9e14367569..f2aaeb4d40 100644 --- a/maptool/src/main/java/net/rptools/maptool/server/ServerMethodHandler.java +++ b/maptool/src/main/java/net/rptools/maptool/server/ServerMethodHandler.java @@ -282,7 +282,7 @@ public void bringTokensToFront(GUID zoneGUID, Set tokenSet) { } } // Arrange - Collections.sort(tokenList, zone.getZOrderComparator()); + Collections.sort(tokenList, Zone.TOKEN_Z_ORDER_COMPARATOR); // Update int z = zone.getLargestZOrder() + 1; @@ -487,7 +487,7 @@ public void sendTokensToBack(GUID zoneGUID, Set tokenSet) { } } // Arrange - Collections.sort(tokenList, zone.getZOrderComparator()); + Collections.sort(tokenList, Zone.TOKEN_Z_ORDER_COMPARATOR); // Update int z = zone.getSmallestZOrder() - 1; From 8e7275de96a5b23828105ab3b7c2ea5edced0da3 Mon Sep 17 00:00:00 2001 From: Jagged Date: Thu, 15 Mar 2018 09:32:18 +0000 Subject: [PATCH 2/4] Second step - change zone render to use alternative comparator when rendering just figure tokens. --- .../net/rptools/maptool/client/ui/zone/ZoneRenderer.java | 5 ++++- maptool/src/main/java/net/rptools/maptool/model/Zone.java | 8 ++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/maptool/src/main/java/net/rptools/maptool/client/ui/zone/ZoneRenderer.java b/maptool/src/main/java/net/rptools/maptool/client/ui/zone/ZoneRenderer.java index 4452434556..a3d5e29226 100644 --- a/maptool/src/main/java/net/rptools/maptool/client/ui/zone/ZoneRenderer.java +++ b/maptool/src/main/java/net/rptools/maptool/client/ui/zone/ZoneRenderer.java @@ -1225,10 +1225,13 @@ public void renderZone(Graphics2D g2d, PlayerView view) { } // if there is fog or vision we may need to re-render figure type tokens + // and figure tokens need sorting via alternative logic. List tokens = zone.getFigureTokens(); + List sortedTokens = new ArrayList(tokens); + Collections.sort(sortedTokens, zone.getFigureZOrderComparator()); if (!tokens.isEmpty()) { timer.start("tokens - figures"); - renderTokens(g2d, tokens, view, true); + renderTokens(g2d, sortedTokens, view, true); timer.stop("tokens - figures"); } diff --git a/maptool/src/main/java/net/rptools/maptool/model/Zone.java b/maptool/src/main/java/net/rptools/maptool/model/Zone.java index f4b63e09b6..d5128379b1 100644 --- a/maptool/src/main/java/net/rptools/maptool/model/Zone.java +++ b/maptool/src/main/java/net/rptools/maptool/model/Zone.java @@ -1561,8 +1561,12 @@ public Comparator getFigureZOrderComparator() { @Override public int compare(Token o1, Token o2) { /** - * If either token is a figure, get the footprint and find the lowest point but if the same, - * return the smallest, else use normal z order + * It is an assumption of this comparator that all tokens are being sorted using isometric logic. + * + * Get the footprint (dependent on Grid) and find the centre of the footprint. + * If the same, place tokens above objects. + * Otherwise use height to place the smallest in front. + * If still equal use normal z order. */ int v1 = getFigureZOrder(o1); int v2 = getFigureZOrder(o2); From 8ec8a8bdbd45c6aeb5e911599cc82e9996013039 Mon Sep 17 00:00:00 2001 From: David Rawlins Date: Thu, 15 Mar 2018 21:58:39 +0000 Subject: [PATCH 3/4] God knows what spotless is complaining about with this one :/ --- .../java/net/rptools/maptool/client/ui/zone/ZoneRenderer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maptool/src/main/java/net/rptools/maptool/client/ui/zone/ZoneRenderer.java b/maptool/src/main/java/net/rptools/maptool/client/ui/zone/ZoneRenderer.java index a3d5e29226..5e3ead895b 100644 --- a/maptool/src/main/java/net/rptools/maptool/client/ui/zone/ZoneRenderer.java +++ b/maptool/src/main/java/net/rptools/maptool/client/ui/zone/ZoneRenderer.java @@ -1228,7 +1228,7 @@ public void renderZone(Graphics2D g2d, PlayerView view) { // and figure tokens need sorting via alternative logic. List tokens = zone.getFigureTokens(); List sortedTokens = new ArrayList(tokens); - Collections.sort(sortedTokens, zone.getFigureZOrderComparator()); + Collections.sort(sortedTokens, zone.getFigureZOrderComparator()); if (!tokens.isEmpty()) { timer.start("tokens - figures"); renderTokens(g2d, sortedTokens, view, true); From 074e033528bded0dcba5de5749895d7769e55595 Mon Sep 17 00:00:00 2001 From: David Rawlins Date: Sat, 17 Mar 2018 15:00:57 +0000 Subject: [PATCH 4/4] Change object.isStamp() to !object.isToken() --- maptool/src/main/java/net/rptools/maptool/model/Zone.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maptool/src/main/java/net/rptools/maptool/model/Zone.java b/maptool/src/main/java/net/rptools/maptool/model/Zone.java index d5128379b1..a9626608a3 100644 --- a/maptool/src/main/java/net/rptools/maptool/model/Zone.java +++ b/maptool/src/main/java/net/rptools/maptool/model/Zone.java @@ -1572,9 +1572,9 @@ public int compare(Token o1, Token o2) { int v2 = getFigureZOrder(o2); if ((v1 - v2) != 0) return v1 - v2; - if (o1.isStamp() && o2.isToken()) + if (!o1.isToken() && o2.isToken()) return -1; - if (o2.isStamp() && o1.isToken()) + if (!o2.isToken() && o1.isToken()) return +1; if (o1.getHeight() != o2.getHeight()) { // Larger tokens at the same position, go behind