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) { } }