refactor: MapTile hold generic TileData - Testing

This commit is contained in:
Hannes Janetzek 2014-03-09 18:11:07 +01:00
parent 3eba47b0bb
commit 1f5efb9a33
8 changed files with 73 additions and 37 deletions

View File

@ -20,6 +20,7 @@ import org.oscim.core.Tile;
import org.oscim.renderer.elements.ElementLayers; import org.oscim.renderer.elements.ElementLayers;
import org.oscim.renderer.elements.SymbolItem; import org.oscim.renderer.elements.SymbolItem;
import org.oscim.renderer.elements.TextItem; import org.oscim.renderer.elements.TextItem;
import org.oscim.utils.pool.Inlist;
import org.oscim.utils.pool.Inlist.List; import org.oscim.utils.pool.Inlist.List;
import org.oscim.utils.quadtree.Node; import org.oscim.utils.quadtree.Node;
@ -63,6 +64,10 @@ public class MapTile extends Tile {
public final static byte CANCEL = 1 << 3; public final static byte CANCEL = 1 << 3;
} }
public static abstract class TileData extends Inlist<TileData> {
protected abstract void dispose();
}
public MapTile(TileNode node, int tileX, int tileY, int zoomLevel) { public MapTile(TileNode node, int tileX, int tileY, int zoomLevel) {
super(tileX, tileY, (byte) zoomLevel); super(tileX, tileY, (byte) zoomLevel);
this.x = (double) tileX / (1 << zoomLevel); this.x = (double) tileX / (1 << zoomLevel);
@ -99,7 +104,7 @@ public class MapTile extends Tile {
public final List<SymbolItem> symbols = new List<SymbolItem>(); public final List<SymbolItem> symbols = new List<SymbolItem>();
public final List<TextItem> labels = new List<TextItem>(); public final List<TextItem> labels = new List<TextItem>();
public ElementLayers layers; public TileData data;
/** /**
* Tile is in view region. Set by TileRenderer. * 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} * CAUTION: This function may only be called by {@link TileManager}
*/ */
protected void clear() { protected void clear() {
if (layers != null) { while (data != null) {
layers.clear(); data.dispose();
layers = null; data = data.next;
} }
TextItem.pool.releaseAll(labels.clear()); TextItem.pool.releaseAll(labels.clear());
@ -230,4 +235,11 @@ public class MapTile extends Tile {
// still needed? // still needed?
state = State.NONE; state = State.NONE;
} }
public ElementLayers getLayers() {
if (!(data instanceof ElementLayers))
return null;
return (ElementLayers) data;
}
} }

View File

@ -26,6 +26,7 @@ import org.oscim.renderer.ElementRenderer;
import org.oscim.renderer.GLViewport; import org.oscim.renderer.GLViewport;
import org.oscim.renderer.LayerRenderer; import org.oscim.renderer.LayerRenderer;
import org.oscim.renderer.MapRenderer; import org.oscim.renderer.MapRenderer;
import org.oscim.renderer.elements.ElementLayers;
import org.oscim.utils.ScanBox; import org.oscim.utils.ScanBox;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -186,24 +187,25 @@ public abstract class TileRenderer extends LayerRenderer {
private static int uploadTileData(MapTile tile) { private static int uploadTileData(MapTile tile) {
tile.state = READY; tile.state = READY;
ElementLayers layers = tile.getLayers();
/* tile might contain extrusion or label layers */ /* tile might contain extrusion or label layers */
if (tile.layers == null) if (layers == null)
return 1; return 1;
int newSize = tile.layers.getSize(); int newSize = layers.getSize();
if (newSize <= 0) if (newSize <= 0)
return 1; return 1;
if (tile.layers.vbo == null) if (layers.vbo == null)
tile.layers.vbo = BufferObject.get(GL20.GL_ARRAY_BUFFER, newSize); 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); log.error("{} uploadTileData failed!", tile);
layers.vbo = BufferObject.release(layers.vbo);
tile.layers.vbo = BufferObject.release(tile.layers.vbo); layers.clear();
tile.layers.clear(); /* throw Exception? */
tile.layers = null; //FIXME tile.layers = null;
return 0; return 0;
} }

View File

@ -16,6 +16,7 @@ import org.oscim.renderer.GLMatrix;
import org.oscim.renderer.GLViewport; import org.oscim.renderer.GLViewport;
import org.oscim.renderer.MapRenderer; import org.oscim.renderer.MapRenderer;
import org.oscim.renderer.elements.BitmapLayer; import org.oscim.renderer.elements.BitmapLayer;
import org.oscim.renderer.elements.ElementLayers;
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;
@ -113,11 +114,13 @@ public class VectorTileRenderer extends TileRenderer {
/* use holder proxy when it is set */ /* use holder proxy when it is set */
MapTile t = tile.holder == null ? tile : tile.holder; 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)); //throw new IllegalStateException(t + "no data " + (t.layers == null));
return; return;
t.layers.vbo.bind(); layers.vbo.bind();
MapPosition pos = v.pos; MapPosition pos = v.pos;
/* place tile relative to map position */ /* place tile relative to map position */
int z = tile.zoomLevel; int z = tile.zoomLevel;
@ -134,7 +137,8 @@ public class VectorTileRenderer extends TileRenderer {
boolean clipped = false; boolean clipped = false;
int mode = mClipMode; int mode = mClipMode;
RenderElement l = t.layers.getBaseLayers();
RenderElement l = layers.getBaseLayers();
while (l != null) { while (l != null) {
if (l.type == POLYGON) { if (l.type == POLYGON) {
@ -148,11 +152,11 @@ public class VectorTileRenderer extends TileRenderer {
clipped = true; clipped = true;
} }
if (l.type == LINE) { if (l.type == LINE) {
l = LineLayer.Renderer.draw(l, v, scale, t.layers); l = LineLayer.Renderer.draw(l, v, scale, layers);
continue; continue;
} }
if (l.type == TEXLINE) { if (l.type == TEXLINE) {
l = LineTexLayer.Renderer.draw(l, v, div, t.layers); l = LineTexLayer.Renderer.draw(l, v, div, layers);
continue; continue;
} }
if (l.type == MESH) { if (l.type == MESH) {
@ -163,7 +167,7 @@ public class VectorTileRenderer extends TileRenderer {
l = l.next; l = l.next;
} }
l = t.layers.getTextureLayers(); l = layers.getTextureLayers();
while (l != null) { while (l != null) {
if (!clipped) { if (!clipped) {
PolygonLayer.Renderer.draw(null, v, div, true, mode); PolygonLayer.Renderer.draw(null, v, div, true, mode);

View File

@ -64,8 +64,9 @@ public class BitmapTileLoader extends TileLoader {
BitmapLayer l = new BitmapLayer(false); BitmapLayer l = new BitmapLayer(false);
l.setBitmap(bitmap, Tile.SIZE, Tile.SIZE); l.setBitmap(bitmap, Tile.SIZE, Tile.SIZE);
mTile.layers = new ElementLayers(); ElementLayers layers = new ElementLayers();
mTile.layers.setTextureLayers(l); layers.setTextureLayers(l);
mTile.data = layers;
} }
@Override @Override

View File

@ -57,9 +57,10 @@ public class TestTileLayer extends TileLayer {
@Override @Override
public boolean loadTile(MapTile tile) { public boolean loadTile(MapTile tile) {
log.debug("load tile " + 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.line = mLineStyle;
ll.scale = 2; ll.scale = 2;

View File

@ -76,6 +76,8 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
/** Line-scale-factor depending on zoom and latitude */ /** Line-scale-factor depending on zoom and latitude */
protected float mLineScale = 1.0f; protected float mLineScale = 1.0f;
protected ElementLayers mLayers;
private final VectorTileLayer mTileLayer; private final VectorTileLayer mTileLayer;
public VectorTileLoader(VectorTileLayer tileLayer) { public VectorTileLoader(VectorTileLayer tileLayer) {
@ -102,6 +104,8 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
return false; return false;
} }
//mTileLayer.getLoaderHooks();
/* account for area changes with latitude */ /* account for area changes with latitude */
double lat = MercatorProjection.toLatitude(tile.y); double lat = MercatorProjection.toLatitude(tile.y);
mLineScale = (float) Math.pow(STROKE_INCREASE, tile.zoomLevel - STROKE_MIN_ZOOM); 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 */ /* scale line width relative to latitude + PI * thumb */
mLineScale *= 0.4f + 0.6f * ((float) Math.sin(Math.abs(lat) * (Math.PI / 180))); mLineScale *= 0.4f + 0.6f * ((float) Math.sin(Math.abs(lat) * (Math.PI / 180)));
mLayers = new ElementLayers();
tile.layers = new ElementLayers(); tile.data = mLayers;
try { try {
/* query data source, which calls process() callback */ /* 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 * E.g. to replace tags that should not be cached in Rendertheme
*/ */
protected TagSet filterTags(TagSet tagSet) { protected TagSet filterTags(TagSet tagSet) {
// if (filterHooks != null){
// tagSet =
// }
return tagSet; return tagSet;
} }
@ -235,7 +243,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
return; return;
} }
LineLayer ll = mTile.layers.getLineLayer(numLayer); LineLayer ll = mLayers.getLineLayer(numLayer);
if (ll.line == null) { if (ll.line == null) {
ll.line = line; ll.line = line;
@ -253,7 +261,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
mCurLineLayer = ll; mCurLineLayer = ll;
} else { } else {
LineTexLayer ll = mTile.layers.getLineTexLayer(numLayer); LineTexLayer ll = mLayers.getLineTexLayer(numLayer);
if (ll.line == null) { if (ll.line == null) {
ll.line = line; ll.line = line;
@ -277,11 +285,11 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
public void renderArea(AreaStyle area, int level) { public void renderArea(AreaStyle area, int level) {
int numLayer = mCurLayer + level; int numLayer = mCurLayer + level;
if (USE_MESH_POLY) { if (USE_MESH_POLY) {
MeshLayer l = mTile.layers.getMeshLayer(numLayer); MeshLayer l = mLayers.getMeshLayer(numLayer);
l.area = area; l.area = area;
l.addMesh(mElement); l.addMesh(mElement);
} else { } else {
PolygonLayer l = mTile.layers.getPolygonLayer(numLayer); PolygonLayer l = mLayers.getPolygonLayer(numLayer);
l.area = area; l.area = area;
l.addPolygon(mElement.points, mElement.index); l.addPolygon(mElement.points, mElement.index);
} }
@ -372,7 +380,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
if (v != null) if (v != null)
minHeight = Integer.parseInt(v); minHeight = Integer.parseInt(v);
ExtrusionLayer l = mTile.layers.getExtrusionLayers(); ExtrusionLayer l = mLayers.getExtrusionLayers();
if (l == null) { if (l == null) {
double lat = MercatorProjection.toLatitude(mTile.y); double lat = MercatorProjection.toLatitude(mTile.y);
@ -380,7 +388,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
.groundResolution(lat, 1 << mTile.zoomLevel); .groundResolution(lat, 1 << mTile.zoomLevel);
l = new ExtrusionLayer(0, groundScale, extrusion.colors); l = new ExtrusionLayer(0, groundScale, extrusion.colors);
mTile.layers.setExtrusionLayers(l); mLayers.setExtrusionLayers(l);
} }
/* 12m default */ /* 12m default */

View File

@ -25,6 +25,7 @@ import org.oscim.core.Tile;
import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.MapTile;
import org.oscim.layers.tile.TileRenderer; import org.oscim.layers.tile.TileRenderer;
import org.oscim.layers.tile.TileSet; import org.oscim.layers.tile.TileSet;
import org.oscim.renderer.elements.ElementLayers;
import org.oscim.renderer.elements.ExtrusionLayer; import org.oscim.renderer.elements.ExtrusionLayer;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -169,10 +170,11 @@ public class ExtrusionRenderer extends LayerRenderer {
} }
private static ExtrusionLayer getLayer(MapTile t) { 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 null;
return t.layers.getExtrusionLayers(); return layers.getExtrusionLayers();
} }
private final boolean debug = false; private final boolean debug = false;
@ -201,7 +203,7 @@ public class ExtrusionRenderer extends LayerRenderer {
GLState.test(false, false); GLState.test(false, false);
for (int i = 0; i < mTileCnt; i++) { for (int i = 0; i < mTileCnt; i++) {
ExtrusionLayer el = tiles[i].layers.getExtrusionLayers(); ExtrusionLayer el = tiles[i].getLayers().getExtrusionLayers();
setMatrix(v, tiles[i], 0); setMatrix(v, tiles[i], 0);
v.mvp.setAsUniform(uExtMatrix); v.mvp.setAsUniform(uExtMatrix);
@ -252,7 +254,7 @@ public class ExtrusionRenderer extends LayerRenderer {
// draw to depth buffer // draw to depth buffer
for (int i = 0; i < mTileCnt; i++) { for (int i = 0; i < mTileCnt; i++) {
MapTile t = tiles[i]; MapTile t = tiles[i];
ExtrusionLayer el = t.layers.getExtrusionLayers(); ExtrusionLayer el = t.getLayers().getExtrusionLayers();
int d = MapRenderer.depthOffset(t) * 10; int d = MapRenderer.depthOffset(t) * 10;
setMatrix(v, t, d); setMatrix(v, t, d);
v.mvp.setAsUniform(uExtMatrix); v.mvp.setAsUniform(uExtMatrix);
@ -278,7 +280,7 @@ public class ExtrusionRenderer extends LayerRenderer {
for (int i = 0; i < mTileCnt; i++) { for (int i = 0; i < mTileCnt; i++) {
MapTile t = tiles[i]; MapTile t = tiles[i];
ExtrusionLayer el = t.layers.getExtrusionLayers(); ExtrusionLayer el = t.getLayers().getExtrusionLayers();
if (el.colors == null) { if (el.colors == null) {
currentColor = mColor; currentColor = mColor;

View File

@ -24,6 +24,7 @@ import static org.oscim.renderer.elements.RenderElement.TEXLINE;
import java.nio.ShortBuffer; import java.nio.ShortBuffer;
import org.oscim.backend.GL20; import org.oscim.backend.GL20;
import org.oscim.layers.tile.MapTile.TileData;
import org.oscim.renderer.BufferObject; import org.oscim.renderer.BufferObject;
import org.oscim.theme.styles.AreaStyle; import org.oscim.theme.styles.AreaStyle;
import org.oscim.theme.styles.LineStyle; 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 * MapTile. It can be used for other purposes as well but some optimizations
* (and limitations) probably wont make sense in different contexts. * (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); static final Logger log = LoggerFactory.getLogger(ElementLayers.class);
public static void initRenderer(GL20 gl) { public static void initRenderer(GL20 gl) {
@ -386,4 +387,9 @@ public class ElementLayers {
vbo = BufferObject.release(vbo); vbo = BufferObject.release(vbo);
} }
@Override
protected void dispose() {
clear();
}
} }