Circles (GL points) stroke #268

This commit is contained in:
Emux 2016-12-14 11:34:34 +02:00
parent 7acbea88cc
commit 61b8233b97
4 changed files with 26 additions and 13 deletions

View File

@ -62,7 +62,9 @@ public class CircleTest extends GdxMap {
CircleStyle cs = CircleStyle.builder() CircleStyle cs = CircleStyle.builder()
.radius(30) .radius(30)
.color(0xff00ff00) .color(Color.MAGENTA)
.strokeWidth(6)
.strokeColor(Color.WHITE)
.build(); .build();
CircleBucket cb = renderer.buckets.addCircleBucket(0, cs); CircleBucket cb = renderer.buckets.addCircleBucket(0, cs);
addCircle(200, -200, cb); addCircle(200, -200, cb);

View File

@ -2,11 +2,11 @@
precision highp float; precision highp float;
#endif #endif
uniform mat4 u_mvp; uniform mat4 u_mvp;
uniform float u_scale; uniform float u_radius;
attribute vec2 a_pos; attribute vec2 a_pos;
void main() { void main() {
gl_Position = u_mvp * vec4(a_pos, 0.0, 1.0); gl_Position = u_mvp * vec4(a_pos, 0.0, 1.0);
gl_PointSize = 2.0 * u_scale / gl_Position.z; gl_PointSize = 2.0 * u_radius / gl_Position.z;
} }
$$ $$
@ -17,11 +17,16 @@ $$
#ifdef GLES #ifdef GLES
precision highp float; precision highp float;
#endif #endif
uniform vec4 u_color; uniform vec4 u_fill;
uniform float u_radius;
uniform vec4 u_stroke;
uniform float u_width;
void main() { void main() {
vec2 cxy = 2.0 * gl_PointCoord - 1.0; vec2 cxy = 2.0 * gl_PointCoord - 1.0;
float r = dot(cxy, cxy); float r = dot(cxy, cxy);
float delta = fwidth(r); float delta = fwidth(r);
float alpha = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r); float alpha = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);
gl_FragColor = u_color * alpha; float edge = 1.0 - u_width / u_radius;
float stroke = 1.0 - smoothstep(edge - delta, edge + delta, r);
gl_FragColor = mix(u_stroke, u_fill, stroke) * alpha;
} }

View File

@ -14,9 +14,11 @@ $$
#ifdef GLES #ifdef GLES
precision highp float; precision highp float;
#endif #endif
uniform vec4 u_color; uniform vec4 u_fill;
uniform float u_scale; uniform float u_radius;
uniform vec4 u_stroke;
uniform float u_width;
varying vec2 v_pos; varying vec2 v_pos;
void main() { void main() {
gl_FragColor = u_color; gl_FragColor = u_fill;
} }

View File

@ -90,7 +90,7 @@ public class CircleBucket extends RenderBucket {
} }
public static class Shader extends GLShader { public static class Shader extends GLShader {
int uMVP, uColor, uScale, aPos; int uMVP, uFill, uRadius, uStroke, uWidth, aPos;
Shader(String shaderFile) { Shader(String shaderFile) {
if (!GLAdapter.CIRCLE_QUADS) if (!GLAdapter.CIRCLE_QUADS)
@ -106,8 +106,10 @@ public class CircleBucket extends RenderBucket {
return; return;
uMVP = getUniform("u_mvp"); uMVP = getUniform("u_mvp");
uColor = getUniform("u_color"); uFill = getUniform("u_fill");
uScale = getUniform("u_scale"); uRadius = getUniform("u_radius");
uStroke = getUniform("u_stroke");
uWidth = getUniform("u_width");
aPos = getAttrib("a_pos"); aPos = getAttrib("a_pos");
} }
@ -130,8 +132,10 @@ public class CircleBucket extends RenderBucket {
CircleBucket cb = (CircleBucket) b; CircleBucket cb = (CircleBucket) b;
CircleStyle circle = cb.circle.current(); CircleStyle circle = cb.circle.current();
GLUtils.setColor(s.uColor, circle.fillColor, 1); GLUtils.setColor(s.uFill, circle.fillColor, 1);
gl.uniform1f(s.uScale, circle.radius); gl.uniform1f(s.uRadius, circle.radius);
GLUtils.setColor(s.uStroke, circle.strokeColor, 1);
gl.uniform1f(s.uWidth, circle.strokeWidth);
gl.vertexAttribPointer(s.aPos, 2, GL.SHORT, gl.vertexAttribPointer(s.aPos, 2, GL.SHORT,
false, 0, cb.vertexOffset); false, 0, cb.vertexOffset);