diff --git a/vtm/src/org/oscim/layers/tile/TileRenderer.java b/vtm/src/org/oscim/layers/tile/TileRenderer.java index 8e948511..bb631aa2 100644 --- a/vtm/src/org/oscim/layers/tile/TileRenderer.java +++ b/vtm/src/org/oscim/layers/tile/TileRenderer.java @@ -349,31 +349,41 @@ public abstract class TileRenderer extends LayerRenderer { } }; - protected long getMinFade(MapTile t) { + protected long getMinFade(MapTile t, int proxyLevel) { long minFade = MapRenderer.frametime - 50; + if (proxyLevel <= 0) { + for (int c = 0; c < 4; c++) { + MapTile ci = t.node.child(c); + if (ci == null) + continue; - for (int c = 0; c < 4; c++) { - MapTile ci = t.node.child(c); - if (ci == null) - continue; + if (ci.fadeTime > 0 && ci.fadeTime < minFade) + minFade = ci.fadeTime; - if (ci.state == READY || ci.fadeTime > 0) - minFade = Math.min(minFade, ci.fadeTime); + /* when drawing the parent of the current level + * we also check if the children of current level + * are visible */ + if (proxyLevel > -2) { + long m = getMinFade(ci, proxyLevel - 1); + if (m < minFade) + minFade = m; + } + } } - MapTile p = t.node.parent(); - - if (p == null) - return minFade; - if (p.state == READY || p.fadeTime > 0) - minFade = Math.min(minFade, p.fadeTime); - - p = p.node.parent(); - if (p == null) - return minFade; - - if (p.state == READY || p.fadeTime > 0) - minFade = Math.min(minFade, p.fadeTime); + if (proxyLevel >= -1) { + MapTile p = t.node.parent(); + if (p != null) { + if (p.fadeTime > 0 && p.fadeTime < minFade) + minFade = p.fadeTime; + if (proxyLevel >= 0) { + if ((p = p.node.parent()) != null) { + if (p.fadeTime > 0 && p.fadeTime < minFade) + minFade = p.fadeTime; + } + } + } + } return minFade; } } diff --git a/vtm/src/org/oscim/layers/tile/VectorTileRenderer.java b/vtm/src/org/oscim/layers/tile/VectorTileRenderer.java index 48f95ce9..c9ee7c2a 100644 --- a/vtm/src/org/oscim/layers/tile/VectorTileRenderer.java +++ b/vtm/src/org/oscim/layers/tile/VectorTileRenderer.java @@ -70,7 +70,7 @@ public class VectorTileRenderer extends TileRenderer { for (int i = 0; i < tileCnt; i++) { MapTile t = tiles[i]; if (t.isVisible && t.state == READY) - drawTile(t, v); + drawTile(t, v, 0); } @@ -111,7 +111,7 @@ public class VectorTileRenderer extends TileRenderer { } - private void drawTile(MapTile tile, GLViewport v) { + private void drawTile(MapTile tile, GLViewport v, int proxyLevel) { /* ensure to draw parents only once */ if (tile.lastDraw == mDrawSerial) return; @@ -188,7 +188,7 @@ public class VectorTileRenderer extends TileRenderer { } if (t.fadeTime == 0) - t.fadeTime = getMinFade(t); + t.fadeTime = getMinFade(t, proxyLevel); if (debugOverdraw) { if (t.zoomLevel > pos.zoomLevel) @@ -219,7 +219,7 @@ public class VectorTileRenderer extends TileRenderer { MapTile c = tile.node.child(i); if (c.state == READY) { - drawTile(c, v); + drawTile(c, v, 1); drawn++; } } @@ -243,7 +243,7 @@ public class VectorTileRenderer extends TileRenderer { proxy = r.parent.item; if (proxy.state == READY) { //log.debug("1. draw parent " + proxy); - drawTile(proxy, v); + drawTile(proxy, v, -1); } } } else if ((tile.proxies & MapTile.PROXY_GRAMPA) != 0) { @@ -256,7 +256,7 @@ public class VectorTileRenderer extends TileRenderer { proxy = r.parent.parent.item; if (proxy.state == READY) - drawTile(proxy, v); + drawTile(proxy, v, -2); } } else { /* prefer drawing parent */ @@ -265,7 +265,7 @@ public class VectorTileRenderer extends TileRenderer { proxy = r.parent.item; if (proxy != null && proxy.state == READY) { //log.debug("2. draw parent " + proxy); - drawTile(proxy, v); + drawTile(proxy, v, -1); return; } @@ -285,7 +285,7 @@ public class VectorTileRenderer extends TileRenderer { proxy = r.parent.parent.item; if (proxy.state == READY) - drawTile(proxy, v); + drawTile(proxy, v, -2); } } }