start TileLoaderHook:
- only create ExtrusionLayers when a BuildingLayer is attached
This commit is contained in:
parent
1f5efb9a33
commit
7b9f2ac6bd
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user