package org.oscim.renderer.bucket; import java.nio.ShortBuffer; import org.oscim.backend.GL; import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.MapTile.TileData; import org.oscim.renderer.BufferObject; import org.oscim.renderer.MapRenderer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ExtrusionBuckets extends TileData { static final Logger log = LoggerFactory.getLogger(ExtrusionBuckets.class); public ExtrusionBucket buckets; public boolean compiled; public long animTime; public final int zoomLevel; public final double x; public final double y; public BufferObject ibo; public BufferObject vbo; public ExtrusionBuckets(MapTile tile) { zoomLevel = tile.zoomLevel; x = tile.x; y = tile.y; } /** * Set new ExtrusionLayers and clear previous. */ public void setBuckets(ExtrusionBucket el) { for (RenderBucket b = buckets; b != null; b = b.next) b.clear(); buckets = el; } public ExtrusionBucket buckets() { return buckets; } @Override protected void dispose() { setBuckets(null); if (compiled) { ibo = BufferObject.release(ibo); vbo = BufferObject.release(vbo); } } public void prepare() { for (RenderBucket b = buckets; b != null; b = b.next) b.prepare(); } public boolean compile() { if (buckets == null) return false; int sumIndices = 0; int sumVertices = 0; for (ExtrusionBucket b = buckets; b != null; b = b.next()) { sumIndices += b.numIndices; sumVertices += b.numVertices; } if (sumIndices == 0) return false; ShortBuffer vboData = MapRenderer.getShortBuffer(sumVertices * 4); ShortBuffer iboData = MapRenderer.getShortBuffer(sumIndices); for (ExtrusionBucket b = buckets; b != null; b = b.next()) b.compile(vboData, iboData); int size = sumIndices * 2; if (iboData.position() != sumIndices) { int pos = iboData.position(); log.error("invalid indice size: {} {}", sumIndices, pos); size = pos * 2; } ibo = BufferObject.get(GL.ELEMENT_ARRAY_BUFFER, size); ibo.loadBufferData(iboData.flip(), size); size = sumVertices * 4 * 2; if (vboData.position() != sumVertices * 4) { int pos = vboData.position(); log.error("invalid vertex size: {} {}", sumVertices, pos); size = pos * 2; } vbo = BufferObject.get(GL.ARRAY_BUFFER, size); vbo.loadBufferData(vboData.flip(), size); compiled = true; return true; } }