refactor: MapTile hold generic TileData - Testing
This commit is contained in:
parent
3eba47b0bb
commit
1f5efb9a33
vtm/src/org/oscim
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user