From 3f8b028d6059f520a90a513fc89ec4e559dc1741 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Thu, 4 Sep 2014 23:54:30 +0200 Subject: [PATCH] RenderBuckets: unify baseBuckets and textureBuckets ... finally --- .../src/org/oscim/test/LineTest.java | 2 +- vtm/src/org/oscim/layers/PathLayer.java | 4 +- .../oscim/layers/marker/MarkerRenderer.java | 4 +- .../oscim/layers/tile/VectorTileRenderer.java | 72 ++++++-------- .../layers/tile/bitmap/BitmapTileLoader.java | 6 +- .../tile/vector/labeling/TextRenderer.java | 4 +- .../org/oscim/renderer/BitmapRenderer.java | 4 +- .../org/oscim/renderer/BucketRenderer.java | 80 +++++++--------- vtm/src/org/oscim/renderer/GridRenderer.java | 35 +++---- .../oscim/renderer/bucket/RenderBucket.java | 8 ++ .../oscim/renderer/bucket/RenderBuckets.java | 96 ++++++------------- 11 files changed, 131 insertions(+), 184 deletions(-) diff --git a/vtm-playground/src/org/oscim/test/LineTest.java b/vtm-playground/src/org/oscim/test/LineTest.java index d7e7a6a5..fe82ee15 100644 --- a/vtm-playground/src/org/oscim/test/LineTest.java +++ b/vtm-playground/src/org/oscim/test/LineTest.java @@ -80,7 +80,7 @@ public class LineTest extends GdxMap { } buckets.clear(); - buckets.setBaseBuckets(ll); + buckets.set(ll); g.clear(); for (int i = 0; i < 60; i++) { g.startLine(); diff --git a/vtm/src/org/oscim/layers/PathLayer.java b/vtm/src/org/oscim/layers/PathLayer.java index ca09804c..b16eb069 100644 --- a/vtm/src/org/oscim/layers/PathLayer.java +++ b/vtm/src/org/oscim/layers/PathLayer.java @@ -221,7 +221,7 @@ public class PathLayer extends Layer { mMapPosition.copy(t.pos); // compile new layers - buckets.setBaseBuckets(t.bucket.getBaseBuckets()); + buckets.set(t.bucket.get()); compile(); } } @@ -294,7 +294,7 @@ public class PathLayer extends Layer { } if (size == 0) { - if (task.bucket.getBaseBuckets() != null) { + if (task.bucket.get() != null) { task.bucket.clear(); mMap.render(); } diff --git a/vtm/src/org/oscim/layers/marker/MarkerRenderer.java b/vtm/src/org/oscim/layers/marker/MarkerRenderer.java index 6ce3e712..4fe070be 100644 --- a/vtm/src/org/oscim/layers/marker/MarkerRenderer.java +++ b/vtm/src/org/oscim/layers/marker/MarkerRenderer.java @@ -86,7 +86,7 @@ public class MarkerRenderer extends BucketRenderer { long flip = (long) (Tile.SIZE * v.pos.scale) >> 1; if (mItems == null) { - if (buckets.getTextureBuckets() != null) { + if (buckets.get() != null) { buckets.clear(); compile(); } @@ -162,7 +162,7 @@ public class MarkerRenderer extends BucketRenderer { mSymbolLayer.pushSymbol(s); } - buckets.setTextureBuckets(mSymbolLayer); + buckets.set(mSymbolLayer); buckets.prepare(); compile(); diff --git a/vtm/src/org/oscim/layers/tile/VectorTileRenderer.java b/vtm/src/org/oscim/layers/tile/VectorTileRenderer.java index b3805a0c..dd0db36d 100644 --- a/vtm/src/org/oscim/layers/tile/VectorTileRenderer.java +++ b/vtm/src/org/oscim/layers/tile/VectorTileRenderer.java @@ -178,50 +178,40 @@ public class VectorTileRenderer extends TileRenderer { PolygonBucket.Renderer.clip(mClipMVP, mClipMode); - RenderBucket b = buckets.getBaseBuckets(); - boolean first = true; - while (b != null) { - if (b.type == POLYGON) { - b = PolygonBucket.Renderer.draw(b, v, div, first); - first = false; - /* set test for clip to tile region */ - GL.glStencilFunc(GL_EQUAL, 0x80, 0x80); - continue; + for (RenderBucket b = buckets.get(); b != null;) { + switch (b.type) { + case POLYGON: + b = PolygonBucket.Renderer.draw(b, v, div, first); + first = false; + /* set test for clip to tile region */ + GL.glStencilFunc(GL_EQUAL, 0x80, 0x80); + break; + case LINE: + b = LineBucket.Renderer.draw(b, v, scale, buckets); + break; + case TEXLINE: + b = LineTexBucket.Renderer.draw(b, v, div, buckets); + if (buckets.ibo != null) + buckets.ibo.bind(); + break; + case MESH: + b = MeshBucket.Renderer.draw(b, v); + break; + case HAIRLINE: + b = HairLineBucket.Renderer.draw(b, v); + break; + case BITMAP: + b = BitmapBucket.Renderer.draw(b, v, 1, mLayerAlpha); + break; + default: + /* just in case */ + log.error("unknown layer {}", b.type); + b = b.next; + break; } - if (b.type == LINE) { - b = LineBucket.Renderer.draw(b, v, scale, buckets); - continue; - } - if (b.type == TEXLINE) { - b = LineTexBucket.Renderer.draw(b, v, div, buckets); - if (buckets.ibo != null) - buckets.ibo.bind(); - continue; - } - if (b.type == MESH) { - b = MeshBucket.Renderer.draw(b, v); - continue; - } - if (b.type == HAIRLINE) { - b = HairLineBucket.Renderer.draw(b, v); - continue; - } - - /* just in case */ - log.error("unknown layer {}", b.type); - b = b.next; - } - - b = buckets.getTextureBuckets(); - while (b != null) { - if (b.type == BITMAP) { - b = BitmapBucket.Renderer.draw(b, v, 1, mLayerAlpha); - continue; - } - log.error("unknown layer {}", b.type); - b = b.next; + buckets.bind(); } if (debugOverdraw) { diff --git a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java index d65839b4..a04b1515 100644 --- a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java @@ -61,9 +61,9 @@ public class BitmapTileLoader extends TileLoader { BitmapBucket l = new BitmapBucket(false); l.setBitmap(bitmap, Tile.SIZE, Tile.SIZE, mLayer.pool); - RenderBuckets layers = new RenderBuckets(); - layers.setTextureBuckets(l); - mTile.data = layers; + RenderBuckets b = new RenderBuckets(); + b.set(l); + mTile.data = b; } @Override 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 ad565852..d8aa0a9f 100644 --- a/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java +++ b/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java @@ -67,7 +67,7 @@ class TextRenderer extends BucketRenderer { } // set new TextLayer to be uploaded and rendered - buckets.setTextureBuckets(t.layers); + buckets.set(t.layers); mMapPosition = t.pos; compile(); } @@ -83,7 +83,7 @@ class TextRenderer extends BucketRenderer { setMatrix(v, false); - for (RenderBucket l = buckets.getTextureBuckets(); l != null;) + for (RenderBucket l = buckets.get(); l != null;) l = TextureBucket.Renderer.draw(buckets, l, v, scale); } diff --git a/vtm/src/org/oscim/renderer/BitmapRenderer.java b/vtm/src/org/oscim/renderer/BitmapRenderer.java index 238cfb71..0d0325d8 100644 --- a/vtm/src/org/oscim/renderer/BitmapRenderer.java +++ b/vtm/src/org/oscim/renderer/BitmapRenderer.java @@ -60,7 +60,7 @@ public class BitmapRenderer extends BucketRenderer { BitmapBucket l = new BitmapBucket(true); l.setBitmap(mBitmap, mWidth, mHeight); - buckets.setTextureBuckets(l); + buckets.set(l); mUpdateBitmap = true; } @@ -84,6 +84,6 @@ public class BitmapRenderer extends BucketRenderer { @Override protected synchronized void render(GLViewport v) { v.useScreenCoordinates(false, 8); - BitmapBucket.Renderer.draw(buckets.getTextureBuckets(), v, 1, 1); + BitmapBucket.Renderer.draw(buckets.get(), v, 1, 1); } } diff --git a/vtm/src/org/oscim/renderer/BucketRenderer.java b/vtm/src/org/oscim/renderer/BucketRenderer.java index 63bd7dfb..3954d25a 100644 --- a/vtm/src/org/oscim/renderer/BucketRenderer.java +++ b/vtm/src/org/oscim/renderer/BucketRenderer.java @@ -17,6 +17,7 @@ package org.oscim.renderer; import static org.oscim.renderer.bucket.RenderBucket.BITMAP; +import static org.oscim.renderer.bucket.RenderBucket.HAIRLINE; import static org.oscim.renderer.bucket.RenderBucket.LINE; import static org.oscim.renderer.bucket.RenderBucket.MESH; import static org.oscim.renderer.bucket.RenderBucket.POLYGON; @@ -78,53 +79,42 @@ public abstract class BucketRenderer extends LayerRenderer { float div = (float) (v.pos.scale / layerPos.scale); - RenderBucket b = buckets.getBaseBuckets(); + setMatrix(v, true); - if (b != null) - setMatrix(v, true); - - while (b != null) { - if (b.type == POLYGON) { - b = PolygonBucket.Renderer.draw(b, v, 1, true); - continue; + for (RenderBucket b = buckets.get(); b != null;) { + switch (b.type) { + case POLYGON: + b = PolygonBucket.Renderer.draw(b, v, 1, true); + break; + case LINE: + b = LineBucket.Renderer.draw(b, v, div, buckets); + break; + case TEXLINE: + b = LineTexBucket.Renderer.draw(b, v, div, buckets); + // rebind + buckets.ibo.bind(); + break; + case MESH: + b = MeshBucket.Renderer.draw(b, v); + break; + case HAIRLINE: + b = HairLineBucket.Renderer.draw(b, v); + break; + case BITMAP: + b = BitmapBucket.Renderer.draw(b, v, 1, 1); + // rebind + buckets.ibo.bind(); + break; + case SYMBOL: + b = TextureBucket.Renderer.draw(buckets, b, v, div); + // rebind + buckets.ibo.bind(); + break; + default: + log.error("invalid bucket {}", b.type); + b = b.next; + break; } - if (b.type == LINE) { - b = LineBucket.Renderer.draw(b, v, div, buckets); - continue; - } - if (b.type == TEXLINE) { - b = LineTexBucket.Renderer.draw(b, v, div, buckets); - // rebind - buckets.ibo.bind(); - continue; - } - if (b.type == MESH) { - b = MeshBucket.Renderer.draw(b, v); - continue; - } - if (b.type == RenderBucket.HAIRLINE) { - b = HairLineBucket.Renderer.draw(b, v); - continue; - } - - log.error("invalid bucket {}", b.type); - break; - } - - b = buckets.getTextureBuckets(); - if (b != null) - setMatrix(v, false); - while (b != null) { - if (b.type == BITMAP) { - b = BitmapBucket.Renderer.draw(b, v, 1, 1); - continue; - } - if (b.type == SYMBOL) { - b = TextureBucket.Renderer.draw(buckets, b, v, div); - continue; - } - log.error("invalid bucket {}", b.type); - break; } } diff --git a/vtm/src/org/oscim/renderer/GridRenderer.java b/vtm/src/org/oscim/renderer/GridRenderer.java index 0feb8979..5c993dcb 100644 --- a/vtm/src/org/oscim/renderer/GridRenderer.java +++ b/vtm/src/org/oscim/renderer/GridRenderer.java @@ -28,6 +28,7 @@ import org.oscim.theme.styles.TextStyle; import org.oscim.theme.styles.TextStyle.TextBuilder; public class GridRenderer extends BucketRenderer { + private final TextBucket mTextBucket; private final TextStyle mText; private final LineBucket mLineBucket; @@ -67,13 +68,18 @@ public class GridRenderer extends BucketRenderer { mText = textStyle; - if (mText != null) - mTextBucket = buckets.addTextBucket(new TextBucket()); - else - mTextBucket = null; + mLineBucket = new LineBucket(0); + mLineBucket.line = lineStyle; - mLineBucket = buckets.addLineBucket(0, lineStyle); - mLineBucket.addLine(mLines); + if (mText != null) { + mTextBucket = new TextBucket(); + buckets.set(mTextBucket); + mTextBucket.next = mLineBucket; + buckets.set(mTextBucket); + } else { + mTextBucket = null; + buckets.set(mLineBucket); + } mStringBuffer = new StringBuilder(32); } @@ -101,12 +107,6 @@ public class GridRenderer extends BucketRenderer { tl.addText(ti); } } - - /* render TextItems to a bitmap and prepare vertex buffer data. */ - tl.prepare(); - - /* release TextItems */ - tl.clearLabels(); } @Override @@ -131,13 +131,14 @@ public class GridRenderer extends BucketRenderer { mMapPosition.scale = z; if (mText != null) { + buckets.set(mTextBucket); addLabels(x, y, v.pos.zoomLevel); - buckets.setBaseBuckets(mLineBucket); mLineBucket.addLine(mLines); - compile(); - - } else if (buckets.vbo == null) { - compile(); + buckets.prepare(); + setReady(false); } + + if (!isReady()) + compile(); } } diff --git a/vtm/src/org/oscim/renderer/bucket/RenderBucket.java b/vtm/src/org/oscim/renderer/bucket/RenderBucket.java index f20defc2..91133276 100644 --- a/vtm/src/org/oscim/renderer/bucket/RenderBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/RenderBucket.java @@ -53,6 +53,7 @@ public abstract class RenderBucket extends Inlist { /** Clear all resources. */ protected void clear() { vertexItems.dispose(); + indiceItems.dispose(); numVertices = 0; numIndices = 0; } @@ -80,6 +81,13 @@ public abstract class RenderBucket extends Inlist { return vertexOffset; } + /** + * Start position in ibo for this bucket + */ + public int getIndiceOffset() { + return indiceOffset; + } + public void setVertexOffset(int offset) { this.vertexOffset = offset; } diff --git a/vtm/src/org/oscim/renderer/bucket/RenderBuckets.java b/vtm/src/org/oscim/renderer/bucket/RenderBuckets.java index 3857ace0..be145423 100644 --- a/vtm/src/org/oscim/renderer/bucket/RenderBuckets.java +++ b/vtm/src/org/oscim/renderer/bucket/RenderBuckets.java @@ -50,16 +50,13 @@ public class RenderBuckets extends TileData { 2, // MESH_VERTEX 4, // EXTRUSION_VERTEX 2, // HAIRLINE_VERTEX + 6, // SYMBOL + 6, // BITMAP }; - private final static int TEXTURE_VERTEX_SHORTS = 6; private final static int SHORT_BYTES = 2; - /** mixed Polygon- and LineBuckets */ - private RenderBucket baseBuckets; - - /** Text- and SymbolBuckets */ - private RenderBucket textureBuckets; + private RenderBucket buckets; /** * VBO holds all vertex data to draw lines and polygons after compilation. @@ -161,38 +158,21 @@ public class RenderBuckets extends TileData { return (HairLineBucket) getBucket(level, HAIRLINE); } - public TextBucket addTextBucket(TextBucket textBucket) { - textBucket.next = textureBuckets; - textureBuckets = textBucket; - return textBucket; + /** + * Set new bucket items and clear previous. + */ + public void set(RenderBucket buckets) { + for (RenderBucket l = this.buckets; l != null; l = l.next) + l.clear(); + + this.buckets = buckets; } /** - * Set new Base-Buckets and clear previous. + * @return internal linked list of RenderBucket items */ - public void setBaseBuckets(RenderBucket buckets) { - for (RenderBucket l = baseBuckets; l != null; l = l.next) - l.clear(); - - baseBuckets = buckets; - } - - public RenderBucket getBaseBuckets() { - return baseBuckets; - } - - /** - * Set new TextureBuckets and clear previous. - */ - public void setTextureBuckets(TextureBucket tl) { - for (RenderBucket l = textureBuckets; l != null; l = l.next) - l.clear(); - - textureBuckets = tl; - } - - public RenderBucket getTextureBuckets() { - return textureBuckets; + public RenderBucket get() { + return buckets; } private RenderBucket getBucket(int level, int type) { @@ -211,7 +191,7 @@ public class RenderBuckets extends TileData { return bucket; } - RenderBucket b = baseBuckets; + RenderBucket b = buckets; if (b == null || b.level > level) { /* insert new bucket at start */ b = null; @@ -248,8 +228,8 @@ public class RenderBuckets extends TileData { if (b == null) { /** insert at start */ - bucket.next = baseBuckets; - baseBuckets = bucket; + bucket.next = buckets; + buckets = bucket; } else { bucket.next = b.next; b.next = bucket; @@ -274,42 +254,33 @@ public class RenderBuckets extends TileData { private int countVboSize() { int vboShorts = 0; - for (RenderBucket l = baseBuckets; l != null; l = l.next) + for (RenderBucket l = buckets; l != null; l = l.next) vboShorts += l.numVertices * VERTEX_SHORT_CNT[l.type]; - for (RenderBucket l = textureBuckets; l != null; l = l.next) - vboShorts += l.numVertices * TEXTURE_VERTEX_SHORTS; - return vboShorts; } private int countIboSize() { int numIndices = 0; - for (RenderBucket l = baseBuckets; l != null; l = l.next) - numIndices += l.numIndices; - - for (RenderBucket l = textureBuckets; l != null; l = l.next) + for (RenderBucket l = buckets; l != null; l = l.next) numIndices += l.numIndices; return numIndices; } public void setFrom(RenderBuckets buckets) { - setBaseBuckets(buckets.baseBuckets); - setTextureBuckets((TextureBucket) buckets.textureBuckets); + set(buckets.buckets); mCurBucket = null; - buckets.baseBuckets = null; - buckets.textureBuckets = null; + buckets.buckets = null; buckets.mCurBucket = null; } /** cleanup only when buckets are not used by tile or bucket anymore! */ public void clear() { /* NB: set null calls clear() on each bucket! */ - setBaseBuckets(null); - setTextureBuckets(null); + set(null); mCurBucket = null; vbo = BufferObject.release(vbo); @@ -322,10 +293,7 @@ public class RenderBuckets extends TileData { } public void prepare() { - for (RenderBucket l = baseBuckets; l != null; l = l.next) - l.prepare(); - - for (RenderBucket l = textureBuckets; l != null; l = l.next) + for (RenderBucket l = buckets; l != null; l = l.next) l.prepare(); } @@ -343,7 +311,6 @@ public class RenderBuckets extends TileData { int vboSize = countVboSize(); if (vboSize <= 0) { - // FIXME just clear? vbo = BufferObject.release(vbo); ibo = BufferObject.release(ibo); return false; @@ -364,14 +331,11 @@ public class RenderBuckets extends TileData { iboData = MapRenderer.getShortBuffer(iboSize); } - //>>compile(vboData, iboData, addFill); int pos = addFill ? 4 : 0; - for (RenderBucket l = baseBuckets; l != null; l = l.next) { + for (RenderBucket l = buckets; l != null; l = l.next) { if (l.type == POLYGON) { l.compile(vboData, iboData); - - //log.debug("offset {} {}", l.offset, pos); l.vertexOffset = pos; pos += l.numVertices; } @@ -379,7 +343,7 @@ public class RenderBuckets extends TileData { offset[LINE] = vboData.position() * SHORT_BYTES; pos = 0; - for (RenderBucket l = baseBuckets; l != null; l = l.next) { + for (RenderBucket l = buckets; l != null; l = l.next) { if (l.type == LINE) { l.compile(vboData, iboData); @@ -388,18 +352,12 @@ public class RenderBuckets extends TileData { } } - //offset[TEXLINE] = size * SHORT_BYTES; - - for (RenderBucket l = baseBuckets; l != null; l = l.next) { - if (l.type == TEXLINE || l.type == MESH || l.type == HAIRLINE) { + for (RenderBucket l = buckets; l != null; l = l.next) { + if (l.type != LINE && l.type != POLYGON) { l.compile(vboData, iboData); } } - for (RenderBucket l = textureBuckets; l != null; l = l.next) { - l.compile(vboData, iboData); - } - //<< if (vboSize != vboData.position()) { log.debug("wrong vertex buffer size: " + " new size: " + vboSize