From d00e9771e05b097ad38920c3b3f09af501d2060b Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 9 Mar 2014 17:01:11 +0100 Subject: [PATCH 01/13] move TagFilter stuff to OsmTileLayer --- .../layers/tile/vector/OsmTileLayer.java | 6 ++- .../layers/tile/vector/VectorTileLoader.java | 46 +++++++------------ 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/vtm/src/org/oscim/layers/tile/vector/OsmTileLayer.java b/vtm/src/org/oscim/layers/tile/vector/OsmTileLayer.java index e23a5798..2fccb955 100644 --- a/vtm/src/org/oscim/layers/tile/vector/OsmTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/OsmTileLayer.java @@ -22,9 +22,11 @@ public class OsmTileLayer extends VectorTileLayer { } static class OsmTileLoader extends VectorTileLoader { + private final TagSet mFilteredTags; public OsmTileLoader(TileManager tileManager) { super(tileManager); + mFilteredTags = new TagSet(); } /* Replace tags that should only be matched by key in RenderTheme @@ -40,7 +42,7 @@ public class OsmTileLayer extends VectorTileLayer { new TagReplacement(Tag.KEY_MIN_HEIGHT) }; - protected boolean filterTags(TagSet tagSet) { + protected TagSet filterTags(TagSet tagSet) { Tag[] tags = tagSet.tags; mFilteredTags.clear(); @@ -58,7 +60,7 @@ public class OsmTileLayer extends VectorTileLayer { mFilteredTags.add(t); } - return true; + return mFilteredTags; } } } diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java index e2549e14..372a329c 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -79,8 +79,6 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac /** Line-scale-factor depending on zoom and latitude */ protected float mLineScale = 1.0f; - protected final TagSet mFilteredTags; - public void setRenderTheme(IRenderTheme theme) { renderTheme = theme; renderLevels = theme.getLevels(); @@ -88,8 +86,6 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac public VectorTileLoader(TileManager tileManager) { super(tileManager); - - mFilteredTags = new TagSet(); } @Override @@ -151,11 +147,11 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac } } - public void setDataSource(ITileDataSource mapDatabase) { + public void setDataSource(ITileDataSource dataSource) { if (mTileDataSource != null) mTileDataSource.destroy(); - mTileDataSource = mapDatabase; + mTileDataSource = dataSource; } static class TagReplacement { @@ -171,17 +167,14 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac /** * Override this method to change tags that should be passed * to {@link RenderTheme} matching. + * E.g. to replace tags that should not be cached in Rendertheme */ - protected boolean filterTags(TagSet tagSet) { - mFilteredTags.clear(); - for (int i = 0; i < tagSet.numTags; i++) - mFilteredTags.add(tagSet.tags[i]); - return true; + protected TagSet filterTags(TagSet tagSet) { + return tagSet; } @Override public void process(MapElement element) { - clearState(); if (isCanceled() || mTile.state(CANCEL)) throw new CancellationException(); @@ -189,28 +182,20 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac mElement = element; if (element.type == GeometryType.POINT) { - // remove tags that should not be cached in Rendertheme - filterTags(element.tags); + TagSet tags = filterTags(element.tags); - // get and apply render instructions - renderNode(renderTheme.matchElement(element.type, mFilteredTags, mTile.zoomLevel)); + /* get and apply render instructions */ + renderNode(renderTheme.matchElement(element.type, tags, mTile.zoomLevel)); } else { - - // replace tags that should not be cached in Rendertheme (e.g. name) - if (!filterTags(element.tags)) - return; + TagSet tags = filterTags(element.tags); mCurLayer = getValidLayer(element.layer) * renderLevels; - // get and apply render instructions - renderWay(renderTheme.matchElement(element.type, mFilteredTags, mTile.zoomLevel)); + /* get and apply render instructions */ + renderWay(renderTheme.matchElement(element.type, tags, mTile.zoomLevel)); - //boolean closed = element.type == GeometryType.POLY; - - mCurLineLayer = null; } - - mElement = null; + clearState(); } //protected void debugUnmatched(boolean closed, TagSet tags) { @@ -243,6 +228,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac protected void clearState() { mCurLineLayer = null; + mElement = null; } /*** RenderThemeCallback ***/ @@ -271,7 +257,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac ll.addLine(mElement); - // NB: keep reference for outline layer(s) + /* keep reference for outline layer(s) */ mCurLineLayer = ll; } else { @@ -291,8 +277,8 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac } } - // slower to load (requires tesselation) and uses - // more memory but should be faster to render + /* slower to load (requires tesselation) and uses + * more memory but should be faster to render */ protected final static boolean USE_MESH_POLY = false; @Override From ff01b3f80dadef48017459f771643529b029f24a Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 9 Mar 2014 18:06:57 +0100 Subject: [PATCH 02/13] refactor: TileLoader.createLoader() --- vtm-jeo/src/org/oscim/layers/JeoTileLayer.java | 5 ++--- vtm/src/org/oscim/layers/tile/TileLayer.java | 8 ++++++-- .../oscim/layers/tile/bitmap/BitmapTileLayer.java | 4 ++-- .../oscim/layers/tile/example/TestTileLayer.java | 8 ++++---- .../org/oscim/layers/tile/vector/OsmTileLayer.java | 9 ++++----- .../oscim/layers/tile/vector/VectorTileLayer.java | 6 ++---- .../oscim/layers/tile/vector/VectorTileLoader.java | 13 ++++--------- 7 files changed, 24 insertions(+), 29 deletions(-) diff --git a/vtm-jeo/src/org/oscim/layers/JeoTileLayer.java b/vtm-jeo/src/org/oscim/layers/JeoTileLayer.java index 31831d16..e436b8b1 100644 --- a/vtm-jeo/src/org/oscim/layers/JeoTileLayer.java +++ b/vtm-jeo/src/org/oscim/layers/JeoTileLayer.java @@ -2,7 +2,6 @@ package org.oscim.layers; import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.TileLoader; -import org.oscim.layers.tile.TileManager; import org.oscim.layers.tile.bitmap.BitmapTileLayer; import org.oscim.map.Map; import org.oscim.tiling.source.bitmap.BitmapTileSource; @@ -14,8 +13,8 @@ public class JeoTileLayer extends BitmapTileLayer { } @Override - protected TileLoader createLoader(TileManager tm) { - return new TileLoader(tm) { + protected TileLoader createLoader() { + return new TileLoader(this.getManager()) { @Override public void cleanup() { diff --git a/vtm/src/org/oscim/layers/tile/TileLayer.java b/vtm/src/org/oscim/layers/tile/TileLayer.java index 45967568..4dfa8299 100644 --- a/vtm/src/org/oscim/layers/tile/TileLayer.java +++ b/vtm/src/org/oscim/layers/tile/TileLayer.java @@ -45,7 +45,7 @@ public abstract class TileLayer extends Layer implements UpdateListener { } - abstract protected TileLoader createLoader(TileManager tm); + abstract protected TileLoader createLoader(); public TileRenderer tileRenderer() { return (TileRenderer) mRenderer; @@ -55,7 +55,7 @@ public abstract class TileLayer extends Layer implements UpdateListener { mTileLoader = new TileLoader[numLoaders]; for (int i = 0; i < numLoaders; i++) { - mTileLoader[i] = createLoader(mTileManager); + mTileLoader[i] = createLoader(); mTileLoader[i].start(); } } @@ -111,4 +111,8 @@ public abstract class TileLayer extends Layer implements UpdateListener { for (TileLoader loader : mTileLoader) loader.proceed(); } + + public TileManager getManager() { + return mTileManager; + } } diff --git a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java index 39468cbe..c6daf19d 100644 --- a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java @@ -99,7 +99,7 @@ public class BitmapTileLayer extends TileLayer { } @Override - protected TileLoader createLoader(TileManager tm) { - return new BitmapTileLoader(tm, mTileSource); + protected TileLoader createLoader() { + return new BitmapTileLoader(this.getManager(), mTileSource); } } diff --git a/vtm/src/org/oscim/layers/tile/example/TestTileLayer.java b/vtm/src/org/oscim/layers/tile/example/TestTileLayer.java index 154bc7da..336f3f03 100644 --- a/vtm/src/org/oscim/layers/tile/example/TestTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/example/TestTileLayer.java @@ -42,13 +42,13 @@ public class TestTileLayer extends TileLayer { } @Override - protected TestTileLoader createLoader(TileManager tm) { - return new TestTileLoader(tm); + protected TestTileLoader createLoader() { + return new TestTileLoader(this); } static class TestTileLoader extends TileLoader { - public TestTileLoader(TileManager tileManager) { - super(tileManager); + public TestTileLoader(TileLayer tileLayer) { + super(tileLayer.getManager()); } GeometryBuffer mGeom = new GeometryBuffer(128, 16); diff --git a/vtm/src/org/oscim/layers/tile/vector/OsmTileLayer.java b/vtm/src/org/oscim/layers/tile/vector/OsmTileLayer.java index 2fccb955..e65761bc 100644 --- a/vtm/src/org/oscim/layers/tile/vector/OsmTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/OsmTileLayer.java @@ -3,7 +3,6 @@ package org.oscim.layers.tile.vector; import org.oscim.core.Tag; import org.oscim.core.TagSet; import org.oscim.layers.tile.TileLoader; -import org.oscim.layers.tile.TileManager; import org.oscim.map.Map; public class OsmTileLayer extends VectorTileLayer { @@ -17,15 +16,15 @@ public class OsmTileLayer extends VectorTileLayer { } @Override - protected TileLoader createLoader(TileManager tm) { - return new OsmTileLoader(tm); + protected TileLoader createLoader() { + return new OsmTileLoader(this); } static class OsmTileLoader extends VectorTileLoader { private final TagSet mFilteredTags; - public OsmTileLoader(TileManager tileManager) { - super(tileManager); + public OsmTileLoader(VectorTileLayer tileLayer) { + super(tileLayer); mFilteredTags = new TagSet(); } diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java index c3f1bf13..7eaa08f6 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java @@ -58,8 +58,8 @@ public class VectorTileLayer extends TileLayer { } @Override - protected TileLoader createLoader(TileManager tm) { - return new VectorTileLoader(tm); + protected TileLoader createLoader() { + return new VectorTileLoader(this); } /** @@ -112,7 +112,5 @@ public class VectorTileLayer extends TileLayer { resumeLoaders(); } - public TileManager getManager() { - return mTileManager; } } diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java index 372a329c..957cd00c 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -20,7 +20,6 @@ import static org.oscim.layers.tile.MapTile.State.CANCEL; import java.util.concurrent.CancellationException; -import org.oscim.backend.canvas.Bitmap; import org.oscim.core.GeometryBuffer.GeometryType; import org.oscim.core.MapElement; import org.oscim.core.MercatorProjection; @@ -29,7 +28,6 @@ import org.oscim.core.Tag; import org.oscim.core.TagSet; import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.TileLoader; -import org.oscim.layers.tile.TileManager; import org.oscim.renderer.elements.ElementLayers; import org.oscim.renderer.elements.ExtrusionLayer; import org.oscim.renderer.elements.LineLayer; @@ -83,9 +81,11 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac renderTheme = theme; renderLevels = theme.getLevels(); } + private final VectorTileLayer mTileLayer; - public VectorTileLoader(TileManager tileManager) { - super(tileManager); + public VectorTileLoader(VectorTileLayer tileLayer) { + super(tileLayer.getManager()); + mTileLayer = tileLayer; } @Override @@ -397,9 +397,4 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac l.add(mElement, height, minHeight); } - - @Override - public void setTileImage(Bitmap bitmap) { - - } } From 3eba47b0bb2676fa20d6c060f621732bbc32952d Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 9 Mar 2014 18:09:26 +0100 Subject: [PATCH 03/13] get theme from VectorTileLayer, instead of setting it on Loader --- .../layers/tile/vector/VectorTileLayer.java | 15 ++++++++----- .../layers/tile/vector/VectorTileLoader.java | 22 ++++++------------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java index 7eaa08f6..74b6b48d 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java @@ -98,19 +98,24 @@ public class VectorTileLayer extends TileLayer { * Set {@link IRenderTheme} used by {@link TileLoader} */ public void setRenderTheme(IRenderTheme theme) { - // wait for loaders to finish all current jobs to - // not change theme instance hold by loader instance - // while running + /* wait for loaders to finish all current jobs to + * not change theme instance hold by loader instance + * while running */ pauseLoaders(true); mTileManager.clearJobs(); - for (TileLoader l : mTileLoader) - ((VectorTileLoader) l).setRenderTheme(theme); + mTheme = theme; + // for (TileLoader l : mTileLoader) + // ((VectorTileLoader) l).setRenderTheme(theme); tileRenderer().setOverdrawColor(theme.getMapBackground()); resumeLoaders(); } + private IRenderTheme mTheme; + + public IRenderTheme getTheme() { + return mTheme; } } diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java index 957cd00c..12c39e0d 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -60,7 +60,6 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac public static final byte STROKE_MAX_ZOOM = 17; protected IRenderTheme renderTheme; - protected int renderLevels; /** current TileDataSource used by this MapTileLoader */ protected ITileDataSource mTileDataSource; @@ -77,10 +76,6 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac /** Line-scale-factor depending on zoom and latitude */ protected float mLineScale = 1.0f; - public void setRenderTheme(IRenderTheme theme) { - renderTheme = theme; - renderLevels = theme.getLevels(); - } private final VectorTileLayer mTileLayer; public VectorTileLoader(VectorTileLayer tileLayer) { @@ -101,7 +96,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac log.error("no tile source is set"); return false; } - + renderTheme = mTileLayer.getTheme(); if (renderTheme == null) { log.error("no theme is set"); return false; @@ -179,21 +174,18 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac if (isCanceled() || mTile.state(CANCEL)) throw new CancellationException(); + TagSet tags = filterTags(element.tags); + if (tags == null) + return; + mElement = element; + /* get and apply render instructions */ if (element.type == GeometryType.POINT) { - TagSet tags = filterTags(element.tags); - - /* get and apply render instructions */ renderNode(renderTheme.matchElement(element.type, tags, mTile.zoomLevel)); } else { - TagSet tags = filterTags(element.tags); - - mCurLayer = getValidLayer(element.layer) * renderLevels; - - /* get and apply render instructions */ + mCurLayer = getValidLayer(element.layer) * renderTheme.getLevels(); renderWay(renderTheme.matchElement(element.type, tags, mTile.zoomLevel)); - } clearState(); } From 1f5efb9a33fdf1a0635f844ab8c864ca2e93105f Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 9 Mar 2014 18:11:07 +0100 Subject: [PATCH 04/13] refactor: MapTile hold generic TileData - Testing --- vtm/src/org/oscim/layers/tile/MapTile.java | 20 ++++++++++++---- .../org/oscim/layers/tile/TileRenderer.java | 20 +++++++++------- .../oscim/layers/tile/VectorTileRenderer.java | 16 ++++++++----- .../layers/tile/bitmap/BitmapTileLoader.java | 5 ++-- .../layers/tile/example/TestTileLayer.java | 5 ++-- .../layers/tile/vector/VectorTileLoader.java | 24 ++++++++++++------- .../org/oscim/renderer/ExtrusionRenderer.java | 12 ++++++---- .../renderer/elements/ElementLayers.java | 8 ++++++- 8 files changed, 73 insertions(+), 37 deletions(-) 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(); + } + } From 7b9f2ac6bd69c22d195d8f5a7e83c800563ac619 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 9 Mar 2014 19:06:12 +0100 Subject: [PATCH 05/13] start TileLoaderHook: - only create ExtrusionLayers when a BuildingLayer is attached --- .../layers/tile/vector/BuildingLayer.java | 50 ++++++++++++++++++- .../layers/tile/vector/VectorTileLayer.java | 24 +++++++++ .../layers/tile/vector/VectorTileLoader.java | 41 +++------------ 3 files changed, 81 insertions(+), 34 deletions(-) diff --git a/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java b/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java index 29ce4a60..d7058e8c 100644 --- a/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java @@ -16,19 +16,30 @@ */ package org.oscim.layers.tile.vector; +import org.oscim.core.MapElement; +import org.oscim.core.MercatorProjection; +import org.oscim.core.Tag; import org.oscim.layers.Layer; +import org.oscim.layers.tile.MapTile; +import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderHook; import org.oscim.map.Map; import org.oscim.renderer.ExtrusionRenderer; import org.oscim.renderer.GLViewport; +import org.oscim.renderer.elements.ElementLayers; +import org.oscim.renderer.elements.ExtrusionLayer; +import org.oscim.theme.styles.ExtrusionStyle; +import org.oscim.theme.styles.RenderStyle; import org.oscim.utils.FastMath; -public class BuildingLayer extends Layer { +public class BuildingLayer extends Layer implements TileLoaderHook { //static final Logger log = LoggerFactory.getLogger(BuildingOverlay.class); final ExtrusionRenderer mExtLayer; public BuildingLayer(Map map, VectorTileLayer tileLayer) { super(map); + tileLayer.addHook(this); + mExtLayer = new ExtrusionRenderer(tileLayer.tileRenderer()) { private long mStartTime; @@ -79,6 +90,43 @@ public class BuildingLayer extends Layer { private final static int MIN_ZOOM = 17; + @Override + public void render(MapTile tile, ElementLayers layers, MapElement element, + RenderStyle style, int level) { + + if (!(style instanceof ExtrusionStyle)) + return; + + ExtrusionStyle extrusion = (ExtrusionStyle) style; + + int height = 0; + int minHeight = 0; + + String v = element.tags.getValue(Tag.KEY_HEIGHT); + if (v != null) + height = Integer.parseInt(v); + v = element.tags.getValue(Tag.KEY_MIN_HEIGHT); + if (v != null) + minHeight = Integer.parseInt(v); + + ExtrusionLayer l = layers.getExtrusionLayers(); + + if (l == null) { + double lat = MercatorProjection.toLatitude(tile.y); + float groundScale = (float) MercatorProjection + .groundResolution(lat, 1 << tile.zoomLevel); + + l = new ExtrusionLayer(0, groundScale, extrusion.colors); + layers.setExtrusionLayers(l); + } + + /* 12m default */ + if (height == 0) + height = 12 * 100; + + l.add(element, height, minHeight); + } + //@Override //public boolean onTouchEvent(MotionEvent e) { // int action = e.getAction() & MotionEvent.ACTION_MASK; diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java index 74b6b48d..32ff4606 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java @@ -16,12 +16,16 @@ */ package org.oscim.layers.tile.vector; +import org.oscim.core.MapElement; +import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.TileLayer; import org.oscim.layers.tile.TileLoader; import org.oscim.layers.tile.TileManager; import org.oscim.layers.tile.VectorTileRenderer; import org.oscim.map.Map; +import org.oscim.renderer.elements.ElementLayers; import org.oscim.theme.IRenderTheme; +import org.oscim.theme.styles.RenderStyle; import org.oscim.tiling.TileSource; import org.oscim.tiling.TileSource.OpenResult; import org.slf4j.Logger; @@ -118,4 +122,24 @@ public class VectorTileLayer extends TileLayer { public IRenderTheme getTheme() { return mTheme; } + + public interface TileLoaderHook { + public void render(MapTile tile, ElementLayers layers, + MapElement element, RenderStyle style, int level); + } + + private TileLoaderHook[] mLoaderHooks = new TileLoaderHook[0]; + + public TileLoaderHook[] getLoaderHooks() { + return mLoaderHooks; + } + + public void addHook(TileLoaderHook h) { + int length = mLoaderHooks.length; + TileLoaderHook[] tmp = new TileLoaderHook[length + 1]; + System.arraycopy(mLoaderHooks, 0, tmp, 0, length); + tmp[length] = h; + mLoaderHooks = tmp; + } + } diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java index 16db748c..0c2cfa4e 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -1,5 +1,5 @@ /* - * Copyright 2012, 2013 Hannes Janetzek + * Copyright 2012-2014 Hannes Janetzek * * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * @@ -28,8 +28,8 @@ import org.oscim.core.Tag; import org.oscim.core.TagSet; import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.TileLoader; +import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderHook; import org.oscim.renderer.elements.ElementLayers; -import org.oscim.renderer.elements.ExtrusionLayer; import org.oscim.renderer.elements.LineLayer; import org.oscim.renderer.elements.LineTexLayer; import org.oscim.renderer.elements.MeshLayer; @@ -346,10 +346,6 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac } } - @Override - public void renderPointCircle(CircleStyle circle, int level) { - } - @Override public void renderPointSymbol(SymbolStyle symbol) { if (symbol.texture == null) @@ -364,37 +360,16 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac } } + public void renderExtrusion(ExtrusionStyle extrusion, int level) { + for (TileLoaderHook h : mTileLayer.getLoaderHooks()) + h.render(mTile, mLayers, mElement, extrusion, level); + } + @Override public void renderAreaSymbol(SymbolStyle symbol) { } @Override - public void renderExtrusion(ExtrusionStyle extrusion, int level) { - int height = 0; - int minHeight = 0; - - String v = mElement.tags.getValue(Tag.KEY_HEIGHT); - if (v != null) - height = Integer.parseInt(v); - v = mElement.tags.getValue(Tag.KEY_MIN_HEIGHT); - if (v != null) - minHeight = Integer.parseInt(v); - - ExtrusionLayer l = mLayers.getExtrusionLayers(); - - if (l == null) { - double lat = MercatorProjection.toLatitude(mTile.y); - float groundScale = (float) MercatorProjection - .groundResolution(lat, 1 << mTile.zoomLevel); - - l = new ExtrusionLayer(0, groundScale, extrusion.colors); - mLayers.setExtrusionLayers(l); - } - - /* 12m default */ - if (height == 0) - height = 12 * 100; - - l.add(mElement, height, minHeight); + public void renderPointCircle(CircleStyle circle, int level) { } } From a475aa6c22c33924f78f2abf4653a295862b975b Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 16 Mar 2014 15:29:55 +0100 Subject: [PATCH 06/13] use Object as ID for TileData --- vtm/src/org/oscim/layers/tile/MapTile.java | 40 ++++++++++++++++--- .../layers/tile/bitmap/BitmapTileLayer.java | 2 +- .../layers/tile/bitmap/BitmapTileLoader.java | 6 +-- .../layers/tile/example/TestTileLayer.java | 1 + .../renderer/elements/ElementLayers.java | 7 +++- 5 files changed, 46 insertions(+), 10 deletions(-) diff --git a/vtm/src/org/oscim/layers/tile/MapTile.java b/vtm/src/org/oscim/layers/tile/MapTile.java index b353ef7a..c918679c 100644 --- a/vtm/src/org/oscim/layers/tile/MapTile.java +++ b/vtm/src/org/oscim/layers/tile/MapTile.java @@ -17,12 +17,12 @@ package org.oscim.layers.tile; import org.oscim.core.Tile; +import org.oscim.layers.tile.vector.VectorTileLoader; +import org.oscim.layers.tile.vector.labeling.LabelTileLoaderHook; 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; +import org.oscim.utils.quadtree.QuadTree; /** * Extends Tile class to hold state and data for concurrent use in @@ -65,6 +65,8 @@ public class MapTile extends Tile { } public static abstract class TileData extends Inlist { + Object id; + protected abstract void dispose(); } @@ -85,6 +87,13 @@ public class MapTile extends Tile { return state; } + /** + * List of TileData for rendering. ElementLayers is always at first + * position (for VectorTileLayer). TileLoaderHooks may add additional + * data. See e.g. {@link LabelTileLoaderHook}. + */ + public TileData data; + /** * absolute tile coordinates: tileX,Y / Math.pow(2, zoomLevel) */ @@ -104,8 +113,6 @@ public class MapTile extends Tile { public final List symbols = new List(); public final List labels = new List(); - public TileData data; - /** * Tile is in view region. Set by TileRenderer. */ @@ -122,6 +129,7 @@ public class MapTile extends Tile { */ int lastDraw = 0; + public final static int PROXY_CHILD1 = 1 << 0; public final static int PROXY_CHILD2 = 1 << 1; public final static int PROXY_CHILD3 = 1 << 2; @@ -236,10 +244,32 @@ public class MapTile extends Tile { state = State.NONE; } + /** + * Get the default ElementLayers which are added + * by {@link VectorTileLoader} + */ public ElementLayers getLayers() { if (!(data instanceof ElementLayers)) return null; return (ElementLayers) data; } + + public TileData getData(Object id) { + for (TileData d = data; d != null; d = d.next) + if (d.id == id) + return d; + return null; + } + + public void addData(Object id, TileData td) { + // keeping ElementLayers at position 0! + td.id = id; + if (data != null) { + td.next = data.next; + data.next = td; + } else { + data = td; + } + } } diff --git a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java index c6daf19d..fad8fd50 100644 --- a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java @@ -100,6 +100,6 @@ public class BitmapTileLayer extends TileLayer { @Override protected TileLoader createLoader() { - return new BitmapTileLoader(this.getManager(), mTileSource); + return new BitmapTileLoader(this, mTileSource); } } diff --git a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java index c5fd9c5e..742e3f9b 100644 --- a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java @@ -23,8 +23,8 @@ import java.util.concurrent.CancellationException; import org.oscim.backend.canvas.Bitmap; import org.oscim.core.Tile; import org.oscim.layers.tile.MapTile; +import org.oscim.layers.tile.TileLayer; import org.oscim.layers.tile.TileLoader; -import org.oscim.layers.tile.TileManager; import org.oscim.renderer.elements.BitmapLayer; import org.oscim.renderer.elements.ElementLayers; import org.oscim.tiling.ITileDataSource; @@ -38,8 +38,8 @@ public class BitmapTileLoader extends TileLoader { private final ITileDataSource mTileDataSource; - public BitmapTileLoader(TileManager tileManager, TileSource tileSource) { - super(tileManager); + public BitmapTileLoader(TileLayer tileLayer, TileSource tileSource) { + super(tileLayer.getManager()); mTileDataSource = tileSource.getDataSource(); } diff --git a/vtm/src/org/oscim/layers/tile/example/TestTileLayer.java b/vtm/src/org/oscim/layers/tile/example/TestTileLayer.java index 00a3d359..a20ebc6b 100644 --- a/vtm/src/org/oscim/layers/tile/example/TestTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/example/TestTileLayer.java @@ -47,6 +47,7 @@ public class TestTileLayer extends TileLayer { } static class TestTileLoader extends TileLoader { + public TestTileLoader(TileLayer tileLayer) { super(tileLayer.getManager()); } diff --git a/vtm/src/org/oscim/renderer/elements/ElementLayers.java b/vtm/src/org/oscim/renderer/elements/ElementLayers.java index cdcbe9ca..9179ef49 100644 --- a/vtm/src/org/oscim/renderer/elements/ElementLayers.java +++ b/vtm/src/org/oscim/renderer/elements/ElementLayers.java @@ -1,5 +1,5 @@ /* - * Copyright 2012, 2013 Hannes Janetzek + * Copyright 2012-2014 Hannes Janetzek * * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * @@ -37,6 +37,7 @@ import org.slf4j.LoggerFactory; * (and limitations) probably wont make sense in different contexts. */ public class ElementLayers extends TileData { + static final Logger log = LoggerFactory.getLogger(ElementLayers.class); public static void initRenderer(GL20 gl) { @@ -58,6 +59,10 @@ public class ElementLayers extends TileData { /** Text- and SymbolLayer */ private RenderElement textureLayers; + /** + * FIXME this is somewhat out-of-place, as it is not + * compiled with the other layers + */ private RenderElement extrusionLayers; /** From 56c4323959752a52310d4c82c0b9ad71d4fa6bb5 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 16 Mar 2014 15:30:06 +0100 Subject: [PATCH 07/13] docs: MapTile --- vtm/src/org/oscim/layers/tile/MapTile.java | 31 +++++++++++++--------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/vtm/src/org/oscim/layers/tile/MapTile.java b/vtm/src/org/oscim/layers/tile/MapTile.java index c918679c..46167fde 100644 --- a/vtm/src/org/oscim/layers/tile/MapTile.java +++ b/vtm/src/org/oscim/layers/tile/MapTile.java @@ -25,10 +25,10 @@ import org.oscim.utils.quadtree.Node; import org.oscim.utils.quadtree.QuadTree; /** - * Extends Tile class to hold state and data for concurrent use in - * TileManager (Main Thread), - * TileLoader (Worker Thread) and - * TileRenderer (GL Thread). + * Extends Tile class to hold state and data. + * + * Used concurrently in: TileManager (Main Thread), TileLoader (Worker Thread) + * and TileRenderer (GL Thread). */ public class MapTile extends Tile { @@ -117,18 +117,22 @@ public class MapTile extends Tile { * Tile is in view region. Set by TileRenderer. */ public boolean isVisible; + + /** + * Used for fade-effects + */ public long fadeTime; /** - * Pointer to access relatives in QuadTree - */ - public final TileNode node; - - /** - * to avoid drawing a tile twice per frame + * Used to avoid drawing a tile twice per frame + * TODO remove */ int lastDraw = 0; + /** + * Pointer to access relatives in {@link QuadTree} + */ + public final TileNode node; public final static int PROXY_CHILD1 = 1 << 0; public final static int PROXY_CHILD2 = 1 << 1; @@ -221,15 +225,16 @@ public class MapTile extends Tile { } /** - * Test whether it is save to access a proxy item through - * this.rel.* + * Test whether it is save to access a proxy item + * through this.node.* */ public boolean hasProxy(int proxy) { return (proxies & proxy) != 0; } /** - * CAUTION: This function may only be called by {@link TileManager} + * CAUTION: This function may only be called + * by {@link TileManager} */ protected void clear() { while (data != null) { From bb2a86b5ac2262a4fff347d430f2d1fc9a004fed Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 9 Mar 2014 19:37:44 +0100 Subject: [PATCH 08/13] PathLayer - inner class should be static --- vtm/src/org/oscim/layers/PathLayer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vtm/src/org/oscim/layers/PathLayer.java b/vtm/src/org/oscim/layers/PathLayer.java index d6aaf286..2a8abda8 100644 --- a/vtm/src/org/oscim/layers/PathLayer.java +++ b/vtm/src/org/oscim/layers/PathLayer.java @@ -220,7 +220,7 @@ public class PathLayer extends Layer { } } - final class Task { + final static class Task { ElementLayers layer = new ElementLayers(); MapPosition pos = new MapPosition(); } From 2d15324eade9e83ff5f4e63279addcbb3118d4fd Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 9 Mar 2014 20:04:08 +0100 Subject: [PATCH 09/13] insert new hooks at front --- vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java index 32ff4606..1b8a1863 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java @@ -137,8 +137,8 @@ public class VectorTileLayer extends TileLayer { public void addHook(TileLoaderHook h) { int length = mLoaderHooks.length; TileLoaderHook[] tmp = new TileLoaderHook[length + 1]; - System.arraycopy(mLoaderHooks, 0, tmp, 0, length); - tmp[length] = h; + System.arraycopy(mLoaderHooks, 0, tmp, 1, length); + tmp[0] = h; mLoaderHooks = tmp; } From 20d5c20e723d1fef9b1b8ba9e9515ffbfa9f6259 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 9 Mar 2014 20:20:04 +0100 Subject: [PATCH 10/13] move Text/Symbol handling to LabelTileLoaderHook --- .../layers/tile/vector/VectorTileLoader.java | 75 ++-------------- .../tile/vector/labeling/LabelLayer.java | 1 + .../vector/labeling/LabelTileLoaderHook.java | 89 +++++++++++++++++++ vtm/src/org/oscim/theme/IRenderTheme.java | 30 +------ .../org/oscim/theme/styles/CircleStyle.java | 2 +- .../org/oscim/theme/styles/SymbolStyle.java | 8 +- vtm/src/org/oscim/theme/styles/TextStyle.java | 12 +-- 7 files changed, 109 insertions(+), 108 deletions(-) create mode 100644 vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java index 0c2cfa4e..05099a1f 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -23,7 +23,6 @@ import java.util.concurrent.CancellationException; import org.oscim.core.GeometryBuffer.GeometryType; import org.oscim.core.MapElement; import org.oscim.core.MercatorProjection; -import org.oscim.core.PointF; import org.oscim.core.Tag; import org.oscim.core.TagSet; import org.oscim.layers.tile.MapTile; @@ -34,8 +33,6 @@ import org.oscim.renderer.elements.LineLayer; import org.oscim.renderer.elements.LineTexLayer; import org.oscim.renderer.elements.MeshLayer; import org.oscim.renderer.elements.PolygonLayer; -import org.oscim.renderer.elements.SymbolItem; -import org.oscim.renderer.elements.TextItem; import org.oscim.theme.IRenderTheme; import org.oscim.theme.RenderTheme; import org.oscim.theme.styles.AreaStyle; @@ -295,69 +292,9 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac } } - @Override - public void renderAreaText(TextStyle text) { - // TODO place somewhere on polygon - String value = mElement.tags.getValue(text.textKey); - if (value == null || value.length() == 0) - return; - - float x = 0; - float y = 0; - int n = mElement.index[0]; - - for (int i = 0; i < n;) { - x += mElement.points[i++]; - y += mElement.points[i++]; - } - x /= (n / 2); - y /= (n / 2); - - mTile.labels.push(TextItem.pool.get().set(x, y, value, text)); - } - - @Override - public void renderPointText(TextStyle text) { - String value = mElement.tags.getValue(text.textKey); - if (value == null || value.length() == 0) - return; - - for (int i = 0, n = mElement.getNumPoints(); i < n; i++) { - PointF p = mElement.getPoint(i); - mTile.labels.push(TextItem.pool.get().set(p.x, p.y, value, text)); - } - } - - @Override - public void renderWayText(TextStyle text) { - String value = mElement.tags.getValue(text.textKey); - if (value == null || value.length() == 0) - return; - - int offset = 0; - for (int i = 0, n = mElement.index.length; i < n; i++) { - int length = mElement.index[i]; - if (length < 4) - break; - - WayDecorator.renderText(null, mElement.points, value, text, - offset, length, mTile); - offset += length; - } - } - - @Override - public void renderPointSymbol(SymbolStyle symbol) { - if (symbol.texture == null) - return; - - for (int i = 0, n = mElement.getNumPoints(); i < n; i++) { - PointF p = mElement.getPoint(i); - - SymbolItem it = SymbolItem.pool.get(); - it.set(p.x, p.y, symbol.texture, true); - mTile.symbols.push(it); - } + public void renderSymbol(SymbolStyle symbol) { + for (TileLoaderHook h : mTileLayer.getLoaderHooks()) + h.render(mTile, mLayers, mElement, symbol, 0); } public void renderExtrusion(ExtrusionStyle extrusion, int level) { @@ -366,10 +303,12 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac } @Override - public void renderAreaSymbol(SymbolStyle symbol) { + public void renderCircle(CircleStyle circle, int level) { } @Override - public void renderPointCircle(CircleStyle circle, int level) { + public void renderText(TextStyle text) { + for (TileLoaderHook h : mTileLayer.getLoaderHooks()) + h.render(mTile, mLayers, mElement, text, 0); } } diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelLayer.java b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelLayer.java index 45c95b38..bbb36c1d 100644 --- a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelLayer.java @@ -39,6 +39,7 @@ public class LabelLayer extends Layer implements Map.UpdateListener, TileManager public LabelLayer(Map map, VectorTileLayer l) { super(map); l.getManager().events.bind(this); + l.addHook(new LabelTileLoaderHook()); mLabelPlacer = new LabelPlacement(map, l.tileRenderer()); mWorker = new Worker(map); diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java new file mode 100644 index 00000000..bf087353 --- /dev/null +++ b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java @@ -0,0 +1,89 @@ +package org.oscim.layers.tile.vector.labeling; + +import static org.oscim.core.GeometryBuffer.GeometryType.LINE; +import static org.oscim.core.GeometryBuffer.GeometryType.POINT; +import static org.oscim.core.GeometryBuffer.GeometryType.POLY; + +import org.oscim.core.MapElement; +import org.oscim.core.PointF; +import org.oscim.layers.tile.MapTile; +import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderHook; +import org.oscim.layers.tile.vector.WayDecorator; +import org.oscim.renderer.elements.ElementLayers; +import org.oscim.renderer.elements.SymbolItem; +import org.oscim.renderer.elements.TextItem; +import org.oscim.theme.styles.RenderStyle; +import org.oscim.theme.styles.Symbol; +import org.oscim.theme.styles.Text; + +public class LabelTileLoaderHook implements TileLoaderHook { + + @Override + public void render(MapTile tile, ElementLayers layers, MapElement element, + RenderStyle style, int level) { + + if (style instanceof Text) { + Text text = (Text) style; + if (element.type == LINE) { + String value = element.tags.getValue(text.textKey); + if (value == null || value.length() == 0) + return; + + int offset = 0; + for (int i = 0, n = element.index.length; i < n; i++) { + int length = element.index[i]; + if (length < 4) + break; + + WayDecorator.renderText(null, element.points, value, text, + offset, length, tile); + offset += length; + } + } + else if (element.type == POLY) { + // TODO place somewhere on polygon + String value = element.tags.getValue(text.textKey); + if (value == null || value.length() == 0) + return; + + float x = 0; + float y = 0; + int n = element.index[0]; + + for (int i = 0; i < n;) { + x += element.points[i++]; + y += element.points[i++]; + } + x /= (n / 2); + y /= (n / 2); + + tile.labels.push(TextItem.pool.get().set(x, y, value, text)); + } + else if (element.type == POINT) { + String value = element.tags.getValue(text.textKey); + if (value == null || value.length() == 0) + return; + + for (int i = 0, n = element.getNumPoints(); i < n; i++) { + PointF p = element.getPoint(i); + tile.labels.push(TextItem.pool.get().set(p.x, p.y, value, text)); + } + } + } + else if ((element.type == POINT) && (style instanceof Symbol)) { + Symbol symbol = (Symbol) style; + + if (symbol.texture == null) + return; + + for (int i = 0, n = element.getNumPoints(); i < n; i++) { + PointF p = element.getPoint(i); + + SymbolItem it = SymbolItem.pool.get(); + it.set(p.x, p.y, symbol.texture, true); + tile.symbols.push(it); + } + } + } + +} diff --git a/vtm/src/org/oscim/theme/IRenderTheme.java b/vtm/src/org/oscim/theme/IRenderTheme.java index 6b0ec196..e0ba18f0 100644 --- a/vtm/src/org/oscim/theme/IRenderTheme.java +++ b/vtm/src/org/oscim/theme/IRenderTheme.java @@ -85,22 +85,6 @@ public interface IRenderTheme { */ void renderExtrusion(ExtrusionStyle extrusion, int level); - /** - * Renders an area symbol with the given bitmap. - * - * @param symbol - * the symbol to be rendered. - */ - void renderAreaSymbol(SymbolStyle symbol); - - /** - * Renders an area caption with the given text. - * - * @param text - * the text to be rendered. - */ - void renderAreaText(TextStyle text); - /** * Renders a point of interest circle with the given parameters. * @@ -109,7 +93,7 @@ public interface IRenderTheme { * @param level * the drawing level on which the circle should be rendered. */ - void renderPointCircle(CircleStyle circle, int level); + void renderCircle(CircleStyle circle, int level); /** * Renders a point of interest symbol with the given bitmap. @@ -117,15 +101,7 @@ public interface IRenderTheme { * @param symbol * the symbol to be rendered. */ - void renderPointSymbol(SymbolStyle symbol); - - /** - * Renders a point of interest caption with the given text. - * - * @param text - * the text to be rendered. - */ - void renderPointText(TextStyle text); + void renderSymbol(SymbolStyle symbol); /** * Renders a way with the given parameters. @@ -140,7 +116,7 @@ public interface IRenderTheme { * * @param text */ - void renderWayText(TextStyle text); + void renderText(TextStyle text); } diff --git a/vtm/src/org/oscim/theme/styles/CircleStyle.java b/vtm/src/org/oscim/theme/styles/CircleStyle.java index c11eff9e..844ea51a 100644 --- a/vtm/src/org/oscim/theme/styles/CircleStyle.java +++ b/vtm/src/org/oscim/theme/styles/CircleStyle.java @@ -49,6 +49,6 @@ public final class CircleStyle extends RenderStyle { @Override public void renderNode(Callback renderCallback) { - renderCallback.renderPointCircle(this, this.level); + renderCallback.renderCircle(this, this.level); } } diff --git a/vtm/src/org/oscim/theme/styles/SymbolStyle.java b/vtm/src/org/oscim/theme/styles/SymbolStyle.java index 28000b6f..b8d2c96b 100644 --- a/vtm/src/org/oscim/theme/styles/SymbolStyle.java +++ b/vtm/src/org/oscim/theme/styles/SymbolStyle.java @@ -36,12 +36,12 @@ public final class SymbolStyle extends RenderStyle { } @Override - public void renderNode(Callback renderCallback) { - renderCallback.renderPointSymbol(this); + public void renderNode(Callback cb) { + cb.renderSymbol(this); } @Override - public void renderWay(Callback renderCallback) { - renderCallback.renderAreaSymbol(this); + public void renderWay(Callback cb) { + cb.renderSymbol(this); } } diff --git a/vtm/src/org/oscim/theme/styles/TextStyle.java b/vtm/src/org/oscim/theme/styles/TextStyle.java index 6bb9a2bf..a0ff33b6 100644 --- a/vtm/src/org/oscim/theme/styles/TextStyle.java +++ b/vtm/src/org/oscim/theme/styles/TextStyle.java @@ -182,17 +182,13 @@ public final class TextStyle extends RenderStyle { public final TextureRegion texture; @Override - public void renderNode(Callback renderCallback) { - if (caption) - renderCallback.renderPointText(this); + public void renderNode(Callback cb) { + cb.renderText(this); } @Override - public void renderWay(Callback renderCallback) { - if (caption) - renderCallback.renderAreaText(this); - else - renderCallback.renderWayText(this); + public void renderWay(Callback cb) { + cb.renderText(this); } @Override From c234507edbaefbdd489fbde0e291ae80dbe2327d Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 9 Mar 2014 21:14:41 +0100 Subject: [PATCH 11/13] move Label/Symbol data from MapTile to LabelTileData --- vtm/src/org/oscim/layers/tile/MapTile.java | 11 ------ .../tile/vector/labeling/LabelLayer.java | 2 + .../tile/vector/labeling/LabelPlacement.java | 22 +++++++++-- .../tile/vector/labeling/LabelTileData.java | 16 ++++++++ .../vector/labeling/LabelTileLoaderHook.java | 38 +++++++++++++------ .../vector/{ => labeling}/WayDecorator.java | 7 ++-- 6 files changed, 67 insertions(+), 29 deletions(-) create mode 100644 vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileData.java rename vtm/src/org/oscim/layers/tile/vector/{ => labeling}/WayDecorator.java (97%) diff --git a/vtm/src/org/oscim/layers/tile/MapTile.java b/vtm/src/org/oscim/layers/tile/MapTile.java index 46167fde..8a213eec 100644 --- a/vtm/src/org/oscim/layers/tile/MapTile.java +++ b/vtm/src/org/oscim/layers/tile/MapTile.java @@ -105,14 +105,6 @@ public class MapTile extends Tile { */ public float distance; - /** - * FIXME move to VectorMapTile - * Tile data set by TileLoader. - */ - - public final List symbols = new List(); - public final List labels = new List(); - /** * Tile is in view region. Set by TileRenderer. */ @@ -242,9 +234,6 @@ public class MapTile extends Tile { data = data.next; } - TextItem.pool.releaseAll(labels.clear()); - SymbolItem.pool.releaseAll(symbols.clear()); - // still needed? state = State.NONE; } diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelLayer.java b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelLayer.java index bbb36c1d..e5affebc 100644 --- a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelLayer.java @@ -31,6 +31,8 @@ public class LabelLayer extends Layer implements Map.UpdateListener, TileManager static final Logger log = LoggerFactory.getLogger(LabelLayer.class); + public final static String LABEL_DATA = LabelLayer.class.getName(); + private final static long MAX_RELABEL_DELAY = 100; private final LabelPlacement mLabelPlacer; diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelPlacement.java b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelPlacement.java index 9e64df44..9bcc3e3e 100644 --- a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelPlacement.java +++ b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelPlacement.java @@ -18,6 +18,10 @@ import org.oscim.utils.geom.OBB2D; public class LabelPlacement { static final boolean dbg = false; + public final static LabelTileData getLabels(MapTile tile) { + return (LabelTileData) tile.getData(LabelLayer.LABEL_DATA); + } + private final static float MIN_CAPTION_DIST = 5; private final static float MIN_WAY_DIST = 3; @@ -176,7 +180,11 @@ public class LabelPlacement { private Label addWayLabels(MapTile t, Label l, float dx, float dy, double scale) { - for (TextItem ti : t.labels) { + LabelTileData ld = getLabels(t); + if (ld == null) + return l; + + for (TextItem ti : ld.labels) { if (ti.text.caption) continue; @@ -229,7 +237,11 @@ public class LabelPlacement { private Label addNodeLabels(MapTile t, Label l, float dx, float dy, double scale, float cos, float sin) { - O: for (TextItem ti : t.labels) { + LabelTileData ld = getLabels(t); + if (ld == null) + return l; + + O: for (TextItem ti : ld.labels) { if (!ti.text.caption) continue; @@ -447,7 +459,11 @@ public class LabelPlacement { float dy = (float) (t.tileY * Tile.SIZE - tileY); dx = flipLongitude(dx, maxx); - for (SymbolItem ti : t.symbols) { + LabelTileData ld = getLabels(t); + if (ld == null) + continue; + + for (SymbolItem ti : ld.symbols) { if (ti.texRegion == null) continue; diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileData.java b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileData.java new file mode 100644 index 00000000..6d8fd1bb --- /dev/null +++ b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileData.java @@ -0,0 +1,16 @@ +package org.oscim.layers.tile.vector.labeling; + +import org.oscim.layers.tile.MapTile.TileData; +import org.oscim.renderer.elements.SymbolItem; +import org.oscim.renderer.elements.TextItem; + +public class LabelTileData extends TileData { + public final List symbols = new List(); + public final List labels = new List(); + + @Override + protected void dispose() { + TextItem.pool.releaseAll(labels.clear()); + SymbolItem.pool.releaseAll(symbols.clear()); + } +} diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java index bf087353..b7304b49 100644 --- a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java +++ b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java @@ -3,27 +3,41 @@ package org.oscim.layers.tile.vector.labeling; import static org.oscim.core.GeometryBuffer.GeometryType.LINE; import static org.oscim.core.GeometryBuffer.GeometryType.POINT; import static org.oscim.core.GeometryBuffer.GeometryType.POLY; +import static org.oscim.layers.tile.vector.labeling.LabelLayer.LABEL_DATA; import org.oscim.core.MapElement; import org.oscim.core.PointF; import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderHook; -import org.oscim.layers.tile.vector.WayDecorator; import org.oscim.renderer.elements.ElementLayers; import org.oscim.renderer.elements.SymbolItem; import org.oscim.renderer.elements.TextItem; import org.oscim.theme.styles.RenderStyle; -import org.oscim.theme.styles.Symbol; -import org.oscim.theme.styles.Text; +import org.oscim.theme.styles.SymbolStyle; +import org.oscim.theme.styles.TextStyle; public class LabelTileLoaderHook implements TileLoaderHook { + //public final static LabelTileData EMPTY = new LabelTileData(); + + private LabelTileData get(MapTile tile) { + // FIXME could be 'this'.. + LabelTileData ld = (LabelTileData) tile.getData(LABEL_DATA); + if (ld == null) { + ld = new LabelTileData(); + tile.addData(LABEL_DATA, ld); + } + return ld; + } + @Override public void render(MapTile tile, ElementLayers layers, MapElement element, RenderStyle style, int level) { - if (style instanceof Text) { - Text text = (Text) style; + if (style instanceof TextStyle) { + LabelTileData ld = get(tile); + + TextStyle text = (TextStyle) style; if (element.type == LINE) { String value = element.tags.getValue(text.textKey); if (value == null || value.length() == 0) @@ -36,7 +50,7 @@ public class LabelTileLoaderHook implements TileLoaderHook { break; WayDecorator.renderText(null, element.points, value, text, - offset, length, tile); + offset, length, ld); offset += length; } } @@ -57,7 +71,7 @@ public class LabelTileLoaderHook implements TileLoaderHook { x /= (n / 2); y /= (n / 2); - tile.labels.push(TextItem.pool.get().set(x, y, value, text)); + ld.labels.push(TextItem.pool.get().set(x, y, value, text)); } else if (element.type == POINT) { String value = element.tags.getValue(text.textKey); @@ -66,22 +80,24 @@ public class LabelTileLoaderHook implements TileLoaderHook { for (int i = 0, n = element.getNumPoints(); i < n; i++) { PointF p = element.getPoint(i); - tile.labels.push(TextItem.pool.get().set(p.x, p.y, value, text)); + ld.labels.push(TextItem.pool.get().set(p.x, p.y, value, text)); } } } - else if ((element.type == POINT) && (style instanceof Symbol)) { - Symbol symbol = (Symbol) style; + else if ((element.type == POINT) && (style instanceof SymbolStyle)) { + SymbolStyle symbol = (SymbolStyle) style; if (symbol.texture == null) return; + LabelTileData ld = get(tile); + for (int i = 0, n = element.getNumPoints(); i < n; i++) { PointF p = element.getPoint(i); SymbolItem it = SymbolItem.pool.get(); it.set(p.x, p.y, symbol.texture, true); - tile.symbols.push(it); + ld.symbols.push(it); } } } diff --git a/vtm/src/org/oscim/layers/tile/vector/WayDecorator.java b/vtm/src/org/oscim/layers/tile/vector/labeling/WayDecorator.java similarity index 97% rename from vtm/src/org/oscim/layers/tile/vector/WayDecorator.java rename to vtm/src/org/oscim/layers/tile/vector/labeling/WayDecorator.java index 0bbb7378..f0802bff 100644 --- a/vtm/src/org/oscim/layers/tile/vector/WayDecorator.java +++ b/vtm/src/org/oscim/layers/tile/vector/labeling/WayDecorator.java @@ -15,10 +15,9 @@ * You should have received a copy of the GNU Lesser General Public License along with * this program. If not, see . */ -package org.oscim.layers.tile.vector; +package org.oscim.layers.tile.vector.labeling; import org.oscim.core.Tile; -import org.oscim.layers.tile.MapTile; import org.oscim.renderer.elements.TextItem; import org.oscim.theme.styles.TextStyle; import org.oscim.utils.geom.GeometryUtils; @@ -27,7 +26,7 @@ import org.oscim.utils.geom.LineClipper; public final class WayDecorator { public static void renderText(LineClipper clipper, float[] coordinates, String string, - TextStyle text, int pos, int len, MapTile tile) { + TextStyle text, int pos, int len, LabelTileData ld) { //TextItem items = textItems; TextItem t = null; @@ -216,7 +215,7 @@ public final class WayDecorator { t.length = (short) segmentLength; t.edges = edge; - tile.labels.push(t); + ld.labels.push(t); i = last; } From 402e4c3cd6cbc56e7e800b7cb60398bb6c0057bc Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Mon, 10 Mar 2014 03:37:27 +0100 Subject: [PATCH 12/13] let TileLoaderHook stop further processing - return false when no other loader hook should process the current element --- .../org/oscim/layers/tile/vector/BuildingLayer.java | 6 ++++-- .../org/oscim/layers/tile/vector/VectorTileLayer.java | 6 +++--- .../oscim/layers/tile/vector/VectorTileLoader.java | 9 ++++++--- .../tile/vector/labeling/LabelTileLoaderHook.java | 11 ++++++----- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java b/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java index d7058e8c..cfde79d4 100644 --- a/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java @@ -91,11 +91,11 @@ public class BuildingLayer extends Layer implements TileLoaderHook { private final static int MIN_ZOOM = 17; @Override - public void render(MapTile tile, ElementLayers layers, MapElement element, + public boolean render(MapTile tile, ElementLayers layers, MapElement element, RenderStyle style, int level) { if (!(style instanceof ExtrusionStyle)) - return; + return false; ExtrusionStyle extrusion = (ExtrusionStyle) style; @@ -125,6 +125,8 @@ public class BuildingLayer extends Layer implements TileLoaderHook { height = 12 * 100; l.add(element, height, minHeight); + + return true; } //@Override diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java index 1b8a1863..657eb3ea 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java @@ -124,7 +124,7 @@ public class VectorTileLayer extends TileLayer { } public interface TileLoaderHook { - public void render(MapTile tile, ElementLayers layers, + public boolean render(MapTile tile, ElementLayers layers, MapElement element, RenderStyle style, int level); } @@ -137,8 +137,8 @@ public class VectorTileLayer extends TileLayer { public void addHook(TileLoaderHook h) { int length = mLoaderHooks.length; TileLoaderHook[] tmp = new TileLoaderHook[length + 1]; - System.arraycopy(mLoaderHooks, 0, tmp, 1, length); - tmp[0] = h; + System.arraycopy(mLoaderHooks, 0, tmp, 0, length); + tmp[length] = h; mLoaderHooks = tmp; } diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java index 05099a1f..74470d00 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -294,12 +294,14 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac public void renderSymbol(SymbolStyle symbol) { for (TileLoaderHook h : mTileLayer.getLoaderHooks()) - h.render(mTile, mLayers, mElement, symbol, 0); + if (h.render(mTile, mLayers, mElement, symbol, 0)) + break; } public void renderExtrusion(ExtrusionStyle extrusion, int level) { for (TileLoaderHook h : mTileLayer.getLoaderHooks()) - h.render(mTile, mLayers, mElement, extrusion, level); + if (h.render(mTile, mLayers, mElement, extrusion, level)) + break; } @Override @@ -309,6 +311,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac @Override public void renderText(TextStyle text) { for (TileLoaderHook h : mTileLayer.getLoaderHooks()) - h.render(mTile, mLayers, mElement, text, 0); + if (h.render(mTile, mLayers, mElement, text, 0)) + break; } } diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java index b7304b49..276548d0 100644 --- a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java +++ b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java @@ -31,7 +31,7 @@ public class LabelTileLoaderHook implements TileLoaderHook { } @Override - public void render(MapTile tile, ElementLayers layers, MapElement element, + public boolean render(MapTile tile, ElementLayers layers, MapElement element, RenderStyle style, int level) { if (style instanceof TextStyle) { @@ -41,7 +41,7 @@ public class LabelTileLoaderHook implements TileLoaderHook { if (element.type == LINE) { String value = element.tags.getValue(text.textKey); if (value == null || value.length() == 0) - return; + return false; int offset = 0; for (int i = 0, n = element.index.length; i < n; i++) { @@ -58,7 +58,7 @@ public class LabelTileLoaderHook implements TileLoaderHook { // TODO place somewhere on polygon String value = element.tags.getValue(text.textKey); if (value == null || value.length() == 0) - return; + return false; float x = 0; float y = 0; @@ -76,7 +76,7 @@ public class LabelTileLoaderHook implements TileLoaderHook { else if (element.type == POINT) { String value = element.tags.getValue(text.textKey); if (value == null || value.length() == 0) - return; + return false; for (int i = 0, n = element.getNumPoints(); i < n; i++) { PointF p = element.getPoint(i); @@ -88,7 +88,7 @@ public class LabelTileLoaderHook implements TileLoaderHook { SymbolStyle symbol = (SymbolStyle) style; if (symbol.texture == null) - return; + return false; LabelTileData ld = get(tile); @@ -100,6 +100,7 @@ public class LabelTileLoaderHook implements TileLoaderHook { ld.symbols.push(it); } } + return false; } } From 8f94fa7ac5b18040a032a5d7a58ab608f3baa6b5 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Mon, 10 Mar 2014 04:42:26 +0100 Subject: [PATCH 13/13] add TileLoaderProcessHook to intercept MapElement processing --- .../layers/tile/vector/BuildingLayer.java | 4 +-- .../layers/tile/vector/VectorTileLayer.java | 34 +++++++++++++------ .../layers/tile/vector/VectorTileLoader.java | 19 ++++++----- .../vector/labeling/LabelTileLoaderHook.java | 4 +-- 4 files changed, 39 insertions(+), 22 deletions(-) diff --git a/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java b/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java index cfde79d4..ecb57917 100644 --- a/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java @@ -21,7 +21,7 @@ import org.oscim.core.MercatorProjection; import org.oscim.core.Tag; import org.oscim.layers.Layer; import org.oscim.layers.tile.MapTile; -import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderHook; +import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderThemeHook; import org.oscim.map.Map; import org.oscim.renderer.ExtrusionRenderer; import org.oscim.renderer.GLViewport; @@ -31,7 +31,7 @@ import org.oscim.theme.styles.ExtrusionStyle; import org.oscim.theme.styles.RenderStyle; import org.oscim.utils.FastMath; -public class BuildingLayer extends Layer implements TileLoaderHook { +public class BuildingLayer extends Layer implements TileLoaderThemeHook { //static final Logger log = LoggerFactory.getLogger(BuildingOverlay.class); final ExtrusionRenderer mExtLayer; diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java index 657eb3ea..bbd8d51e 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java @@ -123,23 +123,37 @@ public class VectorTileLayer extends TileLayer { return mTheme; } - public interface TileLoaderHook { + public interface TileLoaderProcessHook { + public boolean process(MapTile tile, ElementLayers layers, MapElement element); + } + + public interface TileLoaderThemeHook { public boolean render(MapTile tile, ElementLayers layers, MapElement element, RenderStyle style, int level); } - private TileLoaderHook[] mLoaderHooks = new TileLoaderHook[0]; + private TileLoaderProcessHook[] mLoaderProcessHooks = new TileLoaderProcessHook[0]; + private TileLoaderThemeHook[] mLoaderThemeHooks = new TileLoaderThemeHook[0]; - public TileLoaderHook[] getLoaderHooks() { - return mLoaderHooks; + public TileLoaderProcessHook[] loaderProcessHooks() { + return mLoaderProcessHooks; } - public void addHook(TileLoaderHook h) { - int length = mLoaderHooks.length; - TileLoaderHook[] tmp = new TileLoaderHook[length + 1]; - System.arraycopy(mLoaderHooks, 0, tmp, 0, length); - tmp[length] = h; - mLoaderHooks = tmp; + public TileLoaderThemeHook[] loaderThemeHooks() { + return mLoaderThemeHooks; } + public void addHook(TileLoaderProcessHook h) { + TileLoaderProcessHook[] tmp = mLoaderProcessHooks; + mLoaderProcessHooks = new TileLoaderProcessHook[tmp.length + 1]; + System.arraycopy(tmp, 0, mLoaderProcessHooks, 0, tmp.length); + mLoaderProcessHooks[tmp.length] = h; + } + + public void addHook(TileLoaderThemeHook h) { + TileLoaderThemeHook[] tmp = mLoaderThemeHooks; + mLoaderThemeHooks = new TileLoaderThemeHook[tmp.length + 1]; + System.arraycopy(tmp, 0, mLoaderThemeHooks, 0, tmp.length); + mLoaderThemeHooks[tmp.length] = h; + } } diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java index 74470d00..1b7ffa99 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -27,7 +27,8 @@ import org.oscim.core.Tag; import org.oscim.core.TagSet; import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.TileLoader; -import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderHook; +import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderProcessHook; +import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderThemeHook; import org.oscim.renderer.elements.ElementLayers; import org.oscim.renderer.elements.LineLayer; import org.oscim.renderer.elements.LineTexLayer; @@ -166,10 +167,6 @@ 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; } @@ -179,6 +176,10 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac if (isCanceled() || mTile.state(CANCEL)) throw new CancellationException(); + for (TileLoaderProcessHook h : mTileLayer.loaderProcessHooks()) + if (h.process(mTile, mLayers, element)) + return; + TagSet tags = filterTags(element.tags); if (tags == null) return; @@ -292,14 +293,16 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac } } + @Override public void renderSymbol(SymbolStyle symbol) { - for (TileLoaderHook h : mTileLayer.getLoaderHooks()) + for (TileLoaderThemeHook h : mTileLayer.loaderThemeHooks()) if (h.render(mTile, mLayers, mElement, symbol, 0)) break; } + @Override public void renderExtrusion(ExtrusionStyle extrusion, int level) { - for (TileLoaderHook h : mTileLayer.getLoaderHooks()) + for (TileLoaderThemeHook h : mTileLayer.loaderThemeHooks()) if (h.render(mTile, mLayers, mElement, extrusion, level)) break; } @@ -310,7 +313,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac @Override public void renderText(TextStyle text) { - for (TileLoaderHook h : mTileLayer.getLoaderHooks()) + for (TileLoaderThemeHook h : mTileLayer.loaderThemeHooks()) if (h.render(mTile, mLayers, mElement, text, 0)) break; } diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java index 276548d0..6a51a4ad 100644 --- a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java +++ b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java @@ -8,7 +8,7 @@ import static org.oscim.layers.tile.vector.labeling.LabelLayer.LABEL_DATA; import org.oscim.core.MapElement; import org.oscim.core.PointF; import org.oscim.layers.tile.MapTile; -import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderHook; +import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderThemeHook; import org.oscim.renderer.elements.ElementLayers; import org.oscim.renderer.elements.SymbolItem; import org.oscim.renderer.elements.TextItem; @@ -16,7 +16,7 @@ import org.oscim.theme.styles.RenderStyle; import org.oscim.theme.styles.SymbolStyle; import org.oscim.theme.styles.TextStyle; -public class LabelTileLoaderHook implements TileLoaderHook { +public class LabelTileLoaderHook implements TileLoaderThemeHook { //public final static LabelTileData EMPTY = new LabelTileData();