From c580e1d7a5680f5ce47058bff0c6904588173c5c Mon Sep 17 00:00:00 2001 From: Longri Date: Wed, 29 Mar 2017 13:21:18 +0200 Subject: [PATCH] Map renderer COORD_SCALE configurable and global use (#344) --- .../test/renderer/HexagonRenderTest.java | 3 +- .../assets/shaders/texture_layer.glsl | 3 +- .../org/oscim/renderer/BitmapRenderer.java | 4 +- .../org/oscim/renderer/BucketRenderer.java | 3 +- .../org/oscim/renderer/ExtrusionRenderer.java | 3 +- vtm/src/org/oscim/renderer/MapRenderer.java | 2 +- .../oscim/renderer/bucket/BitmapBucket.java | 6 +-- .../renderer/bucket/ExtrusionBucket.java | 21 ++++----- .../org/oscim/renderer/bucket/LineBucket.java | 5 +- .../oscim/renderer/bucket/LineTexBucket.java | 2 +- .../org/oscim/renderer/bucket/MeshBucket.java | 4 +- .../oscim/renderer/bucket/PolygonBucket.java | 14 +++--- .../oscim/renderer/bucket/RenderBuckets.java | 3 +- .../oscim/renderer/bucket/SymbolBucket.java | 47 ++++++++++--------- .../oscim/renderer/bucket/TextureBucket.java | 4 +- 15 files changed, 64 insertions(+), 60 deletions(-) diff --git a/vtm-playground/src/org/oscim/test/renderer/HexagonRenderTest.java b/vtm-playground/src/org/oscim/test/renderer/HexagonRenderTest.java index c483e35f..eb278a16 100644 --- a/vtm-playground/src/org/oscim/test/renderer/HexagonRenderTest.java +++ b/vtm-playground/src/org/oscim/test/renderer/HexagonRenderTest.java @@ -33,6 +33,7 @@ import org.oscim.utils.FastMath; import java.nio.FloatBuffer; import static org.oscim.backend.GLAdapter.gl; +import static org.oscim.renderer.MapRenderer.COORD_SCALE; public class HexagonRenderTest extends GdxMap { @@ -66,7 +67,7 @@ public class HexagonRenderTest extends GdxMap { private BufferObject mVBO; int mZoom = -1; - float mCellScale = 60 * MapRenderer.COORD_SCALE; + float mCellScale = 60 * COORD_SCALE; @Override public void update(GLViewport v) { diff --git a/vtm/resources/assets/shaders/texture_layer.glsl b/vtm/resources/assets/shaders/texture_layer.glsl index e145b9ce..94c5f2eb 100644 --- a/vtm/resources/assets/shaders/texture_layer.glsl +++ b/vtm/resources/assets/shaders/texture_layer.glsl @@ -6,13 +6,14 @@ attribute vec2 tex_coord; uniform mat4 u_mv; uniform mat4 u_proj; uniform float u_scale; +uniform float u_coord_scale; uniform vec2 u_div; varying vec2 tex_c; -const float coord_scale = 1.0/8.0; void main(){ vec4 pos; vec2 dir = vertex.zw; + float coord_scale = 1.0 / u_coord_scale; if (abs(mod(vertex.x, 2.0)) == 0.0) { pos = u_proj * (u_mv * vec4(vertex.xy + dir * u_scale, 0.0, 1.0)); } diff --git a/vtm/src/org/oscim/renderer/BitmapRenderer.java b/vtm/src/org/oscim/renderer/BitmapRenderer.java index 547780ce..60b3b73c 100644 --- a/vtm/src/org/oscim/renderer/BitmapRenderer.java +++ b/vtm/src/org/oscim/renderer/BitmapRenderer.java @@ -21,6 +21,8 @@ package org.oscim.renderer; import org.oscim.backend.canvas.Bitmap; import org.oscim.renderer.bucket.BitmapBucket; +import static org.oscim.renderer.MapRenderer.COORD_SCALE; + /** * RenderLayer to draw a custom Bitmap. * NOTE: Only modify the Bitmap within a synchronized block! @@ -91,7 +93,7 @@ public class BitmapRenderer extends BucketRenderer { @Override public synchronized void render(GLViewport v) { - v.useScreenCoordinates(mWidth, mHeight, position, xOffset, yOffset, 8); + v.useScreenCoordinates(mWidth, mHeight, position, xOffset, yOffset, COORD_SCALE); BitmapBucket.Renderer.draw(buckets.get(), v, 1, 1); } } diff --git a/vtm/src/org/oscim/renderer/BucketRenderer.java b/vtm/src/org/oscim/renderer/BucketRenderer.java index cde49d78..ddf0dce2 100644 --- a/vtm/src/org/oscim/renderer/BucketRenderer.java +++ b/vtm/src/org/oscim/renderer/BucketRenderer.java @@ -33,6 +33,7 @@ import org.oscim.utils.FastMath; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static org.oscim.renderer.MapRenderer.COORD_SCALE; import static org.oscim.renderer.bucket.RenderBucket.BITMAP; import static org.oscim.renderer.bucket.RenderBucket.CIRCLE; import static org.oscim.renderer.bucket.RenderBucket.HAIRLINE; @@ -173,7 +174,7 @@ public class BucketRenderer extends LayerRenderer { * @param project if true apply view- and projection, or just view otherwise. */ protected void setMatrix(GLViewport v, boolean project) { - setMatrix(v, project, MapRenderer.COORD_SCALE); + setMatrix(v, project, COORD_SCALE); } protected void setMatrix(GLViewport v, boolean project, float coordScale) { diff --git a/vtm/src/org/oscim/renderer/ExtrusionRenderer.java b/vtm/src/org/oscim/renderer/ExtrusionRenderer.java index 110a0723..99c0c632 100644 --- a/vtm/src/org/oscim/renderer/ExtrusionRenderer.java +++ b/vtm/src/org/oscim/renderer/ExtrusionRenderer.java @@ -25,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static org.oscim.backend.GLAdapter.gl; +import static org.oscim.renderer.MapRenderer.COORD_SCALE; public abstract class ExtrusionRenderer extends LayerRenderer { static final Logger log = LoggerFactory.getLogger(ExtrusionRenderer.class); @@ -254,7 +255,7 @@ public abstract class ExtrusionRenderer extends LayerRenderer { float x = (float) ((l.x - v.pos.x) * curScale); float y = (float) ((l.y - v.pos.y) * curScale); - v.mvp.setTransScale(x, y, scale / MapRenderer.COORD_SCALE); + v.mvp.setTransScale(x, y, scale / COORD_SCALE); v.mvp.setValue(10, scale / 10); v.mvp.multiplyLhs(v.viewproj); diff --git a/vtm/src/org/oscim/renderer/MapRenderer.java b/vtm/src/org/oscim/renderer/MapRenderer.java index 1a63b69e..a80221d0 100644 --- a/vtm/src/org/oscim/renderer/MapRenderer.java +++ b/vtm/src/org/oscim/renderer/MapRenderer.java @@ -38,7 +38,7 @@ public class MapRenderer { /** * scale factor used for short vertices */ - public static final float COORD_SCALE = 8.0f; + public static float COORD_SCALE = 8.0f; private final Map mMap; private final GLViewport mViewport; diff --git a/vtm/src/org/oscim/renderer/bucket/BitmapBucket.java b/vtm/src/org/oscim/renderer/bucket/BitmapBucket.java index 8999b93a..4ff5e68a 100644 --- a/vtm/src/org/oscim/renderer/bucket/BitmapBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/BitmapBucket.java @@ -21,12 +21,12 @@ import org.oscim.backend.canvas.Bitmap; import org.oscim.renderer.GLShader; import org.oscim.renderer.GLState; import org.oscim.renderer.GLViewport; -import org.oscim.renderer.MapRenderer; import org.oscim.renderer.bucket.TextureItem.TexturePool; import java.nio.ShortBuffer; import static org.oscim.backend.GLAdapter.gl; +import static org.oscim.renderer.MapRenderer.COORD_SCALE; import static org.oscim.renderer.MapRenderer.MAX_INDICES; import static org.oscim.renderer.MapRenderer.bindQuadIndicesVBO; @@ -84,8 +84,8 @@ public class BitmapBucket extends TextureBucket { private void setVertices(ShortBuffer vboData) { short[] buf = mVertices; - short w = (short) (mWidth * MapRenderer.COORD_SCALE); - short h = (short) (mHeight * MapRenderer.COORD_SCALE); + short w = (short) (mWidth * COORD_SCALE); + short h = (short) (mHeight * COORD_SCALE); short texMin = 0; short texMax = 1; diff --git a/vtm/src/org/oscim/renderer/bucket/ExtrusionBucket.java b/vtm/src/org/oscim/renderer/bucket/ExtrusionBucket.java index 137cb9a3..05b1b313 100644 --- a/vtm/src/org/oscim/renderer/bucket/ExtrusionBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/ExtrusionBucket.java @@ -21,7 +21,6 @@ import org.oscim.core.GeometryBuffer; import org.oscim.core.GeometryBuffer.GeometryType; import org.oscim.core.MapElement; import org.oscim.core.Tile; -import org.oscim.renderer.MapRenderer; import org.oscim.utils.FastMath; import org.oscim.utils.KeyMap; import org.oscim.utils.KeyMap.HashItem; @@ -33,11 +32,11 @@ import org.slf4j.LoggerFactory; import java.nio.ShortBuffer; +import static org.oscim.renderer.MapRenderer.COORD_SCALE; + public class ExtrusionBucket extends RenderBucket { static final Logger log = LoggerFactory.getLogger(ExtrusionBucket.class); - private static final float S = MapRenderer.COORD_SCALE; - private VertexData mIndices[]; private LineClipper mClipper; @@ -164,7 +163,7 @@ public class ExtrusionBucket extends RenderBucket { synchronized (vertexPool) { Vertex key = vertexPool.get(); - double scale = S * Tile.SIZE / 4096; + double scale = COORD_SCALE * Tile.SIZE / 4096; for (int k = 0, n = index.length; k < n; ) { if (index[k] < 0) @@ -330,9 +329,9 @@ public class ExtrusionBucket extends RenderBucket { // v = 0; // } // /* set coordinate */ - // vertices[v++] = (short) (points[j++] * S); - // vertices[v++] = (short) (points[j++] * S); - // vertices[v++] = (short) (points[j++] * S); + // vertices[v++] = (short) (points[j++] * COORD_SCALE); + // vertices[v++] = (short) (points[j++] * COORD_SCALE); + // vertices[v++] = (short) (points[j++] * COORD_SCALE); // v++; // } // @@ -491,8 +490,8 @@ public class ExtrusionBucket extends RenderBucket { } else { // if (addFace) short c = (short) (color1 | fcolor << 8); /* add bottom and top vertex for each point */ - vertexItems.add((short) (cx * S), (short) (cy * S), mh, c); - vertexItems.add((short) (cx * S), (short) (cy * S), h, c); + vertexItems.add((short) (cx * COORD_SCALE), (short) (cy * COORD_SCALE), mh, c); + vertexItems.add((short) (cx * COORD_SCALE), (short) (cy * COORD_SCALE), h, c); //v += 8; break; @@ -512,8 +511,8 @@ public class ExtrusionBucket extends RenderBucket { c = (short) (color2 | color1 << 8); /* add bottom and top vertex for each point */ - vertexItems.add((short) (cx * S), (short) (cy * S), mh, c); - vertexItems.add((short) (cx * S), (short) (cy * S), h, c); + vertexItems.add((short) (cx * COORD_SCALE), (short) (cy * COORD_SCALE), mh, c); + vertexItems.add((short) (cx * COORD_SCALE), (short) (cy * COORD_SCALE), h, c); color1 = color2; diff --git a/vtm/src/org/oscim/renderer/bucket/LineBucket.java b/vtm/src/org/oscim/renderer/bucket/LineBucket.java index e6e22679..6e0c0b2f 100644 --- a/vtm/src/org/oscim/renderer/bucket/LineBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/LineBucket.java @@ -26,12 +26,12 @@ import org.oscim.renderer.GLShader; import org.oscim.renderer.GLState; import org.oscim.renderer.GLUtils; import org.oscim.renderer.GLViewport; -import org.oscim.renderer.MapRenderer; import org.oscim.theme.styles.LineStyle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static org.oscim.backend.GLAdapter.gl; +import static org.oscim.renderer.MapRenderer.COORD_SCALE; /** * Note: @@ -42,7 +42,6 @@ import static org.oscim.backend.GLAdapter.gl; public class LineBucket extends RenderBucket { static final Logger log = LoggerFactory.getLogger(LineBucket.class); - private static final float COORD_SCALE = MapRenderer.COORD_SCALE; /** * scale factor mapping extrusion vector to short values */ @@ -537,7 +536,7 @@ public class LineBucket extends RenderBucket { /* factor to normalize extrusion vector and scale to coord scale */ private final static float COORD_SCALE_BY_DIR_SCALE = - MapRenderer.COORD_SCALE / LineBucket.DIR_SCALE; + COORD_SCALE / LineBucket.DIR_SCALE; private final static int CAP_THIN = 0; private final static int CAP_BUTT = 1; diff --git a/vtm/src/org/oscim/renderer/bucket/LineTexBucket.java b/vtm/src/org/oscim/renderer/bucket/LineTexBucket.java index f6fc7705..0ca39711 100644 --- a/vtm/src/org/oscim/renderer/bucket/LineTexBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/LineTexBucket.java @@ -247,7 +247,7 @@ public final class LineTexBucket extends LineBucket { /* factor to normalize extrusion vector and scale to coord scale */ private final static float COORD_SCALE_BY_DIR_SCALE = - MapRenderer.COORD_SCALE / LineBucket.DIR_SCALE; + COORD_SCALE / LineBucket.DIR_SCALE; private static int mVertexFlipID; diff --git a/vtm/src/org/oscim/renderer/bucket/MeshBucket.java b/vtm/src/org/oscim/renderer/bucket/MeshBucket.java index 3a462148..4e657492 100644 --- a/vtm/src/org/oscim/renderer/bucket/MeshBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/MeshBucket.java @@ -25,7 +25,6 @@ import org.oscim.renderer.GLShader; import org.oscim.renderer.GLState; import org.oscim.renderer.GLUtils; import org.oscim.renderer.GLViewport; -import org.oscim.renderer.MapRenderer; import org.oscim.renderer.bucket.VertexData.Chunk; import org.oscim.theme.styles.AreaStyle; import org.oscim.utils.ColorUtil; @@ -134,8 +133,7 @@ public class MeshBucket extends RenderBucket { Chunk chunk = vertexItems.obtainChunk(); - tess.getVertices(chunk.vertices, offset, size, - MapRenderer.COORD_SCALE); + tess.getVertices(chunk.vertices, offset, size, COORD_SCALE); offset += size; vertexItems.releaseChunk(size); diff --git a/vtm/src/org/oscim/renderer/bucket/PolygonBucket.java b/vtm/src/org/oscim/renderer/bucket/PolygonBucket.java index 93bec081..df9b0d65 100644 --- a/vtm/src/org/oscim/renderer/bucket/PolygonBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/PolygonBucket.java @@ -28,7 +28,6 @@ import org.oscim.renderer.GLShader; import org.oscim.renderer.GLState; import org.oscim.renderer.GLUtils; import org.oscim.renderer.GLViewport; -import org.oscim.renderer.MapRenderer; import org.oscim.theme.styles.AreaStyle; import org.oscim.utils.ArrayUtils; import org.oscim.utils.geom.LineClipper; @@ -39,6 +38,7 @@ import org.slf4j.LoggerFactory; import java.nio.ShortBuffer; import static org.oscim.backend.GLAdapter.gl; +import static org.oscim.renderer.MapRenderer.COORD_SCALE; import static org.oscim.utils.FastMath.clamp; /** @@ -52,8 +52,6 @@ public final class PolygonBucket extends RenderBucket { public final static int CLIP_DEPTH = 2; public final static int CLIP_TEST_DEPTH = 3; - private static final float S = MapRenderer.COORD_SCALE; - public static boolean enableTexture = true; public AreaStyle area; @@ -75,7 +73,7 @@ public final class PolygonBucket extends RenderBucket { final float[] bbox = new float[8]; public void addPolygon(float[] points, int[] index) { - short center = (short) ((Tile.SIZE >> 1) * S); + short center = (short) ((Tile.SIZE >> 1) * COORD_SCALE); boolean outline = area.strokeWidth > 0; @@ -96,8 +94,8 @@ public final class PolygonBucket extends RenderBucket { int inPos = pos; for (int j = 0; j < length; j += 2) { - float x = (points[inPos++] * S); - float y = (points[inPos++] * S); + float x = (points[inPos++] * COORD_SCALE); + float y = (points[inPos++] * COORD_SCALE); xmax = Math.max(xmax, x); xmin = Math.min(xmin, x); ymax = Math.max(ymax, y); @@ -117,8 +115,8 @@ public final class PolygonBucket extends RenderBucket { } } - vertexItems.add((short) (points[pos + 0] * S), - (short) (points[pos + 1] * S)); + vertexItems.add((short) (points[pos + 0] * COORD_SCALE), + (short) (points[pos + 1] * COORD_SCALE)); numVertices++; pos += length; diff --git a/vtm/src/org/oscim/renderer/bucket/RenderBuckets.java b/vtm/src/org/oscim/renderer/bucket/RenderBuckets.java index abb70b69..f123caef 100644 --- a/vtm/src/org/oscim/renderer/bucket/RenderBuckets.java +++ b/vtm/src/org/oscim/renderer/bucket/RenderBuckets.java @@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory; import java.nio.ShortBuffer; +import static org.oscim.renderer.MapRenderer.COORD_SCALE; import static org.oscim.renderer.bucket.RenderBucket.CIRCLE; import static org.oscim.renderer.bucket.RenderBucket.HAIRLINE; import static org.oscim.renderer.bucket.RenderBucket.LINE; @@ -434,7 +435,7 @@ public class RenderBuckets extends TileData { private static short[] fillCoords; static { - short s = (short) (Tile.SIZE * MapRenderer.COORD_SCALE); + short s = (short) (Tile.SIZE * COORD_SCALE); fillCoords = new short[]{0, s, s, s, 0, 0, s, 0}; } diff --git a/vtm/src/org/oscim/renderer/bucket/SymbolBucket.java b/vtm/src/org/oscim/renderer/bucket/SymbolBucket.java index f2d372b0..2e16be64 100755 --- a/vtm/src/org/oscim/renderer/bucket/SymbolBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/SymbolBucket.java @@ -28,10 +28,11 @@ import org.slf4j.LoggerFactory; import java.nio.ShortBuffer; +import static org.oscim.renderer.MapRenderer.COORD_SCALE; + public final class SymbolBucket extends TextureBucket { static final Logger log = LoggerFactory.getLogger(SymbolBucket.class); - private final static float SCALE = 8.0f; private final static int VERTICES_PER_SPRITE = 4; private final static int LBIT_MASK = 0xfffffffe; @@ -132,10 +133,10 @@ public final class SymbolBucket extends TextureBucket { continue; } - short u1 = (short) (SCALE * x); - short v1 = (short) (SCALE * y); - short u2 = (short) (SCALE * (x + width)); - short v2 = (short) (SCALE * (y + height)); + short u1 = (short) (COORD_SCALE * x); + short v1 = (short) (COORD_SCALE * y); + short u2 = (short) (COORD_SCALE * (x + width)); + short v2 = (short) (COORD_SCALE * (y + height)); PointF prevOffset = null; short x1 = 0, y1 = 0, x2 = 0, y2 = 0; @@ -156,25 +157,25 @@ public final class SymbolBucket extends TextureBucket { float hw = width / 2f; float hh = height / 2f; - x1 = (short) (SCALE * (-hw)); - x2 = (short) (SCALE * (hw)); - y1 = (short) (SCALE * (hh)); - y2 = (short) (SCALE * (-hh)); + x1 = (short) (COORD_SCALE * (-hw)); + x2 = (short) (COORD_SCALE * (hw)); + y1 = (short) (COORD_SCALE * (hh)); + y2 = (short) (COORD_SCALE * (-hh)); } else { float hw = (float) (it.offset.x * width); float hh = (float) (it.offset.y * height); - x1 = (short) (SCALE * (-hw)); - x2 = (short) (SCALE * (width - hw)); - y1 = (short) (SCALE * (height - hh)); - y2 = (short) (SCALE * (-hh)); + x1 = (short) (COORD_SCALE * (-hw)); + x2 = (short) (COORD_SCALE * (width - hw)); + y1 = (short) (COORD_SCALE * (height - hh)); + y2 = (short) (COORD_SCALE * (-hh)); } } /* add vertices */ - short tx = (short) ((int) (SCALE * it.x) & LBIT_MASK + short tx = (short) ((int) (COORD_SCALE * it.x) & LBIT_MASK | (it.billboard ? 1 : 0)); - short ty = (short) (SCALE * it.y); + short ty = (short) (COORD_SCALE * it.y); vertexItems.add(tx, ty, x1, y1, u1, v2); vertexItems.add(tx, ty, x1, y2, u1, v1); @@ -192,17 +193,17 @@ public final class SymbolBucket extends TextureBucket { offsetX = 0; offsetY = 0; } else { - offsetX = (short) (((width / 2f) - (it.offset.x * width)) * SCALE); - offsetY = (short) (((height / 2f) - (it.offset.y * height)) * SCALE); + offsetX = (short) (((width / 2f) - (it.offset.x * width)) * COORD_SCALE); + offsetY = (short) (((height / 2f) - (it.offset.y * height)) * COORD_SCALE); } float hw = width / 2f; float hh = height / 2f; - minX = (SCALE * (-hw)); - maxX = (SCALE * (hw)); - minY = (SCALE * (hh)); - maxY = (SCALE * (-hh)); + minX = (COORD_SCALE * (-hw)); + maxX = (COORD_SCALE * (hw)); + minY = (COORD_SCALE * (hh)); + maxY = (COORD_SCALE * (-hh)); // target drawing rectangle { // lower-left @@ -231,9 +232,9 @@ public final class SymbolBucket extends TextureBucket { } /* add vertices */ - short tx = (short) (((int) (SCALE * it.x) & LBIT_MASK + short tx = (short) (((int) (COORD_SCALE * it.x) & LBIT_MASK | (it.billboard ? 1 : 0)) + offsetX); - short ty = (short) ((SCALE * it.y) + offsetY); + short ty = (short) ((COORD_SCALE * it.y) + offsetY); vertexItems.add(tx, ty, points[0], points[1], u1, v2); // lower-left vertexItems.add(tx, ty, points[2], points[3], u1, v1); // upper-left diff --git a/vtm/src/org/oscim/renderer/bucket/TextureBucket.java b/vtm/src/org/oscim/renderer/bucket/TextureBucket.java index 81ca7343..228bbc5b 100644 --- a/vtm/src/org/oscim/renderer/bucket/TextureBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/TextureBucket.java @@ -83,7 +83,7 @@ public class TextureBucket extends RenderBucket { } static class Shader extends GLShader { - int uMV, uProj, uScale, uTexSize, aPos, aTexCoord; + int uMV, uProj, uScale, uCoordScale, uTexSize, aPos, aTexCoord; Shader() { if (!create("texture_layer")) @@ -92,6 +92,7 @@ public class TextureBucket extends RenderBucket { uMV = getUniform("u_mv"); uProj = getUniform("u_proj"); uScale = getUniform("u_scale"); + uCoordScale = getUniform("u_coord_scale"); uTexSize = getUniform("u_div"); aPos = getAttrib("vertex"); aTexCoord = getAttrib("tex_coord"); @@ -127,6 +128,7 @@ public class TextureBucket extends RenderBucket { TextureBucket tb = (TextureBucket) b; gl.uniform1f(shader.uScale, tb.fixed ? 1 / scale : 1); + gl.uniform1f(shader.uCoordScale, COORD_SCALE); v.proj.setAsUniform(shader.uProj); v.mvp.setAsUniform(shader.uMV);