From 5235e8483be6653a5686b214978b4f7309147897 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Wed, 29 Jan 2014 16:23:21 +0100 Subject: [PATCH 1/6] refactor and cleanup RenderElement and related classes --- .../layers/tile/vector/VectorTileLoader.java | 5 +- vtm/src/org/oscim/layers/PathLayer.java | 6 +- .../oscim/layers/marker/ItemizedLayer.java | 5 +- .../oscim/layers/tile/BitmapTileLayer.java | 2 +- .../layers/tile/vector/VectorTileLoader.java | 2 +- .../tile/vector/labeling/TextRenderer.java | 4 +- .../org/oscim/renderer/BitmapRenderer.java | 4 +- .../org/oscim/renderer/ElementRenderer.java | 105 +++---- .../org/oscim/renderer/ExtrusionRenderer.java | 10 +- vtm/src/org/oscim/renderer/GridRenderer.java | 3 +- .../oscim/renderer/elements/BitmapLayer.java | 4 +- .../renderer/elements/ElementLayers.java | 272 +++++++++--------- .../oscim/renderer/elements/LineLayer.java | 18 +- .../oscim/renderer/elements/LineTexLayer.java | 13 +- .../oscim/renderer/elements/MeshLayer.java | 2 +- .../oscim/renderer/elements/PolygonLayer.java | 11 +- .../renderer/elements/RenderElement.java | 64 ++--- .../oscim/renderer/elements/SymbolLayer.java | 2 +- .../oscim/renderer/elements/TextureLayer.java | 4 +- .../oscim/renderer/test/AtlasRenderLayer.java | 2 +- .../renderer/test/SymbolRenderLayer.java | 2 +- vtm/src/org/oscim/tiling/MapTile.java | 3 - vtm/src/org/oscim/tiling/TileRenderer.java | 128 ++++----- 23 files changed, 317 insertions(+), 354 deletions(-) diff --git a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/vector/VectorTileLoader.java index 60ad366f..6e37080a 100644 --- a/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm-gdx-html/src/org/oscim/gdx/emu/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -417,7 +417,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac if (v != null) minHeight = Integer.parseInt(v); - ExtrusionLayer l = (ExtrusionLayer) mTile.layers.extrusionLayers; + ExtrusionLayer l = mTile.layers.getExtrusionLayers(); if (l == null) { double lat = MercatorProjection.toLatitude(mTile.y); @@ -425,7 +425,8 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac * MercatorProjection.EARTH_CIRCUMFERENCE / ((long) Tile.SIZE << mTile.zoomLevel)); - mTile.layers.extrusionLayers = l = new ExtrusionLayer(0, groundScale, extrusion.colors); + l = new ExtrusionLayer(0, groundScale, extrusion.colors); + mTile.layers.setExtrusionLayers(l); } l.add(mElement, height, minHeight); } diff --git a/vtm/src/org/oscim/layers/PathLayer.java b/vtm/src/org/oscim/layers/PathLayer.java index 9267aa9a..39e4c2d7 100644 --- a/vtm/src/org/oscim/layers/PathLayer.java +++ b/vtm/src/org/oscim/layers/PathLayer.java @@ -216,7 +216,7 @@ public class PathLayer extends Layer { mMapPosition.copy(t.pos); // compile new layers - layers.baseLayers = t.layer.baseLayers; + layers.setBaseLayers(t.layer.getBaseLayers()); compile(); } } @@ -289,7 +289,7 @@ public class PathLayer extends Layer { } if (size == 0) { - if (task.layer.baseLayers != null) { + if (task.layer.getBaseLayers() != null) { task.layer.clear(); mMap.render(); } @@ -299,8 +299,6 @@ public class PathLayer extends Layer { ElementLayers layers = task.layer; LineLayer ll = layers.getLineLayer(0); - ll.clear(); - ll.line = mLineStyle; ll.width = ll.line.width; diff --git a/vtm/src/org/oscim/layers/marker/ItemizedLayer.java b/vtm/src/org/oscim/layers/marker/ItemizedLayer.java index e6788209..659f8229 100644 --- a/vtm/src/org/oscim/layers/marker/ItemizedLayer.java +++ b/vtm/src/org/oscim/layers/marker/ItemizedLayer.java @@ -115,7 +115,7 @@ public abstract class ItemizedLayer extends MarkerLayer synchronized (lock) { if (mItems == null) { - if (layers.textureLayers != null) { + if (layers.getTextureLayers() != null) { layers.clear(); compile(); } @@ -183,10 +183,9 @@ public abstract class ItemizedLayer extends MarkerLayer mSymbolLayer.addSymbol(s); } - } mSymbolLayer.prepare(); - layers.textureLayers = mSymbolLayer; + layers.setTextureLayers(mSymbolLayer); compile(); } diff --git a/vtm/src/org/oscim/layers/tile/BitmapTileLayer.java b/vtm/src/org/oscim/layers/tile/BitmapTileLayer.java index 0c996d9f..1cddce72 100644 --- a/vtm/src/org/oscim/layers/tile/BitmapTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/BitmapTileLayer.java @@ -141,7 +141,7 @@ public class BitmapTileLayer extends TileLayer { BitmapLayer l = new BitmapLayer(false); l.setBitmap(bitmap, Tile.SIZE, Tile.SIZE); mTile.layers = new ElementLayers(); - mTile.layers.textureLayers = l; + mTile.layers.setTextureLayers(l); } @Override diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java index bc584d4a..c4939dee 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -441,7 +441,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac / ((long) Tile.SIZE << mTile.zoomLevel)); l = new ExtrusionLayer(0, groundScale, extrusion.colors); - mTile.layers.add(l); + mTile.layers.setExtrusionLayers(l); } l.add(mElement, height, minHeight); } diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java b/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java index 551b48a0..2a3aaf0c 100644 --- a/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java +++ b/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java @@ -69,7 +69,7 @@ class TextRenderer extends ElementRenderer { } // set new TextLayer to be uploaded and rendered - layers.textureLayers = t.layers; + layers.setTextureLayers(t.layers); mMapPosition = t.pos; compile(); } @@ -85,7 +85,7 @@ class TextRenderer extends ElementRenderer { setMatrix(pos, m, false); - for (RenderElement l = layers.textureLayers; l != null;) + for (RenderElement l = layers.getTextureLayers(); l != null;) l = TextureLayer.Renderer.draw(l, scale, m); } diff --git a/vtm/src/org/oscim/renderer/BitmapRenderer.java b/vtm/src/org/oscim/renderer/BitmapRenderer.java index a92b9260..b1ae770f 100644 --- a/vtm/src/org/oscim/renderer/BitmapRenderer.java +++ b/vtm/src/org/oscim/renderer/BitmapRenderer.java @@ -62,7 +62,7 @@ public class BitmapRenderer extends ElementRenderer { BitmapLayer l = new BitmapLayer(true); l.setBitmap(mBitmap, mWidth, mHeight); - layers.textureLayers = l; + layers.setTextureLayers(l); mUpdateBitmap = true; } @@ -86,6 +86,6 @@ public class BitmapRenderer extends ElementRenderer { @Override protected synchronized void render(MapPosition pos, Matrices m) { m.useScreenCoordinates(false, 8); - BitmapLayer.Renderer.draw(layers.textureLayers, m, 1, 1); + BitmapLayer.Renderer.draw(layers.getTextureLayers(), m, 1, 1); } } diff --git a/vtm/src/org/oscim/renderer/ElementRenderer.java b/vtm/src/org/oscim/renderer/ElementRenderer.java index c289d709..1f5b5623 100644 --- a/vtm/src/org/oscim/renderer/ElementRenderer.java +++ b/vtm/src/org/oscim/renderer/ElementRenderer.java @@ -16,6 +16,13 @@ */ package org.oscim.renderer; +import static org.oscim.renderer.elements.RenderElement.BITMAP; +import static org.oscim.renderer.elements.RenderElement.LINE; +import static org.oscim.renderer.elements.RenderElement.MESH; +import static org.oscim.renderer.elements.RenderElement.POLYGON; +import static org.oscim.renderer.elements.RenderElement.SYMBOL; +import static org.oscim.renderer.elements.RenderElement.TEXLINE; + import java.nio.ShortBuffer; import org.oscim.backend.GL20; @@ -51,11 +58,15 @@ public abstract class ElementRenderer extends LayerRenderer { /** * Use mMapPosition.copy(position) to keep the position for which - * the Overlay is _compiled_. NOTE: required by setMatrix utility + * the Overlay is *compiled*. NOTE: required by setMatrix utility * functions to draw this layer fixed to the map */ protected MapPosition mMapPosition; + /** Wrap around dateline */ + protected boolean mFlipOnDateLine = true; + + /** Layer data for rendering */ public final ElementLayers layers; public ElementRenderer() { @@ -67,59 +78,55 @@ public abstract class ElementRenderer extends LayerRenderer { * Render all 'layers' */ @Override - protected synchronized void render(MapPosition curPos, Matrices m) { - MapPosition pos = mMapPosition; - - float div = (float) (curPos.scale / pos.scale); - - //float div = FastMath.pow(pos.zoomLevel - curPos.zoomLevel); + protected synchronized void render(MapPosition pos, Matrices m) { + MapPosition layerPos = mMapPosition; layers.vbo.bind(); GLState.test(false, false); GLState.blend(true); - if (layers.baseLayers != null) { - setMatrix(curPos, m, true); + float div = (float) (pos.scale / layerPos.scale); - for (RenderElement l = layers.baseLayers; l != null;) { - switch (l.type) { - case RenderElement.POLYGON: - l = PolygonLayer.Renderer.draw(curPos, l, m, true, 1, false); - break; + RenderElement l = layers.getBaseLayers(); - case RenderElement.LINE: - l = LineLayer.Renderer.draw(layers, l, curPos, m, div); - break; + if (l != null) + setMatrix(pos, m, true); - case RenderElement.TEXLINE: - l = LineTexLayer.Renderer.draw(layers, l, curPos, m, div); - break; - - case RenderElement.MESH: - l = MeshLayer.Renderer.draw(pos, l, m); - break; - - default: - log.debug("invalid layer"); - l = l.next; - break; - } + while (l != null) { + if (l.type == POLYGON) { + l = PolygonLayer.Renderer.draw(pos, l, m, true, 1, false); + continue; } + if (l.type == LINE) { + l = LineLayer.Renderer.draw(layers, l, pos, m, div); + continue; + } + if (l.type == TEXLINE) { + l = LineTexLayer.Renderer.draw(layers, l, pos, m, div); + continue; + } + if (l.type == MESH) { + l = MeshLayer.Renderer.draw(pos, l, m); + continue; + } + log.debug("invalid layer {}", l.type); + break; } - if (layers.textureLayers != null) { - setMatrix(curPos, m, false); - - for (RenderElement l = layers.textureLayers; l != null;) { - switch (l.type) { - case RenderElement.BITMAP: - l = BitmapLayer.Renderer.draw(l, m, 1, 1); - break; - - default: - l = TextureLayer.Renderer.draw(l, 1 / div, m); - } + l = layers.getTextureLayers(); + if (l != null) + setMatrix(pos, m, false); + while (l != null) { + if (l.type == BITMAP) { + l = BitmapLayer.Renderer.draw(l, m, 1, 1); + continue; } + if (l.type == SYMBOL) { + l = TextureLayer.Renderer.draw(l, 1 / div, m); + continue; + } + log.debug("invalid layer {}", l.type); + break; } } @@ -147,7 +154,7 @@ public abstract class ElementRenderer extends LayerRenderer { public static boolean uploadLayers(ElementLayers layers, int newSize, boolean addFill) { - // add fill coordinates + if (addFill) newSize += 8; @@ -192,11 +199,13 @@ public abstract class ElementRenderer extends LayerRenderer { double x = oPos.x - position.x; double y = oPos.y - position.y; - // wrap around date-line - // while (x < -1) - // x += 1.0; - // while (x > 2) - // x -= 1.0; + if (mFlipOnDateLine) { + //wrap around date-line + while (x < 0.5) + x += 1.0; + while (x > 0.5) + x -= 1.0; + } matrices.mvp.setTransScale((float) (x * tileScale), (float) (y * tileScale), diff --git a/vtm/src/org/oscim/renderer/ExtrusionRenderer.java b/vtm/src/org/oscim/renderer/ExtrusionRenderer.java index 891c27c4..036a2f3c 100644 --- a/vtm/src/org/oscim/renderer/ExtrusionRenderer.java +++ b/vtm/src/org/oscim/renderer/ExtrusionRenderer.java @@ -168,9 +168,9 @@ public class ExtrusionRenderer extends LayerRenderer { } private static ExtrusionLayer getLayer(MapTile t) { - if (t.layers != null && t.layers.extrusionLayers != null + if (t.layers != null && t.layers.getExtrusionLayers() != null && t.state(MapTile.STATE_READY)) - return (ExtrusionLayer) t.layers.extrusionLayers; + return (ExtrusionLayer) t.layers.getExtrusionLayers(); return null; } @@ -200,7 +200,7 @@ public class ExtrusionRenderer extends LayerRenderer { GLState.test(false, false); for (int i = 0; i < mTileCnt; i++) { - ExtrusionLayer el = (ExtrusionLayer) tiles[i].layers.extrusionLayers; + ExtrusionLayer el = tiles[i].layers.getExtrusionLayers(); setMatrix(pos, m, tiles[i], 0); m.mvp.setAsUniform(uExtMatrix); @@ -251,7 +251,7 @@ public class ExtrusionRenderer extends LayerRenderer { // draw to depth buffer for (int i = 0; i < mTileCnt; i++) { MapTile t = tiles[i]; - ExtrusionLayer el = (ExtrusionLayer) t.layers.extrusionLayers; + ExtrusionLayer el = t.layers.getExtrusionLayers(); int d = MapRenderer.depthOffset(t) * 10; setMatrix(pos, m, t, d); m.mvp.setAsUniform(uExtMatrix); @@ -277,7 +277,7 @@ public class ExtrusionRenderer extends LayerRenderer { for (int i = 0; i < mTileCnt; i++) { MapTile t = tiles[i]; - ExtrusionLayer el = (ExtrusionLayer) t.layers.extrusionLayers; + ExtrusionLayer el = t.layers.getExtrusionLayers(); if (el.colors == null) { currentColor = mColor; diff --git a/vtm/src/org/oscim/renderer/GridRenderer.java b/vtm/src/org/oscim/renderer/GridRenderer.java index 847915ca..2f1f20f9 100644 --- a/vtm/src/org/oscim/renderer/GridRenderer.java +++ b/vtm/src/org/oscim/renderer/GridRenderer.java @@ -137,7 +137,8 @@ public class GridRenderer extends ElementRenderer { if (mText != null) { addLabels(x, y, pos.zoomLevel); - mLineLayer.clear(); + + layers.setBaseLayers(mLineLayer); mLineLayer.addLine(mLines); } diff --git a/vtm/src/org/oscim/renderer/elements/BitmapLayer.java b/vtm/src/org/oscim/renderer/elements/BitmapLayer.java index e68e719c..4b669204 100644 --- a/vtm/src/org/oscim/renderer/elements/BitmapLayer.java +++ b/vtm/src/org/oscim/renderer/elements/BitmapLayer.java @@ -106,7 +106,7 @@ public class BitmapLayer extends TextureLayer { buf[pos++] = texMax; buf[pos++] = texMax; - setOffset(sbuf.position() * 2); + this.offset = sbuf.position() * 2; sbuf.put(buf); } @@ -215,7 +215,7 @@ public class BitmapLayer extends TextureLayer { // draw up to maxVertices in each iteration for (int i = 0; i < t.vertices; i += maxVertices) { // to.offset * (24(shorts) * 2(short-bytes) / 6(indices) == 8) - int off = (t.offset + i) * 8 + tl.getOffset(); + int off = (t.offset + i) * 8 + tl.offset; GL.glVertexAttribPointer(hTextureVertex, 4, GL20.GL_SHORT, false, 12, off); diff --git a/vtm/src/org/oscim/renderer/elements/ElementLayers.java b/vtm/src/org/oscim/renderer/elements/ElementLayers.java index d7745503..55798c7d 100644 --- a/vtm/src/org/oscim/renderer/elements/ElementLayers.java +++ b/vtm/src/org/oscim/renderer/elements/ElementLayers.java @@ -16,15 +16,24 @@ */ package org.oscim.renderer.elements; +import static org.oscim.renderer.elements.RenderElement.LINE; +import static org.oscim.renderer.elements.RenderElement.MESH; +import static org.oscim.renderer.elements.RenderElement.POLYGON; +import static org.oscim.renderer.elements.RenderElement.TEXLINE; + import java.nio.ShortBuffer; import org.oscim.backend.GL20; import org.oscim.renderer.BufferObject; import org.oscim.theme.styles.Line; -import org.oscim.utils.pool.Inlist; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/** + * This class is primarily intended for rendering the vector elements of a + * MapTile. It can be used for other purposes as well but some optimizations + * applied probably wont make sense in different contexts. + */ public class ElementLayers { static final Logger log = LoggerFactory.getLogger(ElementLayers.class); @@ -42,12 +51,13 @@ public class ElementLayers { } /** mixed Polygon- and LineLayer */ - public RenderElement baseLayers; + private RenderElement baseLayers; /** Text- and SymbolLayer */ - public RenderElement textureLayers; + private RenderElement textureLayers; + + private RenderElement extrusionLayers; - public RenderElement extrusionLayers; /** * VBO holds all vertex data to draw lines and polygons after compilation. * Layout: @@ -62,10 +72,9 @@ public class ElementLayers { * To not need to switch VertexAttribPointer positions all the time: * 1. polygons are packed in VBO at offset 0 * 2. lines afterwards at lineOffset - * 3. other layers keep their byte offset in RenderElement.offset + * 3. other layers keep their byte offset in offset */ - public int lineOffset; - public int texLineOffset; + public int[] offset = { 0, 0 }; private RenderElement mCurLayer; @@ -74,7 +83,7 @@ public class ElementLayers { * ordered from bottom (0) to top */ public LineLayer addLineLayer(int level, Line style) { - LineLayer ll = (LineLayer) getLayer(level, RenderElement.LINE); + LineLayer ll = (LineLayer) getLayer(level, LINE); if (ll == null) return null; @@ -89,7 +98,7 @@ public class ElementLayers { * bottom (0) to top */ public LineLayer getLineLayer(int level) { - return (LineLayer) getLayer(level, RenderElement.LINE); + return (LineLayer) getLayer(level, LINE); } /** @@ -97,7 +106,7 @@ public class ElementLayers { * bottom (0) to top */ public MeshLayer getMeshLayer(int level) { - return (MeshLayer) getLayer(level, RenderElement.MESH); + return (MeshLayer) getLayer(level, MESH); } /** @@ -105,7 +114,7 @@ public class ElementLayers { * bottom (0) to top */ public PolygonLayer getPolygonLayer(int level) { - return (PolygonLayer) getLayer(level, RenderElement.POLYGON); + return (PolygonLayer) getLayer(level, POLYGON); } /** @@ -113,7 +122,7 @@ public class ElementLayers { * bottom (0) to top */ public LineTexLayer getLineTexLayer(int level) { - return (LineTexLayer) getLayer(level, RenderElement.TEXLINE); + return (LineTexLayer) getLayer(level, TEXLINE); } public TextLayer addTextLayer(TextLayer textLayer) { @@ -122,86 +131,127 @@ public class ElementLayers { return textLayer; } - private RenderElement getLayer(int level, byte type) { - RenderElement l = baseLayers; - RenderElement renderElement = null; + public void setBaseLayers(RenderElement layers) { + for (RenderElement l = baseLayers; l != null; l = l.next) + l.clear(); - if (!(type == RenderElement.LINE - || type == RenderElement.POLYGON - || type == RenderElement.TEXLINE - || type == RenderElement.MESH)) - throw new IllegalArgumentException("invalid layer type"); + baseLayers = layers; + } + + public RenderElement getBaseLayers() { + return baseLayers; + } + + public void setTextureLayers(TextureLayer tl) { + for (RenderElement l = textureLayers; l != null; l = l.next) + l.clear(); + + textureLayers = tl; + } + + public RenderElement getTextureLayers() { + return textureLayers; + } + + public void setExtrusionLayers(ExtrusionLayer el) { + for (RenderElement l = extrusionLayers; l != null; l = l.next) + l.clear(); + + extrusionLayers = el; + } + + public ExtrusionLayer getExtrusionLayers() { + return (ExtrusionLayer) extrusionLayers; + } + + /** cleanup only when layers are not used by tile or overlay anymore! */ + public void clear() { + setBaseLayers(null); + setTextureLayers(null); + setExtrusionLayers(null); + mCurLayer = null; + + if (vbo != null) + vbo = BufferObject.release(vbo); + } + + private RenderElement getLayer(int level, int type) { + RenderElement layer = null; if (mCurLayer != null && mCurLayer.level == level) { - renderElement = mCurLayer; - } else { + layer = mCurLayer; + if (layer.type != type) { + log.error("BUG wrong layer {} {} on layer {}", + layer.type, type, level); - if (l == null || l.level > level) { - // insert new layer at start - l = null; - } else { - while (true) { - // found layer - if (l.level == level) { - renderElement = l; - break; - } - - // insert new layer between current and next layer - if (l.next == null || l.next.level > level) - break; - - l = l.next; - } + throw new IllegalArgumentException(); } + return layer; + } - if (renderElement == null) { - // add a new RenderElement - if (type == RenderElement.LINE) - renderElement = new LineLayer(level); - else if (type == RenderElement.POLYGON) - renderElement = new PolygonLayer(level); - else if (type == RenderElement.TEXLINE) - renderElement = new LineTexLayer(level); - else if (type == RenderElement.MESH) - renderElement = new MeshLayer(level); - - if (renderElement == null) - throw new IllegalArgumentException(); - - if (l == null) { - // insert at start - renderElement.next = baseLayers; - baseLayers = renderElement; - } else { - renderElement.next = l.next; - l.next = renderElement; + RenderElement l = baseLayers; + if (l == null || l.level > level) { + /** insert new layer at start */ + l = null; + } else { + while (true) { + /** found layer */ + if (l.level == level) { + layer = l; + break; } + /** insert layer between current and next layer */ + if (l.next == null || l.next.level > level) + break; + + l = l.next; } } - if (renderElement.type != type) { - // check if found layer matches requested type - log.debug("BUG wrong layer " + renderElement.type + " " + type + - " on layer " + renderElement.level); + if (layer == null) { + /** add a new RenderElement */ + if (type == LINE) + layer = new LineLayer(level); + else if (type == POLYGON) + layer = new PolygonLayer(level); + else if (type == TEXLINE) + layer = new LineTexLayer(level); + else if (type == MESH) + layer = new MeshLayer(level); + if (layer == null) + throw new IllegalArgumentException(); + + if (l == null) { + /** insert at start */ + layer.next = baseLayers; + baseLayers = layer; + } else { + layer.next = l.next; + l.next = layer; + } + } + + /** check if found layer matches requested type */ + if (layer.type != type) { + log.error("BUG wrong layer {} {} on layer {}", + layer.type, type, level); throw new IllegalArgumentException(); } - mCurLayer = renderElement; + mCurLayer = layer; - return renderElement; + return layer; } private final static int[] VERTEX_SHORT_CNT = { 4, // LINE_VERTEX_SHORTS + 6, // TEXLINE_VERTEX_SHORTS 2, // POLY_VERTEX_SHORTS 2, // MESH_VERTEX_SHORTS - 6, // TEXLINE_VERTEX_SHORTS }; private final static int TEXTURE_VERTEX_SHORTS = 6; - private final static int SHORT_BYTES = 2; public int getSize() { @@ -217,51 +267,32 @@ public class ElementLayers { } public void compile(ShortBuffer sbuf, boolean addFill) { - // offset from fill coordinates - int pos = 0; - int size = 0; - if (addFill) { - pos = 4; - size = 8; - } + addLayerItems(sbuf, baseLayers, POLYGON, addFill ? 4 : 0); - size += addLayerItems(sbuf, baseLayers, RenderElement.POLYGON, pos); + offset[LINE] = sbuf.position() * SHORT_BYTES; + addLayerItems(sbuf, baseLayers, LINE, 0); - lineOffset = size * SHORT_BYTES; - size += addLayerItems(sbuf, baseLayers, RenderElement.LINE, 0); - - texLineOffset = size * SHORT_BYTES; + //offset[TEXLINE] = size * SHORT_BYTES; for (RenderElement l = baseLayers; l != null; l = l.next) { - if (l.type == RenderElement.TEXLINE) { - addPoolItems(l, sbuf); - // add additional vertex for interleaving, - // see TexLineLayer. - sbuf.position(sbuf.position() + 6); + if (l.type == TEXLINE || l.type == MESH) { + l.compile(sbuf); } } - for (RenderElement l = baseLayers; l != null; l = l.next) { - if (l.type == RenderElement.MESH) - l.compile(sbuf); - } - for (RenderElement l = textureLayers; l != null; l = l.next) { - //TextureLayer tl = (TextureLayer) l; l.compile(sbuf); } - - // extrusion layers are compiled by extrusion overlay - // for (RenderElement l = extrusionLayers; l != null; l = l.next) { - // ExtrusionLayer tl = (ExtrusionLayer) l; - // tl.compile(sbuf); - // } } - // optimization for Line- and PolygonLayer: - // collect all pool items and add back in one go - private static int addLayerItems(ShortBuffer sbuf, RenderElement l, byte type, int pos) { + /** + * optimization for Line- and PolygonLayer: + * collect all pool items and add back in one go. + */ + private static int addLayerItems(ShortBuffer sbuf, RenderElement l, + int type, int pos) { + VertexItem last = null, items = null; int size = 0; @@ -283,7 +314,7 @@ public class ElementLayers { if (last == null) continue; - l.setOffset(pos); + l.offset = pos; pos += l.numVertices; last.next = items; @@ -298,8 +329,8 @@ public class ElementLayers { } static void addPoolItems(RenderElement l, ShortBuffer sbuf) { - // offset of layer data in vbo - l.setOffset(sbuf.position() * SHORT_BYTES); + /** keep offset of layer data in vbo */ + l.offset = sbuf.position() * SHORT_BYTES; for (VertexItem it = l.vertexItems; it != null; it = it.next) { if (it.next == null) @@ -310,39 +341,4 @@ public class ElementLayers { l.vertexItems = VertexItem.pool.releaseAll(l.vertexItems); } - - // cleanup only when layers are not used by tile or overlay anymore! - public void clear() { - - // clear line and polygon layers directly - for (RenderElement l = baseLayers; l != null; l = l.next) { - if (l.vertexItems != null) - l.vertexItems = VertexItem.pool.releaseAll(l.vertexItems); - l.numVertices = 0; - } - - for (RenderElement l = textureLayers; l != null; l = l.next) - l.clear(); - - for (RenderElement l = extrusionLayers; l != null; l = l.next) - l.clear(); - - baseLayers = null; - textureLayers = null; - extrusionLayers = null; - mCurLayer = null; - // if (vbo != null){ - // BufferObject.release(vbo); - // vbo = null; - // } - } - - public void add(ExtrusionLayer l) { - extrusionLayers = Inlist.appendItem(extrusionLayers, l); - } - - public ExtrusionLayer getExtrusionLayers() { - return (ExtrusionLayer) extrusionLayers; - } - } diff --git a/vtm/src/org/oscim/renderer/elements/LineLayer.java b/vtm/src/org/oscim/renderer/elements/LineLayer.java index a69dd8dd..4a240c36 100644 --- a/vtm/src/org/oscim/renderer/elements/LineLayer.java +++ b/vtm/src/org/oscim/renderer/elements/LineLayer.java @@ -16,8 +16,6 @@ */ package org.oscim.renderer.elements; -import java.nio.ShortBuffer; - import org.oscim.backend.GL20; import org.oscim.backend.GLAdapter; import org.oscim.backend.canvas.Paint.Cap; @@ -556,16 +554,6 @@ public final class LineLayer extends RenderElement { si.used = opos; } - @Override - public void clear() { - vertexItems = VertexItem.pool.releaseAll(vertexItems); - numVertices = 0; - } - - @Override - protected void compile(ShortBuffer sbuf) { - } - public static final class Renderer { // TODO: http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter22.html @@ -668,7 +656,7 @@ public final class LineLayer extends RenderElement { GLState.enableVertexArrays(hLineVertexPosition[mode], -1); GL.glVertexAttribPointer(hLineVertexPosition[mode], 4, GL20.GL_SHORT, - false, 0, layers.lineOffset); + false, 0, layers.offset[LINE]); m.mvp.setAsUniform(hLineMatrix[mode]); @@ -745,7 +733,7 @@ public final class LineLayer extends RenderElement { } GL.glDrawArrays(GL20.GL_TRIANGLE_STRIP, - l.getOffset(), l.numVertices); + l.offset, l.numVertices); continue; } @@ -781,7 +769,7 @@ public final class LineLayer extends RenderElement { } GL.glDrawArrays(GL20.GL_TRIANGLE_STRIP, - o.getOffset(), o.numVertices); + o.offset, o.numVertices); } } diff --git a/vtm/src/org/oscim/renderer/elements/LineTexLayer.java b/vtm/src/org/oscim/renderer/elements/LineTexLayer.java index 48410757..89c801c7 100644 --- a/vtm/src/org/oscim/renderer/elements/LineTexLayer.java +++ b/vtm/src/org/oscim/renderer/elements/LineTexLayer.java @@ -246,12 +246,12 @@ public final class LineTexLayer extends RenderElement { si.used = opos; } - @Override - protected void clear() { - } - @Override protected void compile(ShortBuffer sbuf) { + ElementLayers.addPoolItems(this, sbuf); + // add additional vertex for interleaving, + // see TexLineLayer. + sbuf.position(sbuf.position() + 6); } public final static class Renderer { @@ -369,7 +369,6 @@ public final class LineTexLayer extends RenderElement { for (; l != null && l.type == RenderElement.TEXLINE; l = l.next) { LineTexLayer ll = (LineTexLayer) l; Line line = ll.line; - int lOffset = l.getOffset(); GLUtils.setColor(hTexColor, line.stippleColor, 1); GLUtils.setColor(hBgColor, line.color, 1); @@ -396,7 +395,7 @@ public final class LineTexLayer extends RenderElement { numIndices = maxIndices; // i / 6 * (24 shorts per block * 2 short bytes) - int add = (lOffset + i * 8) + vOffset; + int add = (l.offset + i * 8) + vOffset; GL.glVertexAttribPointer(hVertexPosition0, 4, GL20.GL_SHORT, false, STRIDE, @@ -425,7 +424,7 @@ public final class LineTexLayer extends RenderElement { if (numIndices > maxIndices) numIndices = maxIndices; // i / 6 * (24 shorts per block * 2 short bytes) - int add = (lOffset + i * 8) + vOffset; + int add = (l.offset + i * 8) + vOffset; GL.glVertexAttribPointer(hVertexPosition0, 4, GL20.GL_SHORT, false, STRIDE, diff --git a/vtm/src/org/oscim/renderer/elements/MeshLayer.java b/vtm/src/org/oscim/renderer/elements/MeshLayer.java index 872e3835..503113aa 100644 --- a/vtm/src/org/oscim/renderer/elements/MeshLayer.java +++ b/vtm/src/org/oscim/renderer/elements/MeshLayer.java @@ -144,7 +144,7 @@ public class MeshLayer extends RenderElement { GLUtils.setColor(hColor, ml.area.color, 1); GL.glVertexAttribPointer(hVertexPosition, 2, GL20.GL_SHORT, - false, 0, ml.getOffset()); + false, 0, ml.offset); GL.glDrawElements(GL20.GL_TRIANGLES, ml.numIndices, GL20.GL_UNSIGNED_SHORT, 0); diff --git a/vtm/src/org/oscim/renderer/elements/PolygonLayer.java b/vtm/src/org/oscim/renderer/elements/PolygonLayer.java index 5570f112..aaf75cf1 100644 --- a/vtm/src/org/oscim/renderer/elements/PolygonLayer.java +++ b/vtm/src/org/oscim/renderer/elements/PolygonLayer.java @@ -19,7 +19,6 @@ package org.oscim.renderer.elements; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; -import java.nio.ShortBuffer; import org.oscim.backend.GL20; import org.oscim.backend.GLAdapter; @@ -117,14 +116,6 @@ public final class PolygonLayer extends RenderElement { si.used = outPos; } - @Override - protected void compile(ShortBuffer sbuf) { - } - - @Override - protected void clear() { - } - public static final class Renderer { private static final int POLYGON_VERTICES_DATA_POS_OFFSET = 0; @@ -326,7 +317,7 @@ public final class PolygonLayer extends RenderElement { // set stencil mask to draw to GL.glStencilMask(1 << cur++); - GL.glDrawArrays(GL20.GL_TRIANGLE_FAN, l.getOffset(), l.numVertices); + GL.glDrawArrays(GL20.GL_TRIANGLE_FAN, l.offset, l.numVertices); // draw up to 7 layers into stencil buffer if (cur == STENCIL_BITS - 1) { diff --git a/vtm/src/org/oscim/renderer/elements/RenderElement.java b/vtm/src/org/oscim/renderer/elements/RenderElement.java index e4f1f3c8..b9351168 100644 --- a/vtm/src/org/oscim/renderer/elements/RenderElement.java +++ b/vtm/src/org/oscim/renderer/elements/RenderElement.java @@ -24,45 +24,45 @@ import org.oscim.utils.pool.Inlist; public abstract class RenderElement extends Inlist { protected static GL20 GL; - public final static byte LINE = 0; - public final static byte POLYGON = 1; - public final static byte MESH = 2; - public final static byte TEXLINE = 3; - public final static byte SYMBOL = 4; - public final static byte BITMAP = 5; - public final static byte EXTRUSION = 6; + public final static int LINE = 0; + public final static int TEXLINE = 1; + public final static int POLYGON = 2; + public final static int MESH = 3; + public final static int SYMBOL = 4; + public final static int BITMAP = 5; + public final static int EXTRUSION = 6; - protected RenderElement(byte type) { + public final int type; + + /** drawing order from bottom to top. */ + int level; + + /** number of vertices for this layer. */ + protected int numVertices; + + /** temporary list of vertex data. */ + protected VertexItem vertexItems; + + protected RenderElement(int type) { this.type = type; } - public final byte type; + /** clear all resources. */ + protected void clear() { + if (vertexItems != null) + vertexItems = VertexItem.pool.releaseAll(vertexItems); + numVertices = 0; + } - /** drawing order from bottom to top */ - int level; + /** compile vertex data to vbo. */ + protected void compile(ShortBuffer sbuf) { - /** number of vertices for this layer */ - protected int numVertices; - - protected VertexItem vertexItems; - - abstract protected void compile(ShortBuffer sbuf); - - abstract protected void clear(); + } /** - * for line and polygon layers: - * - number of VERTICES mOffset for this layertype in VBO - * otherwise: - * - offset in byte in VBO + * For line- and polygon-layers this is the offset + * of VERTICES in its layers.vbo. + * For all other types it is the byte offset in vbo. */ - private int mOffset; - - public int getOffset() { - return mOffset; - } - - public void setOffset(int offset) { - mOffset = offset; - } + protected int offset; } diff --git a/vtm/src/org/oscim/renderer/elements/SymbolLayer.java b/vtm/src/org/oscim/renderer/elements/SymbolLayer.java index 7804af69..85ae1803 100644 --- a/vtm/src/org/oscim/renderer/elements/SymbolLayer.java +++ b/vtm/src/org/oscim/renderer/elements/SymbolLayer.java @@ -62,7 +62,7 @@ public final class SymbolLayer extends TextureLayer { @Override protected void compile(ShortBuffer sbuf) { // offset of layer data in vbo - setOffset(sbuf.position() * 2); //SHORT_BYTES; + this.offset = sbuf.position() * 2; //SHORT_BYTES; short numIndices = 0; diff --git a/vtm/src/org/oscim/renderer/elements/TextureLayer.java b/vtm/src/org/oscim/renderer/elements/TextureLayer.java index 6483ce60..c1bd8b55 100644 --- a/vtm/src/org/oscim/renderer/elements/TextureLayer.java +++ b/vtm/src/org/oscim/renderer/elements/TextureLayer.java @@ -42,7 +42,7 @@ public abstract class TextureLayer extends RenderElement { TEXTURE_WIDTH, TEXTURE_HEIGHT); - protected TextureLayer(byte type) { + protected TextureLayer(int type) { super(type); } @@ -174,7 +174,7 @@ public abstract class TextureLayer extends RenderElement { // draw up to maxVertices in each iteration for (int i = 0; i < t.vertices; i += maxVertices) { // to.offset * (24(shorts) * 2(short-bytes) / 6(indices) == 8) - int off = (t.offset + i) * 8 + tl.getOffset(); + int off = (t.offset + i) * 8 + tl.offset; GL.glVertexAttribPointer(hTextureVertex, 4, GL20.GL_SHORT, false, 12, off); diff --git a/vtm/src/org/oscim/renderer/test/AtlasRenderLayer.java b/vtm/src/org/oscim/renderer/test/AtlasRenderLayer.java index e2a375aa..b4fd9795 100644 --- a/vtm/src/org/oscim/renderer/test/AtlasRenderLayer.java +++ b/vtm/src/org/oscim/renderer/test/AtlasRenderLayer.java @@ -56,7 +56,7 @@ public class AtlasRenderLayer extends ElementRenderer { TextLayer tl = new TextLayer(); Text t = Text.createText(20, 0, Color.BLACK, 0, false); - layers.textureLayers = tl; + layers.setTextureLayers(tl); float[] points = new float[10]; diff --git a/vtm/src/org/oscim/renderer/test/SymbolRenderLayer.java b/vtm/src/org/oscim/renderer/test/SymbolRenderLayer.java index 5cf4e9ea..aa3cd1b9 100644 --- a/vtm/src/org/oscim/renderer/test/SymbolRenderLayer.java +++ b/vtm/src/org/oscim/renderer/test/SymbolRenderLayer.java @@ -28,7 +28,7 @@ public class SymbolRenderLayer extends ElementRenderer { public SymbolRenderLayer() { SymbolLayer l = new SymbolLayer(); - layers.textureLayers = l; + layers.setTextureLayers(l); SymbolItem it = SymbolItem.pool.get(); it.billboard = false; diff --git a/vtm/src/org/oscim/tiling/MapTile.java b/vtm/src/org/oscim/tiling/MapTile.java index 895f4840..ac603c97 100644 --- a/vtm/src/org/oscim/tiling/MapTile.java +++ b/vtm/src/org/oscim/tiling/MapTile.java @@ -17,7 +17,6 @@ package org.oscim.tiling; import org.oscim.core.Tile; -import org.oscim.renderer.BufferObject; import org.oscim.renderer.elements.ElementLayers; import org.oscim.renderer.elements.SymbolItem; import org.oscim.renderer.elements.TextItem; @@ -226,8 +225,6 @@ public class MapTile extends Tile { */ protected void clear() { if (layers != null) { - // TODO move this to layers clear - layers.vbo = BufferObject.release(layers.vbo); layers.clear(); layers = null; } diff --git a/vtm/src/org/oscim/tiling/TileRenderer.java b/vtm/src/org/oscim/tiling/TileRenderer.java index b256077d..8fd6eb52 100644 --- a/vtm/src/org/oscim/tiling/TileRenderer.java +++ b/vtm/src/org/oscim/tiling/TileRenderer.java @@ -16,6 +16,11 @@ */ package org.oscim.tiling; +import static org.oscim.renderer.elements.RenderElement.BITMAP; +import static org.oscim.renderer.elements.RenderElement.LINE; +import static org.oscim.renderer.elements.RenderElement.MESH; +import static org.oscim.renderer.elements.RenderElement.POLYGON; +import static org.oscim.renderer.elements.RenderElement.TEXLINE; import static org.oscim.tiling.MapTile.STATE_NEW_DATA; import static org.oscim.tiling.MapTile.STATE_READY; @@ -178,19 +183,19 @@ public class TileRenderer extends LayerRenderer { return 1; int newSize = tile.layers.getSize(); - if (newSize > 0) { + if (newSize <= 0) + return 1; - if (tile.layers.vbo == null) - tile.layers.vbo = BufferObject.get(GL20.GL_ARRAY_BUFFER, newSize); + if (tile.layers.vbo == null) + tile.layers.vbo = BufferObject.get(GL20.GL_ARRAY_BUFFER, newSize); - if (!ElementRenderer.uploadLayers(tile.layers, newSize, true)) { - log.debug("BUG uploadTileData " + tile + " failed!"); + if (!ElementRenderer.uploadLayers(tile.layers, newSize, true)) { + log.debug("BUG uploadTileData " + tile + " failed!"); - tile.layers.vbo = BufferObject.release(tile.layers.vbo); - tile.layers.clear(); - tile.layers = null; - return 0; - } + tile.layers.vbo = BufferObject.release(tile.layers.vbo); + tile.layers.clear(); + tile.layers = null; + return 0; } return 1; @@ -395,7 +400,8 @@ public class TileRenderer extends LayerRenderer { for (int i = 0; i < tileCnt; i++) { MapTile t = tiles[i]; if (t.isVisible && (t.state != STATE_READY) && (t.holder == null)) { - boolean preferParent = (scale > 1.5) || (pos.zoomLevel - t.zoomLevel < 0); + boolean preferParent = (scale > 1.5) + || (pos.zoomLevel - t.zoomLevel < 0); drawProxyTile(t, pos, true, preferParent); } } @@ -416,33 +422,29 @@ public class TileRenderer extends LayerRenderer { } private void drawTile(MapTile tile, MapPosition pos) { - // draw parents only once + /** ensure to draw parents only once */ if (tile.lastDraw == mDrawSerial) return; tile.lastDraw = mDrawSerial; - MapTile t = tile; - if (t.holder != null) - t = t.holder; + /** use holder proxy when it is set */ + MapTile t = tile.holder == null ? tile : tile.holder; - if (t.layers == null || t.layers.vbo == null) { - //log.debug("missing data " + (t.layers == null) + " " + (t.vbo == null)); + if (t.layers == null || t.layers.vbo == null) + //throw new IllegalStateException(t + "no data " + (t.layers == null)); return; - } t.layers.vbo.bind(); - // place tile relative to map position + /** place tile relative to map position */ int z = tile.zoomLevel; - float div = FastMath.pow(z - pos.zoomLevel); - double tileScale = Tile.SIZE * pos.scale; float x = (float) ((tile.x - pos.x) * tileScale); float y = (float) ((tile.y - pos.y) * tileScale); - // scale relative to zoom-level of this tile + /** scale relative to zoom-level of this tile */ float scale = (float) (pos.scale / (1 << z)); Matrices m = mMatrices; @@ -450,64 +452,46 @@ public class TileRenderer extends LayerRenderer { m.mvp.multiplyLhs(m.viewproj); boolean clipped = false; + RenderElement l = t.layers.getBaseLayers(); - for (RenderElement l = t.layers.baseLayers; l != null;) { - switch (l.type) { - case RenderElement.POLYGON: - l = PolygonLayer.Renderer.draw(pos, l, m, !clipped, div, true); - clipped = true; - break; - - case RenderElement.LINE: - if (!clipped) { - clipped = true; - PolygonLayer.Renderer.draw(pos, null, m, true, div, true); - } - l = LineLayer.Renderer.draw(t.layers, l, pos, m, scale); - break; - - case RenderElement.TEXLINE: - if (!clipped) { - clipped = true; - PolygonLayer.Renderer.draw(pos, null, m, true, div, true); - } - l = LineTexLayer.Renderer.draw(t.layers, l, pos, m, div); - break; - - case RenderElement.MESH: - if (!clipped) { - clipped = true; - PolygonLayer.Renderer.draw(pos, null, m, true, div, true); - } - l = MeshLayer.Renderer.draw(pos, l, m); - break; - - default: - // just in case - l = l.next; + while (l != null) { + if (l.type == POLYGON) { + l = PolygonLayer.Renderer.draw(pos, l, m, !clipped, div, true); + clipped = true; + continue; } - } - - for (RenderElement l = t.layers.textureLayers; l != null;) { if (!clipped) { // draw stencil buffer clip region PolygonLayer.Renderer.draw(pos, null, m, true, div, true); clipped = true; } - // if (!clipped) { - // // draw stencil buffer clip region - // PolygonRenderer.clip(m); - // clipped = true; - // } - //GLState.test(false, false); - switch (l.type) { - case RenderElement.BITMAP: - l = BitmapLayer.Renderer.draw(l, m, 1, mRenderAlpha); - break; - - default: - l = l.next; + if (l.type == LINE) { + l = LineLayer.Renderer.draw(t.layers, l, pos, m, scale); + continue; } + if (l.type == TEXLINE) { + l = LineTexLayer.Renderer.draw(t.layers, l, pos, m, div); + continue; + } + if (l.type == MESH) { + l = MeshLayer.Renderer.draw(pos, l, m); + continue; + } + // just in case + l = l.next; + } + + l = t.layers.getTextureLayers(); + while (l != null) { + if (!clipped) { + PolygonLayer.Renderer.draw(pos, null, m, true, div, true); + clipped = true; + } + if (l.type == BITMAP) { + l = BitmapLayer.Renderer.draw(l, m, 1, mRenderAlpha); + continue; + } + l = l.next; } if (t.fadeTime == 0) From 20ddff3d267265ec8822c8ac96fb7daf73d37d45 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Wed, 29 Jan 2014 17:52:03 +0100 Subject: [PATCH 2/6] use depth clipping again but only when proxy tiles are drawn --- .../org/oscim/renderer/ElementRenderer.java | 2 +- .../oscim/renderer/elements/PolygonLayer.java | 33 +++++++++-- vtm/src/org/oscim/tiling/TileRenderer.java | 57 +++++++++++++------ 3 files changed, 67 insertions(+), 25 deletions(-) diff --git a/vtm/src/org/oscim/renderer/ElementRenderer.java b/vtm/src/org/oscim/renderer/ElementRenderer.java index 1f5b5623..be77696e 100644 --- a/vtm/src/org/oscim/renderer/ElementRenderer.java +++ b/vtm/src/org/oscim/renderer/ElementRenderer.java @@ -94,7 +94,7 @@ public abstract class ElementRenderer extends LayerRenderer { while (l != null) { if (l.type == POLYGON) { - l = PolygonLayer.Renderer.draw(pos, l, m, true, 1, false); + l = PolygonLayer.Renderer.draw(pos, l, m, true, 1, 0); continue; } if (l.type == LINE) { diff --git a/vtm/src/org/oscim/renderer/elements/PolygonLayer.java b/vtm/src/org/oscim/renderer/elements/PolygonLayer.java index aaf75cf1..d7f3619f 100644 --- a/vtm/src/org/oscim/renderer/elements/PolygonLayer.java +++ b/vtm/src/org/oscim/renderer/elements/PolygonLayer.java @@ -279,7 +279,7 @@ public final class PolygonLayer extends RenderElement { * next layer */ public static RenderElement draw(MapPosition pos, RenderElement renderElement, - Matrices m, boolean first, float div, boolean clip) { + Matrices m, boolean first, float div, int clip) { GLState.test(false, true); @@ -305,7 +305,7 @@ public final class PolygonLayer extends RenderElement { continue; if (cur == start) { - drawStencilRegion(first); + drawStencilRegion(first, clip); first = false; // op for stencil method polygon drawing @@ -329,9 +329,9 @@ public final class PolygonLayer extends RenderElement { if (cur > 0) fillPolygons(m, start, cur, zoom, scale, div); - if (clip) { + if (clip > 0) { if (first) { - drawStencilRegion(first); + drawStencilRegion(first, clip); // disable writes to stencil buffer GL.glStencilMask(0x00); // enable writes to color buffer @@ -350,7 +350,7 @@ public final class PolygonLayer extends RenderElement { public static void clip(Matrices m) { setShader(polyShader, m); - drawStencilRegion(true); + drawStencilRegion(true, 1); // disable writes to stencil buffer GL.glStencilMask(0x00); // enable writes to color buffer @@ -364,7 +364,7 @@ public final class PolygonLayer extends RenderElement { * @param first in the first run the clip region is set based on * depth buffer and depth buffer is updated */ - static void drawStencilRegion(boolean first) { + static void drawStencilRegion(boolean first, int mode) { // disable drawing to color buffer GL.glColorMask(false, false, false, false); @@ -373,6 +373,21 @@ public final class PolygonLayer extends RenderElement { GL.glStencilMask(0xFF); if (first) { + // clear previous clip-region from stencil buffer + //GL.glClear(GL20.GL_STENCIL_BUFFER_BIT); + + // Draw clip-region into depth and stencil buffer + // this is used for tile line and polygon layers. + // Depth offset is increased for each tile. Together + // with depth test (GL_LESS) this ensures to only + // draw where no other tile has drawn yet. + //GL.glEnable(GL20.GL_POLYGON_OFFSET_FILL); + if (mode > 1) { + // test GL_LESS and write to depth buffer + GLState.test(true, true); + GL.glDepthMask(true); + } + // always pass stencil test and set clip bit GL.glStencilFunc(GL20.GL_ALWAYS, CLIP_BIT, 0x00); } else { @@ -388,6 +403,12 @@ public final class PolygonLayer extends RenderElement { GL.glDrawArrays(GL20.GL_TRIANGLE_STRIP, 0, 4); if (first) { + if (mode > 1) { + // dont modify depth buffer + GL.glDepthMask(false); + // test only stencil + GLState.test(false, true); + } GL.glStencilFunc(GL20.GL_EQUAL, CLIP_BIT, CLIP_BIT); } } diff --git a/vtm/src/org/oscim/tiling/TileRenderer.java b/vtm/src/org/oscim/tiling/TileRenderer.java index 8fd6eb52..044cec66 100644 --- a/vtm/src/org/oscim/tiling/TileRenderer.java +++ b/vtm/src/org/oscim/tiling/TileRenderer.java @@ -369,6 +369,7 @@ public class TileRenderer extends LayerRenderer { // tile twice per frame. private int mDrawSerial = 0; private Matrices mMatrices; + private int mClipMode = 0; /** * Draw tiles: @@ -382,6 +383,16 @@ public class TileRenderer extends LayerRenderer { mMatrices = m; + mClipMode = 1; + + for (int i = 0; i < tileCnt; i++) { + MapTile t = tiles[i]; + if (t.isVisible && t.state != STATE_READY) { + mClipMode = 2; + break; + } + } + /** draw visible tiles */ for (int i = 0; i < tileCnt; i++) { MapTile t = tiles[i]; @@ -395,27 +406,36 @@ public class TileRenderer extends LayerRenderer { * was drawn to depth buffer. * TODO draw proxies for placeholder */ - double scale = pos.getZoomScale(); + if (mClipMode > 1) { + mClipMode = 3; + //GL.glClear(GL20.GL_DEPTH_BUFFER_BIT); - for (int i = 0; i < tileCnt; i++) { - MapTile t = tiles[i]; - if (t.isVisible && (t.state != STATE_READY) && (t.holder == null)) { - boolean preferParent = (scale > 1.5) - || (pos.zoomLevel - t.zoomLevel < 0); - drawProxyTile(t, pos, true, preferParent); + GL.glDepthFunc(GL20.GL_LESS); + + double scale = pos.getZoomScale(); + for (int i = 0; i < tileCnt; i++) { + MapTile t = tiles[i]; + if (t.isVisible + && (t.state != STATE_READY) + && (t.holder == null)) { + boolean preferParent = (scale > 1.5) + || (pos.zoomLevel - t.zoomLevel < 0); + drawProxyTile(t, pos, true, preferParent); + } } - } - /** draw grandparents */ - for (int i = 0; i < tileCnt; i++) { - MapTile t = tiles[i]; - if (t.isVisible && (t.state != STATE_READY) && (t.holder == null)) - drawProxyTile(t, pos, false, false); + /** draw grandparents */ + for (int i = 0; i < tileCnt; i++) { + MapTile t = tiles[i]; + if (t.isVisible + && (t.state != STATE_READY) + && (t.holder == null)) + drawProxyTile(t, pos, false, false); + } + GL.glDepthMask(false); } - /** make sure stencil buffer write is disabled */ GL.glStencilMask(0x00); - GL.glDepthMask(false); mDrawSerial++; mMatrices = null; @@ -452,17 +472,18 @@ public class TileRenderer extends LayerRenderer { m.mvp.multiplyLhs(m.viewproj); boolean clipped = false; + int mode = mClipMode; RenderElement l = t.layers.getBaseLayers(); while (l != null) { if (l.type == POLYGON) { - l = PolygonLayer.Renderer.draw(pos, l, m, !clipped, div, true); + l = PolygonLayer.Renderer.draw(pos, l, m, !clipped, div, mode); clipped = true; continue; } if (!clipped) { // draw stencil buffer clip region - PolygonLayer.Renderer.draw(pos, null, m, true, div, true); + PolygonLayer.Renderer.draw(pos, null, m, true, div, mode); clipped = true; } if (l.type == LINE) { @@ -484,7 +505,7 @@ public class TileRenderer extends LayerRenderer { l = t.layers.getTextureLayers(); while (l != null) { if (!clipped) { - PolygonLayer.Renderer.draw(pos, null, m, true, div, true); + PolygonLayer.Renderer.draw(pos, null, m, true, div, mode); clipped = true; } if (l.type == BITMAP) { From e0e94f7286427a0ee2db7c518cac6aff3de2388a Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Fri, 31 Jan 2014 02:04:02 +0100 Subject: [PATCH 3/6] cleanup TileRenderer --- vtm/src/org/oscim/tiling/TileRenderer.java | 162 +++++++++------------ 1 file changed, 71 insertions(+), 91 deletions(-) diff --git a/vtm/src/org/oscim/tiling/TileRenderer.java b/vtm/src/org/oscim/tiling/TileRenderer.java index 044cec66..68154a95 100644 --- a/vtm/src/org/oscim/tiling/TileRenderer.java +++ b/vtm/src/org/oscim/tiling/TileRenderer.java @@ -64,6 +64,12 @@ public class TileRenderer extends LayerRenderer { private int mRenderOverdraw; private float mRenderAlpha; + // Current number of frames drawn, used to not draw a + // tile twice per frame. + private int mDrawSerial; + private int mClipMode; + private Matrices mMatrices; + /** * Threadsafe */ @@ -117,7 +123,69 @@ public class TileRenderer extends LayerRenderer { BufferObject.checkBufferUsage(false); } - draw(tiles, tileCnt, pos, m); + mMatrices = m; + mClipMode = 1; + + for (int i = 0; i < tileCnt; i++) { + MapTile t = tiles[i]; + if (t.isVisible && t.state != STATE_READY) { + mClipMode = 2; + break; + } + } + + /** draw visible tiles */ + for (int i = 0; i < tileCnt; i++) { + MapTile t = tiles[i]; + if (t.isVisible && t.state == STATE_READY) + drawTile(t, pos); + } + + /** + * draw parent or children as proxy for visibile tiles that dont + * have data yet. Proxies are clipped to the region where nothing + * was drawn to depth buffer. + * TODO draw proxies for placeholder + */ + if (mClipMode > 1) { + mClipMode = 3; + //GL.glClear(GL20.GL_DEPTH_BUFFER_BIT); + + GL.glDepthFunc(GL20.GL_LESS); + + double scale = pos.getZoomScale(); + for (int i = 0; i < tileCnt; i++) { + MapTile t = tiles[i]; + if (t.isVisible + && (t.state != STATE_READY) + && (t.holder == null)) { + boolean preferParent = (scale > 1.5) + || (pos.zoomLevel - t.zoomLevel < 0); + drawProxyTile(t, pos, true, preferParent); + } + } + + /** draw grandparents */ + for (int i = 0; i < tileCnt; i++) { + MapTile t = tiles[i]; + if (t.isVisible + && (t.state != STATE_READY) + && (t.holder == null)) + drawProxyTile(t, pos, false, false); + } + GL.glDepthMask(false); + } + + /** make sure stencil buffer write is disabled */ + GL.glStencilMask(0x00); + + mDrawSerial++; + mMatrices = null; + } + + @Override + protected void render(MapPosition position, Matrices matrices) { + // render in update() so that tiles cannot vanish in between. } public void clearTiles() { @@ -272,23 +340,15 @@ public class TileRenderer extends LayerRenderer { tileSet.releaseTiles(); } - // Add additional tiles that serve as placeholer when flipping - // over date-line. - // I dont really like this but cannot think of a better solution: - // The other option would be to run scanbox each time for upload, - // drawing, proxies and text layer. Adding placeholder only - // happens rarely, unless you live on Fidschi - /* package */int mNumTileHolder; /* package */TileSet mDrawTiles = new TileSet(); - // scanline fill class used to check tile visibility + /** scanline fill class used to check tile visibility */ private final ScanBox mScanBox = new ScanBox() { @Override protected void setVisible(int y, int x1, int x2) { - int cnt = mDrawTiles.cnt; - MapTile[] tiles = mDrawTiles.tiles; + int cnt = mDrawTiles.cnt; for (int i = 0; i < cnt; i++) { MapTile t = tiles[i]; @@ -365,82 +425,6 @@ public class TileRenderer extends LayerRenderer { return maxFade; } - // Current number of frames drawn, used to not draw a - // tile twice per frame. - private int mDrawSerial = 0; - private Matrices mMatrices; - private int mClipMode = 0; - - /** - * Draw tiles: - * - * @param fade - * alpha value for bitmap tiles - * @param overdrawColor - * draw color on top, e.g. to darken the layer temporarily - */ - private void draw(MapTile[] tiles, int tileCnt, MapPosition pos, Matrices m) { - - mMatrices = m; - - mClipMode = 1; - - for (int i = 0; i < tileCnt; i++) { - MapTile t = tiles[i]; - if (t.isVisible && t.state != STATE_READY) { - mClipMode = 2; - break; - } - } - - /** draw visible tiles */ - for (int i = 0; i < tileCnt; i++) { - MapTile t = tiles[i]; - if (t.isVisible && t.state == STATE_READY) - drawTile(t, pos); - } - - /** - * draw parent or children as proxy for visibile tiles that dont - * have data yet. Proxies are clipped to the region where nothing - * was drawn to depth buffer. - * TODO draw proxies for placeholder - */ - if (mClipMode > 1) { - mClipMode = 3; - //GL.glClear(GL20.GL_DEPTH_BUFFER_BIT); - - GL.glDepthFunc(GL20.GL_LESS); - - double scale = pos.getZoomScale(); - for (int i = 0; i < tileCnt; i++) { - MapTile t = tiles[i]; - if (t.isVisible - && (t.state != STATE_READY) - && (t.holder == null)) { - boolean preferParent = (scale > 1.5) - || (pos.zoomLevel - t.zoomLevel < 0); - drawProxyTile(t, pos, true, preferParent); - } - } - - /** draw grandparents */ - for (int i = 0; i < tileCnt; i++) { - MapTile t = tiles[i]; - if (t.isVisible - && (t.state != STATE_READY) - && (t.holder == null)) - drawProxyTile(t, pos, false, false); - } - GL.glDepthMask(false); - } - /** make sure stencil buffer write is disabled */ - GL.glStencilMask(0x00); - - mDrawSerial++; - mMatrices = null; - } - private void drawTile(MapTile tile, MapPosition pos) { /** ensure to draw parents only once */ if (tile.lastDraw == mDrawSerial) @@ -617,8 +601,4 @@ public class TileRenderer extends LayerRenderer { } } } - - @Override - protected void render(MapPosition position, Matrices matrices) { - } } From 67d1813665a282d76c00cbb7942ecb97beed9e54 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Fri, 31 Jan 2014 01:44:27 +0100 Subject: [PATCH 4/6] remove depth-projection from viewproj for tile rendering, again - fixes issue with flickering when proxy tiles are drawn, where the depth buffer is used to remember previous clipping areas --- vtm/src/org/oscim/tiling/TileRenderer.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/vtm/src/org/oscim/tiling/TileRenderer.java b/vtm/src/org/oscim/tiling/TileRenderer.java index 68154a95..1f571183 100644 --- a/vtm/src/org/oscim/tiling/TileRenderer.java +++ b/vtm/src/org/oscim/tiling/TileRenderer.java @@ -30,6 +30,7 @@ import org.oscim.core.MapPosition; import org.oscim.core.Tile; import org.oscim.renderer.BufferObject; import org.oscim.renderer.ElementRenderer; +import org.oscim.renderer.GLMatrix; import org.oscim.renderer.LayerRenderer; import org.oscim.renderer.MapRenderer; import org.oscim.renderer.MapRenderer.Matrices; @@ -68,6 +69,8 @@ public class TileRenderer extends LayerRenderer { // tile twice per frame. private int mDrawSerial; private int mClipMode; + + private GLMatrix mViewProj = new GLMatrix(); private Matrices mMatrices; /** @@ -108,6 +111,15 @@ public class TileRenderer extends LayerRenderer { mRenderAlpha = mAlpha; mRenderOverdraw = mOverdraw; + /** + * discard depth projection from tilt, depth buffer + * is used for clipping + */ + mViewProj.copy(m.proj); + mViewProj.setValue(10, 0); + mViewProj.setValue(14, 0); + mViewProj.multiplyRhs(m.view); + int tileCnt = mDrawTiles.cnt; MapTile[] tiles = mDrawTiles.tiles; @@ -453,7 +465,7 @@ public class TileRenderer extends LayerRenderer { Matrices m = mMatrices; m.mvp.setTransScale(x, y, scale / MapRenderer.COORD_SCALE); - m.mvp.multiplyLhs(m.viewproj); + m.mvp.multiplyLhs(mViewProj); boolean clipped = false; int mode = mClipMode; From c5de7d60513c01e609c9387c9f99d7915db0e9c7 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Fri, 31 Jan 2014 02:03:48 +0100 Subject: [PATCH 5/6] change parameter order to be more consistent --- .../tile/vector/labeling/TextRenderer.java | 2 +- .../org/oscim/renderer/ElementRenderer.java | 10 +++---- .../oscim/renderer/elements/LineLayer.java | 4 +-- .../oscim/renderer/elements/LineTexLayer.java | 4 +-- .../oscim/renderer/elements/MeshLayer.java | 4 +-- .../oscim/renderer/elements/PolygonLayer.java | 30 +++++++++---------- .../oscim/renderer/elements/TextureLayer.java | 2 +- vtm/src/org/oscim/tiling/TileRenderer.java | 12 ++++---- 8 files changed, 34 insertions(+), 34 deletions(-) diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java b/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java index 2a3aaf0c..e927e1fe 100644 --- a/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java +++ b/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java @@ -86,7 +86,7 @@ class TextRenderer extends ElementRenderer { setMatrix(pos, m, false); for (RenderElement l = layers.getTextureLayers(); l != null;) - l = TextureLayer.Renderer.draw(l, scale, m); + l = TextureLayer.Renderer.draw(l, m, scale); } } diff --git a/vtm/src/org/oscim/renderer/ElementRenderer.java b/vtm/src/org/oscim/renderer/ElementRenderer.java index be77696e..5867efe6 100644 --- a/vtm/src/org/oscim/renderer/ElementRenderer.java +++ b/vtm/src/org/oscim/renderer/ElementRenderer.java @@ -94,19 +94,19 @@ public abstract class ElementRenderer extends LayerRenderer { while (l != null) { if (l.type == POLYGON) { - l = PolygonLayer.Renderer.draw(pos, l, m, true, 1, 0); + l = PolygonLayer.Renderer.draw(l, m, pos, 1, true, 0); continue; } if (l.type == LINE) { - l = LineLayer.Renderer.draw(layers, l, pos, m, div); + l = LineLayer.Renderer.draw(l, m, pos, div, layers); continue; } if (l.type == TEXLINE) { - l = LineTexLayer.Renderer.draw(layers, l, pos, m, div); + l = LineTexLayer.Renderer.draw(l, m, pos, div, layers); continue; } if (l.type == MESH) { - l = MeshLayer.Renderer.draw(pos, l, m); + l = MeshLayer.Renderer.draw(l, m, pos); continue; } log.debug("invalid layer {}", l.type); @@ -122,7 +122,7 @@ public abstract class ElementRenderer extends LayerRenderer { continue; } if (l.type == SYMBOL) { - l = TextureLayer.Renderer.draw(l, 1 / div, m); + l = TextureLayer.Renderer.draw(l, m, 1 / div); continue; } log.debug("invalid layer {}", l.type); diff --git a/vtm/src/org/oscim/renderer/elements/LineLayer.java b/vtm/src/org/oscim/renderer/elements/LineLayer.java index 4a240c36..57dac22e 100644 --- a/vtm/src/org/oscim/renderer/elements/LineLayer.java +++ b/vtm/src/org/oscim/renderer/elements/LineLayer.java @@ -628,8 +628,8 @@ public final class LineLayer extends RenderElement { return true; } - public static RenderElement draw(ElementLayers layers, RenderElement curLayer, - MapPosition pos, Matrices m, float scale) { + public static RenderElement draw(RenderElement curLayer, Matrices m, + MapPosition pos, float scale, ElementLayers layers) { if (curLayer == null) return null; diff --git a/vtm/src/org/oscim/renderer/elements/LineTexLayer.java b/vtm/src/org/oscim/renderer/elements/LineTexLayer.java index 89c801c7..2bbd556a 100644 --- a/vtm/src/org/oscim/renderer/elements/LineTexLayer.java +++ b/vtm/src/org/oscim/renderer/elements/LineTexLayer.java @@ -329,8 +329,8 @@ public final class LineTexLayer extends RenderElement { private final static int STRIDE = 12; private final static int LEN_OFFSET = 8; - public static RenderElement draw(ElementLayers layers, RenderElement curLayer, - MapPosition pos, Matrices m, float div) { + public static RenderElement draw(RenderElement curLayer, Matrices m, + MapPosition pos, float div, ElementLayers layers) { // shader failed to compile if (shader == 0) diff --git a/vtm/src/org/oscim/renderer/elements/MeshLayer.java b/vtm/src/org/oscim/renderer/elements/MeshLayer.java index 503113aa..34c78dfa 100644 --- a/vtm/src/org/oscim/renderer/elements/MeshLayer.java +++ b/vtm/src/org/oscim/renderer/elements/MeshLayer.java @@ -119,8 +119,8 @@ public class MeshLayer extends RenderElement { return true; } - public static RenderElement draw(MapPosition pos, RenderElement l, - Matrices m) { + public static RenderElement draw(RenderElement l, Matrices m, + MapPosition pos) { GLState.blend(true); diff --git a/vtm/src/org/oscim/renderer/elements/PolygonLayer.java b/vtm/src/org/oscim/renderer/elements/PolygonLayer.java index d7f3619f..d1144147 100644 --- a/vtm/src/org/oscim/renderer/elements/PolygonLayer.java +++ b/vtm/src/org/oscim/renderer/elements/PolygonLayer.java @@ -261,25 +261,25 @@ public final class PolygonLayer extends RenderElement { /** * draw polygon layers (unil layer.next is not polygon layer) * using stencil buffer method - * - * @param pos - * used to fade layers accorind to 'fade' - * in layer.area. * @param renderElement * layer to draw (referencing vertices in current vbo) * @param m * current Matrices - * @param first - * pass true to clear stencil buffer region + * @param pos + * used to fade layers according to 'fade' in + * layer.area style * @param div * scale relative to 'base scale' of the tile - * @param clip + * @param first + * pass true to clear stencil buffer region + * @param clipMode * clip to first quad in current vbo + * * @return * next layer */ - public static RenderElement draw(MapPosition pos, RenderElement renderElement, - Matrices m, boolean first, float div, int clip) { + public static RenderElement draw(RenderElement renderElement, Matrices m, + MapPosition pos, float div, boolean first, int clipMode) { GLState.test(false, true); @@ -305,7 +305,7 @@ public final class PolygonLayer extends RenderElement { continue; if (cur == start) { - drawStencilRegion(first, clip); + drawStencilRegion(first, clipMode); first = false; // op for stencil method polygon drawing @@ -329,9 +329,9 @@ public final class PolygonLayer extends RenderElement { if (cur > 0) fillPolygons(m, start, cur, zoom, scale, div); - if (clip > 0) { + if (clipMode > 0) { if (first) { - drawStencilRegion(first, clip); + drawStencilRegion(first, clipMode); // disable writes to stencil buffer GL.glStencilMask(0x00); // enable writes to color buffer @@ -364,7 +364,7 @@ public final class PolygonLayer extends RenderElement { * @param first in the first run the clip region is set based on * depth buffer and depth buffer is updated */ - static void drawStencilRegion(boolean first, int mode) { + static void drawStencilRegion(boolean first, int clipMode) { // disable drawing to color buffer GL.glColorMask(false, false, false, false); @@ -382,7 +382,7 @@ public final class PolygonLayer extends RenderElement { // with depth test (GL_LESS) this ensures to only // draw where no other tile has drawn yet. //GL.glEnable(GL20.GL_POLYGON_OFFSET_FILL); - if (mode > 1) { + if (clipMode > 1) { // test GL_LESS and write to depth buffer GLState.test(true, true); GL.glDepthMask(true); @@ -403,7 +403,7 @@ public final class PolygonLayer extends RenderElement { GL.glDrawArrays(GL20.GL_TRIANGLE_STRIP, 0, 4); if (first) { - if (mode > 1) { + if (clipMode > 1) { // dont modify depth buffer GL.glDepthMask(false); // test only stencil diff --git a/vtm/src/org/oscim/renderer/elements/TextureLayer.java b/vtm/src/org/oscim/renderer/elements/TextureLayer.java index c1bd8b55..db9ae099 100644 --- a/vtm/src/org/oscim/renderer/elements/TextureLayer.java +++ b/vtm/src/org/oscim/renderer/elements/TextureLayer.java @@ -140,7 +140,7 @@ public abstract class TextureLayer extends RenderElement { pool.init(0); } - public static RenderElement draw(RenderElement l, float scale, Matrices m) { + public static RenderElement draw(RenderElement l, Matrices m, float scale) { GLState.test(false, false); GLState.blend(true); diff --git a/vtm/src/org/oscim/tiling/TileRenderer.java b/vtm/src/org/oscim/tiling/TileRenderer.java index 1f571183..c94f3588 100644 --- a/vtm/src/org/oscim/tiling/TileRenderer.java +++ b/vtm/src/org/oscim/tiling/TileRenderer.java @@ -473,25 +473,25 @@ public class TileRenderer extends LayerRenderer { while (l != null) { if (l.type == POLYGON) { - l = PolygonLayer.Renderer.draw(pos, l, m, !clipped, div, mode); + l = PolygonLayer.Renderer.draw(l, m, pos, div, !clipped, mode); clipped = true; continue; } if (!clipped) { // draw stencil buffer clip region - PolygonLayer.Renderer.draw(pos, null, m, true, div, mode); + PolygonLayer.Renderer.draw(null, m, pos, div, true, mode); clipped = true; } if (l.type == LINE) { - l = LineLayer.Renderer.draw(t.layers, l, pos, m, scale); + l = LineLayer.Renderer.draw(l, m, pos, scale, t.layers); continue; } if (l.type == TEXLINE) { - l = LineTexLayer.Renderer.draw(t.layers, l, pos, m, div); + l = LineTexLayer.Renderer.draw(l, m, pos, div, t.layers); continue; } if (l.type == MESH) { - l = MeshLayer.Renderer.draw(pos, l, m); + l = MeshLayer.Renderer.draw(l, m, pos); continue; } // just in case @@ -501,7 +501,7 @@ public class TileRenderer extends LayerRenderer { l = t.layers.getTextureLayers(); while (l != null) { if (!clipped) { - PolygonLayer.Renderer.draw(pos, null, m, true, div, mode); + PolygonLayer.Renderer.draw(null, m, pos, div, true, mode); clipped = true; } if (l.type == BITMAP) { From ce69dde08a42229d424c9ed2a6da8a49501d3fcc Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Fri, 31 Jan 2014 03:02:12 +0100 Subject: [PATCH 6/6] pass non-inverted scale to TextureRenderer --- vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java | 2 +- vtm/src/org/oscim/renderer/ElementRenderer.java | 2 +- vtm/src/org/oscim/renderer/elements/TextureLayer.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java b/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java index e927e1fe..291845a5 100644 --- a/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java +++ b/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java @@ -81,7 +81,7 @@ class TextRenderer extends ElementRenderer { layers.vbo.bind(); - float scale = (float) (mMapPosition.scale / pos.scale); + float scale = (float) (pos.scale / mMapPosition.scale); setMatrix(pos, m, false); diff --git a/vtm/src/org/oscim/renderer/ElementRenderer.java b/vtm/src/org/oscim/renderer/ElementRenderer.java index 5867efe6..b8ce4c9f 100644 --- a/vtm/src/org/oscim/renderer/ElementRenderer.java +++ b/vtm/src/org/oscim/renderer/ElementRenderer.java @@ -122,7 +122,7 @@ public abstract class ElementRenderer extends LayerRenderer { continue; } if (l.type == SYMBOL) { - l = TextureLayer.Renderer.draw(l, m, 1 / div); + l = TextureLayer.Renderer.draw(l, m, div); continue; } log.debug("invalid layer {}", l.type); diff --git a/vtm/src/org/oscim/renderer/elements/TextureLayer.java b/vtm/src/org/oscim/renderer/elements/TextureLayer.java index db9ae099..225c71f7 100644 --- a/vtm/src/org/oscim/renderer/elements/TextureLayer.java +++ b/vtm/src/org/oscim/renderer/elements/TextureLayer.java @@ -152,7 +152,7 @@ public abstract class TextureLayer extends RenderElement { TextureLayer tl = (TextureLayer) l; if (tl.fixed) - GL.glUniform1f(hTextureScale, scale); + GL.glUniform1f(hTextureScale, 1 / scale); else GL.glUniform1f(hTextureScale, 1);