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;
|
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.Layer;
|
||||||
|
import org.oscim.layers.tile.MapTile;
|
||||||
|
import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderHook;
|
||||||
import org.oscim.map.Map;
|
import org.oscim.map.Map;
|
||||||
import org.oscim.renderer.ExtrusionRenderer;
|
import org.oscim.renderer.ExtrusionRenderer;
|
||||||
import org.oscim.renderer.GLViewport;
|
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;
|
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);
|
//static final Logger log = LoggerFactory.getLogger(BuildingOverlay.class);
|
||||||
|
|
||||||
final ExtrusionRenderer mExtLayer;
|
final ExtrusionRenderer mExtLayer;
|
||||||
|
|
||||||
public BuildingLayer(Map map, VectorTileLayer tileLayer) {
|
public BuildingLayer(Map map, VectorTileLayer tileLayer) {
|
||||||
super(map);
|
super(map);
|
||||||
|
tileLayer.addHook(this);
|
||||||
|
|
||||||
mExtLayer = new ExtrusionRenderer(tileLayer.tileRenderer()) {
|
mExtLayer = new ExtrusionRenderer(tileLayer.tileRenderer()) {
|
||||||
private long mStartTime;
|
private long mStartTime;
|
||||||
|
|
||||||
@ -79,6 +90,43 @@ public class BuildingLayer extends Layer {
|
|||||||
|
|
||||||
private final static int MIN_ZOOM = 17;
|
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
|
//@Override
|
||||||
//public boolean onTouchEvent(MotionEvent e) {
|
//public boolean onTouchEvent(MotionEvent e) {
|
||||||
// int action = e.getAction() & MotionEvent.ACTION_MASK;
|
// int action = e.getAction() & MotionEvent.ACTION_MASK;
|
||||||
|
|||||||
@ -16,12 +16,16 @@
|
|||||||
*/
|
*/
|
||||||
package org.oscim.layers.tile.vector;
|
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.TileLayer;
|
||||||
import org.oscim.layers.tile.TileLoader;
|
import org.oscim.layers.tile.TileLoader;
|
||||||
import org.oscim.layers.tile.TileManager;
|
import org.oscim.layers.tile.TileManager;
|
||||||
import org.oscim.layers.tile.VectorTileRenderer;
|
import org.oscim.layers.tile.VectorTileRenderer;
|
||||||
import org.oscim.map.Map;
|
import org.oscim.map.Map;
|
||||||
|
import org.oscim.renderer.elements.ElementLayers;
|
||||||
import org.oscim.theme.IRenderTheme;
|
import org.oscim.theme.IRenderTheme;
|
||||||
|
import org.oscim.theme.styles.RenderStyle;
|
||||||
import org.oscim.tiling.TileSource;
|
import org.oscim.tiling.TileSource;
|
||||||
import org.oscim.tiling.TileSource.OpenResult;
|
import org.oscim.tiling.TileSource.OpenResult;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -118,4 +122,24 @@ public class VectorTileLayer extends TileLayer {
|
|||||||
public IRenderTheme getTheme() {
|
public IRenderTheme getTheme() {
|
||||||
return mTheme;
|
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).
|
* 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.core.TagSet;
|
||||||
import org.oscim.layers.tile.MapTile;
|
import org.oscim.layers.tile.MapTile;
|
||||||
import org.oscim.layers.tile.TileLoader;
|
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.ElementLayers;
|
||||||
import org.oscim.renderer.elements.ExtrusionLayer;
|
|
||||||
import org.oscim.renderer.elements.LineLayer;
|
import org.oscim.renderer.elements.LineLayer;
|
||||||
import org.oscim.renderer.elements.LineTexLayer;
|
import org.oscim.renderer.elements.LineTexLayer;
|
||||||
import org.oscim.renderer.elements.MeshLayer;
|
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
|
@Override
|
||||||
public void renderPointSymbol(SymbolStyle symbol) {
|
public void renderPointSymbol(SymbolStyle symbol) {
|
||||||
if (symbol.texture == null)
|
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
|
@Override
|
||||||
public void renderAreaSymbol(SymbolStyle symbol) {
|
public void renderAreaSymbol(SymbolStyle symbol) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void renderExtrusion(ExtrusionStyle extrusion, int level) {
|
public void renderPointCircle(CircleStyle circle, 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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user