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

@ -20,6 +20,7 @@ import org.oscim.core.Tile;
import org.oscim.renderer.elements.ElementLayers;
import org.oscim.renderer.elements.SymbolItem;
import org.oscim.renderer.elements.TextItem;
import org.oscim.utils.pool.Inlist;
import org.oscim.utils.pool.Inlist.List;
import org.oscim.utils.quadtree.Node;
@ -63,6 +64,10 @@ public class MapTile extends Tile {
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) {
super(tileX, tileY, (byte) 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<TextItem> labels = new List<TextItem>();
public ElementLayers layers;
public TileData data;
/**
* 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}
*/
protected void clear() {
if (layers != null) {
layers.clear();
layers = null;
while (data != null) {
data.dispose();
data = data.next;
}
TextItem.pool.releaseAll(labels.clear());
@ -230,4 +235,11 @@ public class MapTile extends Tile {
// still needed?
state = State.NONE;
}
public ElementLayers getLayers() {
if (!(data instanceof ElementLayers))
return null;
return (ElementLayers) data;
}
}

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

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

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

@ -57,9 +57,10 @@ public class TestTileLayer extends TileLayer {
@Override
public boolean loadTile(MapTile 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.scale = 2;

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

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

@ -24,6 +24,7 @@ import static org.oscim.renderer.elements.RenderElement.TEXLINE;
import java.nio.ShortBuffer;
import org.oscim.backend.GL20;
import org.oscim.layers.tile.MapTile.TileData;
import org.oscim.renderer.BufferObject;
import org.oscim.theme.styles.AreaStyle;
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
* (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);
public static void initRenderer(GL20 gl) {
@ -386,4 +387,9 @@ public class ElementLayers {
vbo = BufferObject.release(vbo);
}
@Override
protected void dispose() {
clear();
}
}