diff --git a/vtm/src/org/oscim/layers/tile/MapTile.java b/vtm/src/org/oscim/layers/tile/MapTile.java index a4ce0a40..b353ef7a 100644 --- a/vtm/src/org/oscim/layers/tile/MapTile.java +++ b/vtm/src/org/oscim/layers/tile/MapTile.java @@ -20,6 +20,7 @@ import org.oscim.core.Tile; import org.oscim.renderer.elements.ElementLayers; import org.oscim.renderer.elements.SymbolItem; import org.oscim.renderer.elements.TextItem; +import org.oscim.utils.pool.Inlist; import org.oscim.utils.pool.Inlist.List; import org.oscim.utils.quadtree.Node; @@ -63,6 +64,10 @@ public class MapTile extends Tile { public final static byte CANCEL = 1 << 3; } + public static abstract class TileData extends Inlist { + protected abstract void dispose(); + } + public MapTile(TileNode node, int tileX, int tileY, int zoomLevel) { super(tileX, tileY, (byte) zoomLevel); this.x = (double) tileX / (1 << zoomLevel); @@ -99,7 +104,7 @@ public class MapTile extends Tile { public final List symbols = new List(); public final List labels = new List(); - public ElementLayers layers; + public TileData data; /** * Tile is in view region. Set by TileRenderer. @@ -219,9 +224,9 @@ public class MapTile extends Tile { * CAUTION: This function may only be called by {@link TileManager} */ protected void clear() { - if (layers != null) { - layers.clear(); - layers = null; + while (data != null) { + data.dispose(); + data = data.next; } TextItem.pool.releaseAll(labels.clear()); @@ -230,4 +235,11 @@ public class MapTile extends Tile { // still needed? state = State.NONE; } + + public ElementLayers getLayers() { + if (!(data instanceof ElementLayers)) + return null; + + return (ElementLayers) data; + } } diff --git a/vtm/src/org/oscim/layers/tile/TileRenderer.java b/vtm/src/org/oscim/layers/tile/TileRenderer.java index c81dd1dd..defb2634 100644 --- a/vtm/src/org/oscim/layers/tile/TileRenderer.java +++ b/vtm/src/org/oscim/layers/tile/TileRenderer.java @@ -26,6 +26,7 @@ import org.oscim.renderer.ElementRenderer; import org.oscim.renderer.GLViewport; import org.oscim.renderer.LayerRenderer; import org.oscim.renderer.MapRenderer; +import org.oscim.renderer.elements.ElementLayers; import org.oscim.utils.ScanBox; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -186,24 +187,25 @@ public abstract class TileRenderer extends LayerRenderer { private static int uploadTileData(MapTile tile) { tile.state = READY; + ElementLayers layers = tile.getLayers(); /* tile might contain extrusion or label layers */ - if (tile.layers == null) + if (layers == null) return 1; - int newSize = tile.layers.getSize(); + int newSize = layers.getSize(); if (newSize <= 0) return 1; - if (tile.layers.vbo == null) - tile.layers.vbo = BufferObject.get(GL20.GL_ARRAY_BUFFER, newSize); + if (layers.vbo == null) + layers.vbo = BufferObject.get(GL20.GL_ARRAY_BUFFER, newSize); - if (!ElementRenderer.uploadLayers(tile.layers, newSize, true)) { + if (!ElementRenderer.uploadLayers(layers, newSize, true)) { log.error("{} uploadTileData failed!", tile); - - tile.layers.vbo = BufferObject.release(tile.layers.vbo); - tile.layers.clear(); - tile.layers = null; + layers.vbo = BufferObject.release(layers.vbo); + layers.clear(); + /* throw Exception? */ + //FIXME tile.layers = null; return 0; } diff --git a/vtm/src/org/oscim/layers/tile/VectorTileRenderer.java b/vtm/src/org/oscim/layers/tile/VectorTileRenderer.java index e88a8f02..6dec218b 100644 --- a/vtm/src/org/oscim/layers/tile/VectorTileRenderer.java +++ b/vtm/src/org/oscim/layers/tile/VectorTileRenderer.java @@ -16,6 +16,7 @@ import org.oscim.renderer.GLMatrix; import org.oscim.renderer.GLViewport; import org.oscim.renderer.MapRenderer; import org.oscim.renderer.elements.BitmapLayer; +import org.oscim.renderer.elements.ElementLayers; import org.oscim.renderer.elements.LineLayer; import org.oscim.renderer.elements.LineTexLayer; import org.oscim.renderer.elements.MeshLayer; @@ -113,11 +114,13 @@ public class VectorTileRenderer extends TileRenderer { /* use holder proxy when it is set */ MapTile t = tile.holder == null ? tile : tile.holder; - if (t.layers == null || t.layers.vbo == null) + ElementLayers layers = t.getLayers(); + + if (layers == null || layers.vbo == null) //throw new IllegalStateException(t + "no data " + (t.layers == null)); return; - t.layers.vbo.bind(); + layers.vbo.bind(); MapPosition pos = v.pos; /* place tile relative to map position */ int z = tile.zoomLevel; @@ -134,7 +137,8 @@ public class VectorTileRenderer extends TileRenderer { boolean clipped = false; int mode = mClipMode; - RenderElement l = t.layers.getBaseLayers(); + + RenderElement l = layers.getBaseLayers(); while (l != null) { if (l.type == POLYGON) { @@ -148,11 +152,11 @@ public class VectorTileRenderer extends TileRenderer { clipped = true; } if (l.type == LINE) { - l = LineLayer.Renderer.draw(l, v, scale, t.layers); + l = LineLayer.Renderer.draw(l, v, scale, layers); continue; } if (l.type == TEXLINE) { - l = LineTexLayer.Renderer.draw(l, v, div, t.layers); + l = LineTexLayer.Renderer.draw(l, v, div, layers); continue; } if (l.type == MESH) { @@ -163,7 +167,7 @@ public class VectorTileRenderer extends TileRenderer { l = l.next; } - l = t.layers.getTextureLayers(); + l = layers.getTextureLayers(); while (l != null) { if (!clipped) { PolygonLayer.Renderer.draw(null, v, div, true, mode); diff --git a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java index 2800bc5c..c5fd9c5e 100644 --- a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java @@ -64,8 +64,9 @@ public class BitmapTileLoader extends TileLoader { BitmapLayer l = new BitmapLayer(false); l.setBitmap(bitmap, Tile.SIZE, Tile.SIZE); - mTile.layers = new ElementLayers(); - mTile.layers.setTextureLayers(l); + ElementLayers layers = new ElementLayers(); + layers.setTextureLayers(l); + mTile.data = layers; } @Override diff --git a/vtm/src/org/oscim/layers/tile/example/TestTileLayer.java b/vtm/src/org/oscim/layers/tile/example/TestTileLayer.java index 336f3f03..00a3d359 100644 --- a/vtm/src/org/oscim/layers/tile/example/TestTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/example/TestTileLayer.java @@ -57,9 +57,10 @@ public class TestTileLayer extends TileLayer { @Override public boolean loadTile(MapTile tile) { log.debug("load tile " + tile); - tile.layers = new ElementLayers(); + ElementLayers layers = new ElementLayers(); + tile.data = layers; - LineLayer ll = tile.layers.getLineLayer(0); + LineLayer ll = layers.getLineLayer(0); ll.line = mLineStyle; ll.scale = 2; diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java index 12c39e0d..16db748c 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -76,6 +76,8 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac /** Line-scale-factor depending on zoom and latitude */ protected float mLineScale = 1.0f; + protected ElementLayers mLayers; + private final VectorTileLayer mTileLayer; public VectorTileLoader(VectorTileLayer tileLayer) { @@ -102,6 +104,8 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac return false; } + //mTileLayer.getLoaderHooks(); + /* account for area changes with latitude */ double lat = MercatorProjection.toLatitude(tile.y); mLineScale = (float) Math.pow(STROKE_INCREASE, tile.zoomLevel - STROKE_MIN_ZOOM); @@ -110,8 +114,8 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac /* scale line width relative to latitude + PI * thumb */ mLineScale *= 0.4f + 0.6f * ((float) Math.sin(Math.abs(lat) * (Math.PI / 180))); - - tile.layers = new ElementLayers(); + mLayers = new ElementLayers(); + tile.data = mLayers; try { /* query data source, which calls process() callback */ @@ -165,6 +169,10 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac * E.g. to replace tags that should not be cached in Rendertheme */ protected TagSet filterTags(TagSet tagSet) { + // if (filterHooks != null){ + // tagSet = + // } + return tagSet; } @@ -235,7 +243,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac return; } - LineLayer ll = mTile.layers.getLineLayer(numLayer); + LineLayer ll = mLayers.getLineLayer(numLayer); if (ll.line == null) { ll.line = line; @@ -253,7 +261,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac mCurLineLayer = ll; } else { - LineTexLayer ll = mTile.layers.getLineTexLayer(numLayer); + LineTexLayer ll = mLayers.getLineTexLayer(numLayer); if (ll.line == null) { ll.line = line; @@ -277,11 +285,11 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac public void renderArea(AreaStyle area, int level) { int numLayer = mCurLayer + level; if (USE_MESH_POLY) { - MeshLayer l = mTile.layers.getMeshLayer(numLayer); + MeshLayer l = mLayers.getMeshLayer(numLayer); l.area = area; l.addMesh(mElement); } else { - PolygonLayer l = mTile.layers.getPolygonLayer(numLayer); + PolygonLayer l = mLayers.getPolygonLayer(numLayer); l.area = area; l.addPolygon(mElement.points, mElement.index); } @@ -372,7 +380,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac if (v != null) minHeight = Integer.parseInt(v); - ExtrusionLayer l = mTile.layers.getExtrusionLayers(); + ExtrusionLayer l = mLayers.getExtrusionLayers(); if (l == null) { double lat = MercatorProjection.toLatitude(mTile.y); @@ -380,7 +388,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac .groundResolution(lat, 1 << mTile.zoomLevel); l = new ExtrusionLayer(0, groundScale, extrusion.colors); - mTile.layers.setExtrusionLayers(l); + mLayers.setExtrusionLayers(l); } /* 12m default */ diff --git a/vtm/src/org/oscim/renderer/ExtrusionRenderer.java b/vtm/src/org/oscim/renderer/ExtrusionRenderer.java index e1821b3b..d35b2b38 100644 --- a/vtm/src/org/oscim/renderer/ExtrusionRenderer.java +++ b/vtm/src/org/oscim/renderer/ExtrusionRenderer.java @@ -25,6 +25,7 @@ import org.oscim.core.Tile; import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.TileRenderer; import org.oscim.layers.tile.TileSet; +import org.oscim.renderer.elements.ElementLayers; import org.oscim.renderer.elements.ExtrusionLayer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -169,10 +170,11 @@ public class ExtrusionRenderer extends LayerRenderer { } private static ExtrusionLayer getLayer(MapTile t) { - if (t.layers == null || !t.state(READY | NEW_DATA)) + ElementLayers layers = t.getLayers(); + if (layers == null || !t.state(READY | NEW_DATA)) return null; - return t.layers.getExtrusionLayers(); + return layers.getExtrusionLayers(); } private final boolean debug = false; @@ -201,7 +203,7 @@ public class ExtrusionRenderer extends LayerRenderer { GLState.test(false, false); for (int i = 0; i < mTileCnt; i++) { - ExtrusionLayer el = tiles[i].layers.getExtrusionLayers(); + ExtrusionLayer el = tiles[i].getLayers().getExtrusionLayers(); setMatrix(v, tiles[i], 0); v.mvp.setAsUniform(uExtMatrix); @@ -252,7 +254,7 @@ public class ExtrusionRenderer extends LayerRenderer { // draw to depth buffer for (int i = 0; i < mTileCnt; i++) { MapTile t = tiles[i]; - ExtrusionLayer el = t.layers.getExtrusionLayers(); + ExtrusionLayer el = t.getLayers().getExtrusionLayers(); int d = MapRenderer.depthOffset(t) * 10; setMatrix(v, t, d); v.mvp.setAsUniform(uExtMatrix); @@ -278,7 +280,7 @@ public class ExtrusionRenderer extends LayerRenderer { for (int i = 0; i < mTileCnt; i++) { MapTile t = tiles[i]; - ExtrusionLayer el = t.layers.getExtrusionLayers(); + ExtrusionLayer el = t.getLayers().getExtrusionLayers(); if (el.colors == null) { currentColor = mColor; diff --git a/vtm/src/org/oscim/renderer/elements/ElementLayers.java b/vtm/src/org/oscim/renderer/elements/ElementLayers.java index 7671973a..cdcbe9ca 100644 --- a/vtm/src/org/oscim/renderer/elements/ElementLayers.java +++ b/vtm/src/org/oscim/renderer/elements/ElementLayers.java @@ -24,6 +24,7 @@ import static org.oscim.renderer.elements.RenderElement.TEXLINE; import java.nio.ShortBuffer; import org.oscim.backend.GL20; +import org.oscim.layers.tile.MapTile.TileData; import org.oscim.renderer.BufferObject; import org.oscim.theme.styles.AreaStyle; import org.oscim.theme.styles.LineStyle; @@ -35,7 +36,7 @@ import org.slf4j.LoggerFactory; * MapTile. It can be used for other purposes as well but some optimizations * (and limitations) probably wont make sense in different contexts. */ -public class ElementLayers { +public class ElementLayers extends TileData { static final Logger log = LoggerFactory.getLogger(ElementLayers.class); public static void initRenderer(GL20 gl) { @@ -386,4 +387,9 @@ public class ElementLayers { vbo = BufferObject.release(vbo); } + @Override + protected void dispose() { + clear(); + } + }