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