start TileLoaderHook:

- only create ExtrusionLayers when a BuildingLayer is attached
This commit is contained in:
Hannes Janetzek 2014-03-09 19:06:12 +01:00
parent 1f5efb9a33
commit 7b9f2ac6bd
3 changed files with 81 additions and 34 deletions

View File

@ -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;

View File

@ -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;
}
}

View File

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