diff --git a/vtm/src/org/oscim/renderer/BufferObject.java b/vtm/src/org/oscim/renderer/BufferObject.java index 79ab51f0..89e8b0ff 100644 --- a/vtm/src/org/oscim/renderer/BufferObject.java +++ b/vtm/src/org/oscim/renderer/BufferObject.java @@ -17,6 +17,8 @@ package org.oscim.renderer; import java.nio.Buffer; +import javax.annotation.CheckReturnValue; + import org.oscim.backend.GL20; import org.oscim.backend.Log; @@ -125,9 +127,10 @@ public final class BufferObject { return bo; } - public static synchronized void release(BufferObject bo) { + @CheckReturnValue + public static synchronized BufferObject release(BufferObject bo) { if (bo == null) - return; + return null; // if (counter > 200) { // Log.d(TAG, "should clear some buffers " + counter); @@ -137,6 +140,8 @@ public final class BufferObject { bo.next = pool[t]; pool[t] = bo; counter[t]++; + + return null; } // Note: only call from GL-Thread diff --git a/vtm/src/org/oscim/renderer/ElementRenderer.java b/vtm/src/org/oscim/renderer/ElementRenderer.java index cf5f1e7d..9279d4f7 100644 --- a/vtm/src/org/oscim/renderer/ElementRenderer.java +++ b/vtm/src/org/oscim/renderer/ElementRenderer.java @@ -139,8 +139,7 @@ public abstract class ElementRenderer extends LayerRenderer { int newSize = layers.getSize(); if (newSize <= 0) { - BufferObject.release(layers.vbo); - layers.vbo = null; + layers.vbo = BufferObject.release(layers.vbo); setReady(false); return; } diff --git a/vtm/src/org/oscim/renderer/elements/ExtrusionLayer.java b/vtm/src/org/oscim/renderer/elements/ExtrusionLayer.java index 8dc65d39..a6a20d52 100644 --- a/vtm/src/org/oscim/renderer/elements/ExtrusionLayer.java +++ b/vtm/src/org/oscim/renderer/elements/ExtrusionLayer.java @@ -416,10 +416,8 @@ public class ExtrusionLayer extends RenderElement { @Override protected void clear() { if (compiled) { - BufferObject.release(vboIndices); - BufferObject.release(vboVertices); - vboIndices = null; - vboVertices = null; + vboIndices = BufferObject.release(vboIndices); + vboVertices = BufferObject.release(vboVertices); } else { for (int i = 0; i < 4; i++) VertexItem.pool.releaseAll(mIndices[i]); diff --git a/vtm/src/org/oscim/renderer/elements/MeshLayer.java b/vtm/src/org/oscim/renderer/elements/MeshLayer.java index d67d8bd3..52b523b7 100644 --- a/vtm/src/org/oscim/renderer/elements/MeshLayer.java +++ b/vtm/src/org/oscim/renderer/elements/MeshLayer.java @@ -43,6 +43,10 @@ public class MeshLayer extends RenderElement { } public void addMesh(GeometryBuffer geom) { + if (geom.index[0] < 6) { + Log.d(TAG, "invalid poly"); + return; + } if (vertexItems == null) { vertexItems = VertexItem.pool.get(); indiceItems = VertexItem.pool.get(); @@ -69,9 +73,10 @@ public class MeshLayer extends RenderElement { @Override protected void compile(ShortBuffer sbuf) { if (indiceItems == null) { - + indicesVbo = BufferObject.release(indicesVbo); return; } + Log.d(TAG, "compile"); // add vertices to shared VBO ElementLayers.addPoolItems(this, sbuf); @@ -95,19 +100,20 @@ public class MeshLayer extends RenderElement { sbuf.flip(); - indicesVbo = BufferObject.get(GL20.GL_ELEMENT_ARRAY_BUFFER, 0); + if (indicesVbo == null) + indicesVbo = BufferObject.get(GL20.GL_ELEMENT_ARRAY_BUFFER, 0); + indicesVbo.loadBufferData(sbuf, sbuf.limit() * 2); } @Override protected void clear() { - BufferObject.release(indicesVbo); + indicesVbo = BufferObject.release(indicesVbo); VertexItem.pool.releaseAll(indiceItems); VertexItem.pool.releaseAll(vertexItems); indiceItems = null; vertexItems = null; - indicesVbo = null; } public static class Renderer { @@ -147,6 +153,9 @@ public class MeshLayer extends RenderElement { for (; l != null && l.type == RenderElement.MESH; l = l.next) { MeshLayer ml = (MeshLayer) l; + if (ml.indicesVbo == null) + continue; + ml.indicesVbo.bind(); GL.glVertexAttribPointer(hVertexPosition, 2, GL20.GL_SHORT, diff --git a/vtm/src/org/oscim/tiling/MapTile.java b/vtm/src/org/oscim/tiling/MapTile.java index eca2b434..efbe6ceb 100644 --- a/vtm/src/org/oscim/tiling/MapTile.java +++ b/vtm/src/org/oscim/tiling/MapTile.java @@ -223,11 +223,7 @@ public class MapTile extends Tile { protected void clear() { if (layers != null) { // TODO move this to layers clear - if (layers.vbo != null) { - BufferObject.release(layers.vbo); - layers.vbo = null; - } - + layers.vbo = BufferObject.release(layers.vbo); layers.clear(); } diff --git a/vtm/src/org/oscim/tiling/TileRenderer.java b/vtm/src/org/oscim/tiling/TileRenderer.java index efeac387..2df7409b 100644 --- a/vtm/src/org/oscim/tiling/TileRenderer.java +++ b/vtm/src/org/oscim/tiling/TileRenderer.java @@ -173,8 +173,7 @@ public class TileRenderer extends LayerRenderer { if (!ElementRenderer.uploadLayers(tile.layers, newSize, true)) { Log.d(TAG, "BUG uploadTileData " + tile + " failed!"); - BufferObject.release(tile.layers.vbo); - tile.layers.vbo = null; + tile.layers.vbo = BufferObject.release(tile.layers.vbo); tile.layers.clear(); tile.layers = null; return 0;