RenderBuckets: unify baseBuckets and textureBuckets

... finally
This commit is contained in:
Hannes Janetzek 2014-09-04 23:54:30 +02:00
parent f6d85ce8bd
commit 3f8b028d60
11 changed files with 131 additions and 184 deletions

View File

@ -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();

View File

@ -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();
}

View File

@ -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();

View File

@ -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) {

View File

@ -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

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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();
}
}

View File

@ -53,6 +53,7 @@ public abstract class RenderBucket extends Inlist<RenderBucket> {
/** Clear all resources. */
protected void clear() {
vertexItems.dispose();
indiceItems.dispose();
numVertices = 0;
numIndices = 0;
}
@ -80,6 +81,13 @@ public abstract class RenderBucket extends Inlist<RenderBucket> {
return vertexOffset;
}
/**
* Start position in ibo for this bucket
*/
public int getIndiceOffset() {
return indiceOffset;
}
public void setVertexOffset(int offset) {
this.vertexOffset = offset;
}

View File

@ -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