diff --git a/vtm/src/org/oscim/renderer/BufferObject.java b/vtm/src/org/oscim/renderer/BufferObject.java index 0d51a86f..b89be05e 100644 --- a/vtm/src/org/oscim/renderer/BufferObject.java +++ b/vtm/src/org/oscim/renderer/BufferObject.java @@ -24,22 +24,23 @@ import org.oscim.backend.Log; public final class BufferObject { private final static String TAG = BufferObject.class.getName(); - - private static GL20 GL; - private static final int MB = 1024 * 1024; private static final int LIMIT_BUFFERS = 16 * MB; - // GL identifier - public int id; - // allocated bytes - public int size; + private static GL20 GL; - BufferObject next; + /** GL identifier */ + private int id; - int target; + /** allocated bytes */ + private int size; - BufferObject(int target, int id) { + /** GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER */ + private int target; + + private BufferObject next; + + private BufferObject(int target, int id) { this.id = id; this.target = target; } @@ -47,9 +48,10 @@ public final class BufferObject { public void loadBufferData(Buffer buf, int newSize) { boolean clear = false; - if (buf.position() != 0) { - Log.d(TAG, "rewind your buffer: " + buf.position()); - } + if (buf.position() != 0) + buf.flip(); + + //throw new IllegalArgumentException("rewind buffer! " + buf.position()); GL.glBindBuffer(target, id); @@ -68,6 +70,10 @@ public final class BufferObject { GL.glBindBuffer(target, id); } + public void unbind() { + GL.glBindBuffer(target, 0); + } + // ---------------------------- pool ---------------------------- // bytes currently loaded in VBOs private static int mBufferMemoryUsage; @@ -77,9 +83,7 @@ public final class BufferObject { if (mBufferMemoryUsage < LIMIT_BUFFERS) return; - Log.d(TAG, "buffer object usage: " - + mBufferMemoryUsage / MB - + "MB, force: " + force); + Log.d(TAG, "use: " + mBufferMemoryUsage / MB + "MB"); mBufferMemoryUsage -= BufferObject.limitUsage(1024 * 1024); diff --git a/vtm/src/org/oscim/renderer/ElementRenderer.java b/vtm/src/org/oscim/renderer/ElementRenderer.java index 5cab5e4f..c94d0ae3 100644 --- a/vtm/src/org/oscim/renderer/ElementRenderer.java +++ b/vtm/src/org/oscim/renderer/ElementRenderer.java @@ -153,9 +153,8 @@ public abstract class ElementRenderer extends LayerRenderer { sbuf.put(fillCoords, 0, 8); layers.compile(sbuf, addFill); - sbuf.flip(); - if (newSize != sbuf.remaining()) { + if (newSize != sbuf.position()) { Log.d(TAG, "wrong size: " + " new size: " + newSize + " buffer pos: " + sbuf.position() @@ -164,10 +163,7 @@ public abstract class ElementRenderer extends LayerRenderer { return false; } - // * SHORT_BYTES - newSize *= 2; - - layers.vbo.loadBufferData(sbuf, newSize); + layers.vbo.loadBufferData(sbuf.flip(), newSize * 2); return true; } diff --git a/vtm/src/org/oscim/renderer/elements/ExtrusionLayer.java b/vtm/src/org/oscim/renderer/elements/ExtrusionLayer.java index c3903a97..6ce577c0 100644 --- a/vtm/src/org/oscim/renderer/elements/ExtrusionLayer.java +++ b/vtm/src/org/oscim/renderer/elements/ExtrusionLayer.java @@ -378,10 +378,9 @@ public class ExtrusionLayer extends RenderElement { mNumIndices += mIndiceCnt[i]; } - sbuf.flip(); int size = mNumIndices * 2; vboIndices = BufferObject.get(GL20.GL_ELEMENT_ARRAY_BUFFER, size); - vboIndices.loadBufferData(sbuf, size); + vboIndices.loadBufferData(sbuf.flip(), size); GL20 GL = GLAdapter.get(); GL.glBindBuffer(GL20.GL_ELEMENT_ARRAY_BUFFER, 0); @@ -391,10 +390,9 @@ public class ExtrusionLayer extends RenderElement { for (VertexItem vi = mVertices; vi != null; vi = vi.next) sbuf.put(vi.vertices, 0, vi.used); - sbuf.flip(); size = mNumVertices * 4 * 2; vboVertices = BufferObject.get(GL20.GL_ARRAY_BUFFER, size); - vboVertices.loadBufferData(sbuf, size); + vboVertices.loadBufferData(sbuf.flip(), size); GL.glBindBuffer(GL20.GL_ARRAY_BUFFER, 0); diff --git a/vtm/src/org/oscim/renderer/elements/MeshLayer.java b/vtm/src/org/oscim/renderer/elements/MeshLayer.java index 1d367512..10b9f8ea 100644 --- a/vtm/src/org/oscim/renderer/elements/MeshLayer.java +++ b/vtm/src/org/oscim/renderer/elements/MeshLayer.java @@ -59,7 +59,7 @@ public class MeshLayer extends RenderElement { verticesCnt = vertexItems.getSize() / 2; - Log.d(TAG, "-> " + verticesCnt + " " + numIndices); + //Log.d(TAG, "-> " + verticesCnt + " " + numIndices); if (numIndices <= 0) { vertexItems = VertexItem.pool.releaseAll(vertexItems); @@ -74,13 +74,13 @@ public class MeshLayer extends RenderElement { return; } - Log.d(TAG, "compile"); + //Log.d(TAG, "compile"); // add vertices to shared VBO ElementLayers.addPoolItems(this, sbuf); int cnt = indiceItems.getSize(); - Log.d(TAG, "check " + cnt + ":" + numIndices); + //Log.d(TAG, "check " + cnt + ":" + numIndices); if (cnt != numIndices) { numIndices = cnt; @@ -94,12 +94,10 @@ public class MeshLayer extends RenderElement { indiceItems = VertexItem.pool.releaseAll(indiceItems); - sbuf.flip(); - if (indicesVbo == null) indicesVbo = BufferObject.get(GL20.GL_ELEMENT_ARRAY_BUFFER, 0); - indicesVbo.loadBufferData(sbuf, sbuf.limit() * 2); + indicesVbo.loadBufferData(sbuf.flip(), sbuf.limit() * 2); } @Override diff --git a/vtm/src/org/oscim/renderer/test/CustomRenderer2.java b/vtm/src/org/oscim/renderer/test/CustomRenderer2.java index f9616c93..37125fb3 100644 --- a/vtm/src/org/oscim/renderer/test/CustomRenderer2.java +++ b/vtm/src/org/oscim/renderer/test/CustomRenderer2.java @@ -82,10 +82,9 @@ public class CustomRenderer2 extends ElementRenderer { } FloatBuffer buf = MapRenderer.getFloatBuffer(12); buf.put(vertices); - buf.flip(); mVBO = BufferObject.get(GL20.GL_ARRAY_BUFFER, 0); - mVBO.loadBufferData(buf, 12 * 4); + mVBO.loadBufferData(buf.flip(), 12 * 4); setReady(true); }