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..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 @@ -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 2895ebe109..a9626608a3 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,30 +1553,32 @@ 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) { /** - * 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. */ - 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.isToken() && o2.isToken()) + return -1; + if (!o2.isToken() && 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;