diff --git a/vtm-playground/src/org/oscim/test/CircleTest.java b/vtm-playground/src/org/oscim/test/CircleTest.java new file mode 100644 index 00000000..0adaf721 --- /dev/null +++ b/vtm-playground/src/org/oscim/test/CircleTest.java @@ -0,0 +1,76 @@ +/* + * Copyright 2016 devemux86 + * + * This program is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along with + * this program. If not, see . + */ +package org.oscim.test; + +import org.oscim.backend.canvas.Color; +import org.oscim.core.GeometryBuffer; +import org.oscim.gdx.GdxMap; +import org.oscim.gdx.GdxMapApp; +import org.oscim.layers.GenericLayer; +import org.oscim.renderer.BucketRenderer; +import org.oscim.renderer.GLViewport; +import org.oscim.renderer.MapRenderer; +import org.oscim.renderer.bucket.CircleBucket; +import org.oscim.theme.styles.CircleStyle; + +public class CircleTest extends GdxMap { + + private final GeometryBuffer geom = new GeometryBuffer(2, 1); + private final Renderer renderer = new Renderer(); + + private void addCircle(float x, float y, CircleBucket cb) { + geom.clear(); + geom.startPoints(); + geom.addPoint(x, y); + cb.addCircle(geom); + } + + private class Renderer extends BucketRenderer { + + Renderer() { + mMapPosition.scale = 0; + } + + @Override + public void update(GLViewport v) { + if (mMapPosition.scale == 0) + mMapPosition.copy(v.pos); + + if (!isReady()) + compile(); + } + } + + @Override + protected void createLayers() { + MapRenderer.setBackgroundColor(Color.BLACK); + + mMap.setMapPosition(0, 0, 1 << 4); + + CircleStyle cs = new CircleStyle(30, false, 0xff00ff00, 0xffffffff, 2, 0); + CircleBucket cb = renderer.buckets.addCircleBucket(0, cs); + addCircle(200, -200, cb); + addCircle(-200, -200, cb); + addCircle(-200, 200, cb); + addCircle(200, 200, cb); + + mMap.layers().add(new GenericLayer(mMap, renderer)); + } + + public static void main(String[] args) { + GdxMapApp.init(); + GdxMapApp.run(new CircleTest()); + } +} diff --git a/vtm/resources/assets/shaders/circle.glsl b/vtm/resources/assets/shaders/circle.glsl index 4fd2442b..7d1d8687 100644 --- a/vtm/resources/assets/shaders/circle.glsl +++ b/vtm/resources/assets/shaders/circle.glsl @@ -2,15 +2,11 @@ precision highp float; #endif uniform mat4 u_mvp; -uniform float u_radius; -uniform vec2 u_screen; +uniform float u_scale; attribute vec2 a_pos; -varying vec2 v_tex; - -void -main(){ - gl_Position = u_mvp * vec4(a_pos, 0.0, 1.0); - v_tex = a_pos; +void main() { + gl_Position = u_mvp * vec4(a_pos, 0.0, 1.0); + gl_PointSize = 2.0 * u_scale / gl_Position.z; } $$ @@ -18,13 +14,10 @@ $$ #ifdef GLES precision highp float; #endif -varying vec2 v_tex; -uniform float u_radius; uniform vec4 u_color; -uniform vec2 u_screen; - -void -main(){ - float len = 1.0 - length(v_tex - u_screen); - gl_FragColor = u_color * smoothstep(0.0, u_radius, len); +void main() { + vec2 cxy = 2.0 * gl_PointCoord - 1.0; + float r = dot(cxy, cxy); + float len = 1.0 - length(r); + gl_FragColor = u_color * len; } diff --git a/vtm/src/org/oscim/renderer/bucket/CircleBucket.java b/vtm/src/org/oscim/renderer/bucket/CircleBucket.java index 5afcfc30..5ff6af1a 100644 --- a/vtm/src/org/oscim/renderer/bucket/CircleBucket.java +++ b/vtm/src/org/oscim/renderer/bucket/CircleBucket.java @@ -1,6 +1,22 @@ +/* + * Copyright 2016 Andrey Novikov + * Copyright 2016 devemux86 + * + * This program is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along with + * this program. If not, see . + */ package org.oscim.renderer.bucket; import org.oscim.backend.GL; +import org.oscim.backend.GLAdapter; import org.oscim.core.GeometryBuffer; import org.oscim.renderer.GLShader; import org.oscim.renderer.GLState; @@ -14,7 +30,8 @@ import static org.oscim.backend.GLAdapter.gl; import static org.oscim.renderer.MapRenderer.COORD_SCALE; public class CircleBucket extends RenderBucket { - static final Logger log = LoggerFactory.getLogger(CircleBucket.class); + + private static final Logger log = LoggerFactory.getLogger(CircleBucket.class); public CircleStyle circle; @@ -38,24 +55,30 @@ public class CircleBucket extends RenderBucket { } public static class Renderer { - static CircleBucket.Renderer.Shader shader; + static Shader shader; static boolean init() { - shader = new CircleBucket.Renderer.Shader("circle"); + shader = new Shader("circle"); return true; } public static class Shader extends GLShader { - int uMVP, uColor, uRadius, uScreen, aPos; + int uMVP, uColor, uScale, aPos; Shader(String shaderFile) { - if (!create(shaderFile)) + gl.enable(GL.VERTEX_PROGRAM_POINT_SIZE); + + // OpenGL needs GLSL version 120 + String version = null; + if (GLAdapter.GDX_DESKTOP_QUIRKS) + version = "120"; + + if (!createVersioned(shaderFile, version)) return; uMVP = getUniform("u_mvp"); uColor = getUniform("u_color"); - uRadius = getUniform("u_radius"); - uScreen = getUniform("u_screen"); + uScale = getUniform("u_scale"); aPos = getAttrib("a_pos"); } @@ -64,15 +87,13 @@ public class CircleBucket extends RenderBucket { GLState.enableVertexArrays(aPos, -1); v.mvp.setAsUniform(uMVP); - gl.uniform2f(uScreen, v.getWidth() / 2, v.getHeight() / 2); - gl.lineWidth(2); } } public static RenderBucket draw(RenderBucket b, GLViewport v) { GLState.blend(true); - CircleBucket.Renderer.Shader s = shader; + Shader s = shader; s.set(v); @@ -80,12 +101,15 @@ public class CircleBucket extends RenderBucket { CircleBucket cb = (CircleBucket) b; GLUtils.setColor(s.uColor, cb.circle.fill, 1); - gl.uniform1f(s.uRadius, cb.circle.radius); + gl.uniform1f(s.uScale, cb.circle.radius); gl.vertexAttribPointer(s.aPos, 2, GL.SHORT, false, 0, cb.vertexOffset); - gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4); + gl.drawElements(GL.POINTS, + cb.numIndices, + GL.UNSIGNED_SHORT, + cb.indiceOffset); } return b; diff --git a/vtm/src/org/oscim/renderer/bucket/RenderBuckets.java b/vtm/src/org/oscim/renderer/bucket/RenderBuckets.java index d7943d18..abb70b69 100644 --- a/vtm/src/org/oscim/renderer/bucket/RenderBuckets.java +++ b/vtm/src/org/oscim/renderer/bucket/RenderBuckets.java @@ -381,14 +381,6 @@ public class RenderBuckets extends TileData { } } - for (RenderBucket l = buckets; l != null; l = l.next) { - if (l.type == CIRCLE) { - l.compile(vboData, iboData); - l.vertexOffset = pos; - pos += l.numVertices; - } - } - offset[LINE] = vboData.position() * SHORT_BYTES; pos = 0; for (RenderBucket l = buckets; l != null; l = l.next) { diff --git a/vtm/src/org/oscim/theme/styles/CircleStyle.java b/vtm/src/org/oscim/theme/styles/CircleStyle.java index a251ba3e..dc3b0b05 100644 --- a/vtm/src/org/oscim/theme/styles/CircleStyle.java +++ b/vtm/src/org/oscim/theme/styles/CircleStyle.java @@ -31,7 +31,7 @@ public final class CircleStyle extends RenderStyle { public final boolean scaleRadius; public final float strokeWidth; - public CircleStyle(Float radius, boolean scaleRadius, int fill, int stroke, + public CircleStyle(float radius, boolean scaleRadius, int fill, int stroke, float strokeWidth, int level) { super();