diff --git a/vtm/src/org/oscim/renderer/bucket/BitmapBucket.java b/vtm/src/org/oscim/renderer/bucket/BitmapBucket.java index 5046b263..32136bfb 100644 --- a/vtm/src/org/oscim/renderer/bucket/BitmapBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/BitmapBucket.java @@ -16,9 +16,12 @@ */ package org.oscim.renderer.bucket; +import static org.oscim.backend.GL20.GL_SHORT; +import static org.oscim.backend.GL20.GL_TRIANGLES; +import static org.oscim.backend.GL20.GL_UNSIGNED_SHORT; + import java.nio.ShortBuffer; -import org.oscim.backend.GL20; import org.oscim.backend.canvas.Bitmap; import org.oscim.renderer.GLShader; import org.oscim.renderer.GLState; @@ -218,17 +221,17 @@ public class BitmapBucket extends TextureBucket { int off = (t.offset + i) * 8 + tb.vertexOffset; GL.glVertexAttribPointer(s.aPos, 2, - GL20.GL_SHORT, false, 12, off); + GL_SHORT, false, 12, off); GL.glVertexAttribPointer(s.aTexCoord, 2, - GL20.GL_SHORT, false, 12, off + 8); + GL_SHORT, false, 12, off + 8); int numIndices = t.indices - i; if (numIndices > maxIndices) numIndices = maxIndices; - GL.glDrawElements(GL20.GL_TRIANGLES, numIndices, - GL20.GL_UNSIGNED_SHORT, 0); + GL.glDrawElements(GL_TRIANGLES, numIndices, + GL_UNSIGNED_SHORT, 0); } } diff --git a/vtm/src/org/oscim/renderer/bucket/ExtrusionBucket.java b/vtm/src/org/oscim/renderer/bucket/ExtrusionBucket.java index 671d511f..525dda64 100644 --- a/vtm/src/org/oscim/renderer/bucket/ExtrusionBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/ExtrusionBucket.java @@ -69,7 +69,7 @@ public class ExtrusionBucket extends RenderBucket { * ExtrusionLayer for polygon geometries. */ public ExtrusionBucket(int level, float groundResolution, float[] colors) { - super(RenderBucket.EXTRUSION); + super(RenderBucket.EXTRUSION, true, false); this.level = level; this.colors = colors; this.color = 0; @@ -88,7 +88,7 @@ public class ExtrusionBucket extends RenderBucket { * ExtrusionLayer for triangle geometries. */ public ExtrusionBucket(int level, float groundResolution, int color) { - super(RenderBucket.EXTRUSION); + super(RenderBucket.EXTRUSION, true, false); this.level = level; this.color = color; diff --git a/vtm/src/org/oscim/renderer/bucket/HairLineBucket.java b/vtm/src/org/oscim/renderer/bucket/HairLineBucket.java index 26361105..18b52ef5 100644 --- a/vtm/src/org/oscim/renderer/bucket/HairLineBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/HairLineBucket.java @@ -20,7 +20,7 @@ public class HairLineBucket extends RenderBucket { public LineStyle line; public HairLineBucket(int level) { - super(RenderBucket.HAIRLINE); + super(RenderBucket.HAIRLINE, true, false); this.level = level; } diff --git a/vtm/src/org/oscim/renderer/bucket/LineBucket.java b/vtm/src/org/oscim/renderer/bucket/LineBucket.java index ee52c176..0b0921a4 100644 --- a/vtm/src/org/oscim/renderer/bucket/LineBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/LineBucket.java @@ -16,6 +16,9 @@ */ package org.oscim.renderer.bucket; +import static org.oscim.backend.GL20.GL_SHORT; +import static org.oscim.backend.GL20.GL_TRIANGLE_STRIP; + import org.oscim.backend.GL20; import org.oscim.backend.GLAdapter; import org.oscim.backend.canvas.Paint.Cap; @@ -71,7 +74,7 @@ public final class LineBucket extends RenderBucket { private int tmin = Integer.MIN_VALUE, tmax = Integer.MAX_VALUE; public LineBucket(int layer) { - super(RenderBucket.LINE); + super(RenderBucket.LINE, false, false); this.level = layer; } @@ -590,8 +593,8 @@ public final class LineBucket extends RenderBucket { int uLineWidth = s.uWidth; int uLineHeight = s.uHeight; - GL.glVertexAttribPointer(s.aPos, 4, GL20.GL_SHORT, - false, 0, buckets.offset[LINE]); + GL.glVertexAttribPointer(s.aPos, 4, GL_SHORT, false, 0, + buckets.offset[LINE]); v.mvp.setAsUniform(s.uMVP); @@ -680,7 +683,7 @@ public final class LineBucket extends RenderBucket { GL.glUniform1f(uLineMode, capMode); } - GL.glDrawArrays(GL20.GL_TRIANGLE_STRIP, + GL.glDrawArrays(GL_TRIANGLE_STRIP, b.vertexOffset, b.numVertices); continue; @@ -727,7 +730,7 @@ public final class LineBucket extends RenderBucket { GL.glUniform1f(uLineMode, capMode); } - GL.glDrawArrays(GL20.GL_TRIANGLE_STRIP, + GL.glDrawArrays(GL_TRIANGLE_STRIP, ref.vertexOffset, ref.numVertices); } } diff --git a/vtm/src/org/oscim/renderer/bucket/LineTexBucket.java b/vtm/src/org/oscim/renderer/bucket/LineTexBucket.java index a8346082..00a74c58 100644 --- a/vtm/src/org/oscim/renderer/bucket/LineTexBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/LineTexBucket.java @@ -95,7 +95,7 @@ public final class LineTexBucket extends RenderBucket { protected boolean mRandomizeOffset = true; LineTexBucket(int level) { - super(TEXLINE); + super(TEXLINE, false, true); this.level = level; this.evenSegment = true; diff --git a/vtm/src/org/oscim/renderer/bucket/MeshBucket.java b/vtm/src/org/oscim/renderer/bucket/MeshBucket.java index b1ac0cbc..628dad6c 100644 --- a/vtm/src/org/oscim/renderer/bucket/MeshBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/MeshBucket.java @@ -49,7 +49,7 @@ public class MeshBucket extends RenderBucket { private int numPoints; public MeshBucket(int level) { - super(RenderBucket.MESH); + super(RenderBucket.MESH, true, false); this.level = level; } diff --git a/vtm/src/org/oscim/renderer/bucket/PolygonBucket.java b/vtm/src/org/oscim/renderer/bucket/PolygonBucket.java index 1d2c6e77..f4260b50 100644 --- a/vtm/src/org/oscim/renderer/bucket/PolygonBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/PolygonBucket.java @@ -64,7 +64,7 @@ public final class PolygonBucket extends RenderBucket { public AreaStyle area; PolygonBucket(int layer) { - super(RenderBucket.POLYGON); + super(RenderBucket.POLYGON, true, false); level = layer; } diff --git a/vtm/src/org/oscim/renderer/bucket/RenderBucket.java b/vtm/src/org/oscim/renderer/bucket/RenderBucket.java index a7b8f33f..ed320415 100644 --- a/vtm/src/org/oscim/renderer/bucket/RenderBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/RenderBucket.java @@ -32,6 +32,7 @@ public abstract class RenderBucket extends Inlist { public static final int HAIRLINE = 5; public static final int SYMBOL = 6; public static final int BITMAP = 7; + public static final int SDF = 8; public final int type; @@ -43,11 +44,21 @@ public abstract class RenderBucket extends Inlist { protected int numIndices; /** Temporary list of vertex data. */ - protected final VertexData vertexItems = new VertexData(); - protected final VertexData indiceItems = new VertexData(); + protected final VertexData vertexItems; + protected final VertexData indiceItems; - protected RenderBucket(int type) { + final static VertexData EMPTY = new VertexData(); + final boolean quads; + + protected RenderBucket(int type, boolean indexed, boolean quads) { this.type = type; + vertexItems = new VertexData(); + if (indexed) + indiceItems = new VertexData(); + else + indiceItems = EMPTY; + + this.quads = quads; } /** Clear all resources. */ @@ -66,11 +77,6 @@ public abstract class RenderBucket extends Inlist { } - // /** Compile vertex data to vbo. */ - // protected void compile(ShortBuffer sbuf) { - // compileVertexItems(sbuf); - // } - /** * For line- and polygon-buckets this is the offset * of VERTICES in its bucket.vbo. @@ -98,7 +104,8 @@ public abstract class RenderBucket extends Inlist { protected void compile(ShortBuffer vboData, ShortBuffer iboData) { compileVertexItems(vboData); - compileIndiceItems(iboData); + if (iboData != null) + compileIndiceItems(iboData); } protected void compileVertexItems(ShortBuffer vboData) { @@ -109,7 +116,7 @@ public abstract class RenderBucket extends Inlist { protected void compileIndiceItems(ShortBuffer iboData) { /* keep offset of layer data in vbo */ - if (indiceItems.empty()) + if (indiceItems == null || indiceItems.empty()) return; indiceOffset = iboData.position() * 2; // needs byte offset... diff --git a/vtm/src/org/oscim/renderer/bucket/TextureBucket.java b/vtm/src/org/oscim/renderer/bucket/TextureBucket.java index cdc1eaa5..333c1fb7 100644 --- a/vtm/src/org/oscim/renderer/bucket/TextureBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/TextureBucket.java @@ -16,11 +16,13 @@ */ package org.oscim.renderer.bucket; +import static org.oscim.backend.GL20.GL_SHORT; +import static org.oscim.backend.GL20.GL_TRIANGLES; +import static org.oscim.backend.GL20.GL_UNSIGNED_SHORT; import static org.oscim.renderer.MapRenderer.COORD_SCALE; import java.nio.ShortBuffer; -import org.oscim.backend.GL20; import org.oscim.renderer.GLShader; import org.oscim.renderer.GLState; import org.oscim.renderer.GLViewport; @@ -29,7 +31,7 @@ import org.oscim.renderer.bucket.TextureItem.TexturePool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class TextureBucket extends RenderBucket { +public class TextureBucket extends RenderBucket { static final Logger log = LoggerFactory.getLogger(TextureBucket.class); @@ -46,12 +48,12 @@ public abstract class TextureBucket extends RenderBucket { TEXTURE_WIDTH, TEXTURE_HEIGHT); - protected TextureBucket(int type) { - super(type); + public TextureBucket(int type) { + super(type, false, true); } /** holds textures and offset in vbo */ - protected TextureItem textures; + public TextureItem textures; /** scale mode */ public boolean fixed; @@ -78,6 +80,7 @@ public abstract class TextureBucket extends RenderBucket { Shader() { if (!create("texture_layer")) return; + uMV = getUniform("u_mv"); uProj = getUniform("u_proj"); uScale = getUniform("u_scale"); @@ -96,9 +99,9 @@ public abstract class TextureBucket extends RenderBucket { } } - public static final class Renderer { + static Shader shader; - private static Shader shader; + public static final class Renderer { static void init() { shader = new Shader(); @@ -135,21 +138,11 @@ public abstract class TextureBucket extends RenderBucket { * / 6(indices) == 8) */ int off = (t.offset + i) * 8 + tb.vertexOffset; - GL.glVertexAttribPointer(shader.aPos, 4, - GL20.GL_SHORT, - false, 12, off); - - GL.glVertexAttribPointer(shader.aTexCoord, 2, - GL20.GL_SHORT, - false, 12, off + 8); - int numIndices = t.indices - i; if (numIndices > maxIndices) numIndices = maxIndices; - GL.glDrawElements(GL20.GL_TRIANGLES, numIndices, - GL20.GL_UNSIGNED_SHORT, 0); - + tb.render(off, numIndices); } } @@ -162,4 +155,15 @@ public abstract class TextureBucket extends RenderBucket { public TextureItem getTextures() { return textures; } + + public void render(int offset, int numIndices) { + GL.glVertexAttribPointer(shader.aPos, 4, GL_SHORT, + false, 12, offset); + + GL.glVertexAttribPointer(shader.aTexCoord, 2, GL_SHORT, + false, 12, offset + 8); + + GL.glDrawElements(GL_TRIANGLES, numIndices, + GL_UNSIGNED_SHORT, 0); + } }