Warning, /frameworks/kquickcharts/src/shaders/linechart.frag is written in an unsupported language. File is not indexed.
0001 /*
0002 * This file is part of KQuickCharts
0003 * SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl>
0004 * SPDX-FileCopyrightText: 2022 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0005 *
0006 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008
0009 #version 440
0010
0011 #extension GL_GOOGLE_include_directive: enable
0012 #include "sdf.glsl"
0013
0014 layout(std140, binding = 0) uniform buf {
0015 highp mat4 matrix;
0016 lowp float opacity; // inherited opacity of this item - offset 64
0017 lowp float lineWidth; // offset 68
0018 lowp float aspect; // offset 72
0019 lowp float smoothing; // offset 76
0020 } ubuf; // size 80
0021
0022 #define MAXIMUM_POINT_COUNT 14
0023
0024 layout (location = 0) in mediump vec2 uv;
0025 layout (location = 1) in mediump vec4 pointTuples[MAXIMUM_POINT_COUNT / 2];
0026 layout (location = 19) in highp float pointCount;
0027 layout (location = 20) in mediump vec2 bounds;
0028 layout (location = 21) in mediump vec4 lineColor;
0029 layout (location = 22) in mediump vec4 fillColor;
0030 layout (location = 0) out lowp vec4 out_color;
0031
0032 // ES2 does not support array function arguments. So instead we need to
0033 // reference the uniform array directly. So this copies the implementation of
0034 // sdf_polygon from sdf.glsl, changing it to refer to the points array directly.
0035 // For simplicity, we use the same function also for other APIs.
0036 lowp float sdf_polygon(in lowp vec2 point, in int count)
0037 {
0038 mediump vec2 points[MAXIMUM_POINT_COUNT];
0039 points[0] = pointTuples[0].xy;
0040 points[1] = pointTuples[0].zw;
0041 points[2] = pointTuples[1].xy;
0042 points[3] = pointTuples[1].zw;
0043 points[4] = pointTuples[2].xy;
0044 points[5] = pointTuples[2].zw;
0045 points[6] = pointTuples[3].xy;
0046 points[7] = pointTuples[3].zw;
0047 points[8] = pointTuples[4].xy;
0048 points[9] = pointTuples[4].zw;
0049 points[10] = pointTuples[5].xy;
0050 points[11] = pointTuples[5].zw;
0051 points[12] = pointTuples[6].xy;
0052 points[13] = pointTuples[6].zw;
0053
0054 lowp float d = dot(point - points[0], point - points[0]);
0055 lowp float s = 1.0;
0056 for (int i = 0, j = count - 1; i < count && i < MAXIMUM_POINT_COUNT; j = i, i++)
0057 {
0058 lowp vec2 e = points[j] - points[i];
0059 lowp vec2 w = point - points[i];
0060 lowp float h = clamp( dot(w, e) / dot(e, e), 0.0, 1.0 );
0061 lowp vec2 b = w - e * h;
0062 d = min(d, dot(b, b));
0063
0064 bvec3 c = bvec3(point.y >= points[i].y, point.y < points[j].y, e.x * w.y > e.y * w.x);
0065 if(all(c) || all(not(c))) s *= -1.0;
0066 }
0067 return s * sqrt(d);
0068 }
0069
0070 void main()
0071 {
0072 lowp vec2 point = uv;
0073
0074 lowp vec4 color = vec4(0.0, 0.0, 0.0, 0.0);
0075
0076 lowp float bounds_range = max(0.01, ubuf.lineWidth);
0077
0078 // bounds.y contains the line segment's maximum value. If we are a bit above
0079 // that, we will never render anything, so just discard the pixel.
0080 if (point.y > bounds.y + bounds_range) {
0081 out_color = vec4(0.0);
0082 return;
0083 }
0084
0085 // bounds.x contains the line segment's minimum value. If we are a bit below
0086 // that, we know we will always be inside the polygon described by points.
0087 // So just return a pixel with fillColor.
0088 if (point.y < bounds.x - bounds_range) {
0089 out_color = fillColor * ubuf.opacity;
0090 return;
0091 }
0092
0093 lowp float polygon = sdf_polygon(point, int(pointCount));
0094
0095 color = sdf_render(polygon, color, fillColor);
0096
0097 if (ubuf.lineWidth > 0.0) {
0098 color = mix(color, lineColor, 1.0 - smoothstep(-ubuf.smoothing, ubuf.smoothing, sdf_annular(polygon, ubuf.lineWidth)));
0099 }
0100
0101 out_color = color * ubuf.opacity;
0102 }