From 8669ab2bf44ac9e7981306714126f7f9fc79baf4 Mon Sep 17 00:00:00 2001 From: mar-v-in Date: Fri, 27 Mar 2015 23:48:19 +0100 Subject: [PATCH] Maps: Add support for circle borders --- .../microg/gms/maps/markup/CircleImpl.java | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/play-services-core/src/main/java/org/microg/gms/maps/markup/CircleImpl.java b/play-services-core/src/main/java/org/microg/gms/maps/markup/CircleImpl.java index dd98ac92..853c486f 100644 --- a/play-services-core/src/main/java/org/microg/gms/maps/markup/CircleImpl.java +++ b/play-services-core/src/main/java/org/microg/gms/maps/markup/CircleImpl.java @@ -208,9 +208,11 @@ public class CircleImpl extends ICircleDelegate.Stub implements Markup { private int matrixPosition; private int phase; private int scale; - private int direction; private int color; + private int borderColor; + private int borderWidth; + @Override public void update(GLViewport viewport) { if (!isEnabled()) { @@ -254,6 +256,7 @@ public class CircleImpl extends ICircleDelegate.Stub implements Markup { float radius = (float) (drawRadius * viewport.pos.scale); GL.uniform1f(scale, radius); + GL.uniform1f(borderWidth, (float) (options.getStrokeWidth() / (viewport.pos.scale * 10))); double x = indicatorPosition.x - viewport.pos.x; double y = indicatorPosition.y - viewport.pos.y; @@ -263,7 +266,6 @@ public class CircleImpl extends ICircleDelegate.Stub implements Markup { viewport.mvp.multiplyMM(viewport.viewproj, viewport.mvp); viewport.mvp.setAsUniform(matrixPosition); GL.uniform1f(phase, 1); - GL.uniform2f(direction, 0, 0); float alpha = Color.aToFloat(options.getFillColor()); GL.uniform4f(color, Color.rToFloat(options.getFillColor()) * alpha, @@ -271,6 +273,13 @@ public class CircleImpl extends ICircleDelegate.Stub implements Markup { Color.bToFloat(options.getFillColor()) * alpha, alpha); + alpha = Color.aToFloat(options.getStrokeColor()); + GL.uniform4f(borderColor, + Color.rToFloat(options.getStrokeColor()) * alpha, + Color.gToFloat(options.getStrokeColor()) * alpha, + Color.bToFloat(options.getStrokeColor()) * alpha, + alpha); + GL.drawArrays(GL20.GL_TRIANGLE_STRIP, 0, 4); } @@ -283,14 +292,15 @@ public class CircleImpl extends ICircleDelegate.Stub implements Markup { matrixPosition = GL.getUniformLocation(shader, "u_mvp"); phase = GL.getUniformLocation(shader, "u_phase"); scale = GL.getUniformLocation(shader, "u_scale"); - direction = GL.getUniformLocation(shader, "u_dir"); color = GL.getUniformLocation(shader, "u_color"); + + borderColor = GL.getUniformLocation(shader, "u_border_color"); + borderWidth = GL.getUniformLocation(shader, "u_border_width"); return true; } } } - private final static String vShaderStr = "" + "precision mediump float;" + "uniform mat4 u_mvp;" @@ -307,13 +317,16 @@ public class CircleImpl extends ICircleDelegate.Stub implements Markup { + "precision mediump float;" + "varying vec2 v_tex;" + "uniform float u_scale;" - + "uniform float u_phase;" - + "uniform vec2 u_dir;" + "uniform vec4 u_color;" - + + "uniform float u_border_width;" + + "uniform vec4 u_border_color;" + "void main() {" + " float len = 1.0 - length(v_tex);" + " float a = smoothstep(0.0, 2.0 / u_scale, len);" - + " gl_FragColor = u_color * a;" + + " if ( len > u_border_width )" + + " gl_FragColor = u_color;" + + " else " + + " gl_FragColor = u_border_color;" + + " gl_FragColor = gl_FragColor * a;" + "}"; }