summaryrefslogtreecommitdiff
path: root/data/shaders/path-frag.glsl
diff options
context:
space:
mode:
authorDavid Thompson <dthompson2@worcester.edu>2020-08-28 07:16:51 -0400
committerDavid Thompson <dthompson2@worcester.edu>2020-11-18 15:05:25 -0500
commit9a5ef19d5971488de18539eaf68e35bf590a4c5e (patch)
tree564512b78a8acca80c9840e6057e5a8e75feb123 /data/shaders/path-frag.glsl
parent6de9470ff9a9ac87b391c7b51fa9986faf566d2d (diff)
render: Add vector path rendering module.
Diffstat (limited to 'data/shaders/path-frag.glsl')
-rw-r--r--data/shaders/path-frag.glsl93
1 files changed, 93 insertions, 0 deletions
diff --git a/data/shaders/path-frag.glsl b/data/shaders/path-frag.glsl
new file mode 100644
index 0000000..a38f1d0
--- /dev/null
+++ b/data/shaders/path-frag.glsl
@@ -0,0 +1,93 @@
+// -*- mode: c -*-
+
+#ifdef GLSL330
+out vec4 fragColor;
+#endif
+
+#ifdef GLSL120
+attribute vec2 fragTex;
+attribute float fragStrokeLength;
+#else
+in vec2 fragTex;
+in float fragStrokeLength;
+#endif
+
+uniform int mode;
+uniform vec4 color;
+uniform float feather;
+uniform int strokeClosed;
+uniform float strokeWidth;
+uniform int strokeCap;
+uniform int strokeMiterStyle;
+uniform float strokeMiterLimit;
+
+float infinity = 1.0 / 0.0;
+
+void main(void) {
+ if (color.a <= 0.0) {
+ discard;
+ }
+
+ // fill mode
+ if(mode == 0) {
+#ifdef GLSL330
+ fragColor = color;
+#else
+ gl_FragColor = color;
+#endif
+ } else if(mode == 1) { // stroke mode
+ float hw = strokeWidth / 2.0;
+ float u = fragTex.x;
+ float v = fragTex.y;
+ float dx;
+ float dy;
+ float d;
+
+ // Stroke caps.
+ if (u < 0 || u > fragStrokeLength) {
+ if (u < 0) {
+ dx = abs(u);
+ } else {
+ dx = u - fragStrokeLength;
+ }
+ dy = abs(v);
+
+ if (strokeCap == 0) { // none
+ d = infinity;
+ } else if (strokeCap == 1) { // butt
+ d = max(dx + hw - 2 * feather, dy);
+ } else if (strokeCap == 2) { // square
+ d = max(dx, dy);
+ } else if (strokeCap == 3) { // round
+ d = sqrt(dx * dx + dy * dy);
+ } else if (strokeCap == 4) { // triangle out
+ d = dx + dy;
+ } else if (strokeCap == 5) { // triangle in
+ d = max(dy, hw - feather + dx - dy);
+ }
+ // Stroke inner/join
+ } else {
+ d = abs(v);
+ }
+
+ if(d <= hw) {
+#ifdef GLSL330
+ fragColor = color;
+#else
+ gl_FragColor = color;
+#endif
+ } else {
+ vec4 c = vec4(color.rgb, color.a * (1.0 - ((d - hw) / feather)));
+
+ if (c.a <= 0.0) {
+ discard;
+ }
+
+#ifdef GLSL330
+ fragColor = c;
+#else
+ gl_FragColor = c;
+#endif
+ }
+ }
+}