LocationRenderer: add reverse version of shader 1 (#318)

This commit is contained in:
Mathieu De Brito 2017-03-03 18:09:44 +01:00 committed by Emux
parent 559f4899dd
commit d8001e23f6

View File

@ -3,6 +3,7 @@
* Copyright 2013 Hannes Janetzek
* Copyright 2016 devemux86
* Copyright 2016 ocsike
* Copyright 2017 Mathieu De Brito
*
* 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
@ -36,7 +37,7 @@ public class LocationRenderer extends LayerRenderer {
private static final float CIRCLE_SIZE = 60;
private static final int SHOW_ACCURACY_ZOOM = 16;
public enum Shader {SHADER_1, SHADER_2}
public enum Shader {SHADER_1, SHADER_1_REVERSE, SHADER_2}
private final Map mMap;
private final Layer mLayer;
@ -248,6 +249,9 @@ public class LocationRenderer extends LayerRenderer {
case SHADER_1:
shader = GLShader.createProgram(vShaderStr, fShaderStr1);
break;
case SHADER_1_REVERSE:
shader = GLShader.createProgram(vShaderStr, fShaderStr1Reverse);
break;
case SHADER_2:
shader = GLShader.createProgram(vShaderStr, fShaderStr2);
break;
@ -306,6 +310,35 @@ public class LocationRenderer extends LayerRenderer {
+ " gl_FragColor = vec4(0.2, 0.2, 0.8, 1.0) * a;"
+ "}}";
private static final String fShaderStr1Reverse = ""
+ "precision mediump float;"
+ "varying vec2 v_tex;"
+ "uniform float u_scale;"
+ "uniform float u_phase;"
+ "uniform vec2 u_dir;"
+ "void main() {"
+ " float len = 1.0 - length(v_tex);"
+ " if (u_dir.x == 0.0 && u_dir.y == 0.0){"
+ " gl_FragColor = vec4(0.2, 0.2, 0.8, 1.0) * len;"
+ " } else {"
/// outer ring
+ " float a = smoothstep(0.0, 2.0 / u_scale, len);"
/// inner ring
+ " float b = 0.5 * smoothstep(4.0 / u_scale, 5.0 / u_scale, len);"
/// center point
+ " float c = 0.5 * (1.0 - smoothstep(14.0 / u_scale, 16.0 / u_scale, 1.0 - len));"
+ " vec2 dir = normalize(v_tex);"
+ " float d = dot(dir, u_dir); "
/// 0.5 width of viewshed
+ " d = clamp(step(0.5, d), 0.4, 0.7);"
/// - subtract inner from outer to create the outline
/// - multiply by viewshed
/// - add center point
+ " a = d * (a - (b + c)) + c;"
+ " gl_FragColor = vec4(0.2, 0.2, 0.8, 1.0) * a;"
+ "}}";
private static final String fShaderStr2 = ""
+ "precision mediump float;"
+ "varying vec2 v_tex;"