Warning, /frameworks/kquickcharts/src/shaders6/piechart.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  *
0005  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006  */
0007 
0008 #version 440
0009 
0010 #extension GL_GOOGLE_include_directive: enable
0011 #include "sdf.glsl"
0012 
0013 // The maximum number of segments we can support for a single pie.
0014 // This is based on OpenGL's MAX_FRAGMENT_UNIFORM_COMPONENTS.
0015 // MAX_FRAGMENT_UNIFORM_COMPONENTS is required to be at least 1024.
0016 // Assuming a segment of size 1, each segment needs
0017 // 2 (size of a vec2) * 2 (number of points) + 4 (size of vec4) + 1 (segment size)
0018 // components. We also need to leave some room for the other uniforms.
0019 #define MAX_SEGMENTS 100
0020 
0021 layout(std140, binding = 0) uniform buf {
0022     highp mat4 matrix;
0023     lowp vec2 aspect; // offset 64
0024     lowp float opacity; // offset 72
0025     lowp float innerRadius; // offset 76
0026     lowp float outerRadius; // offset 80
0027     lowp vec4 backgroundColor; // offset 96
0028     bool smoothEnds; // offset 112
0029     lowp float fromAngle; // offset 116
0030     lowp float toAngle; // offset 120
0031 
0032     lowp vec2 segments[MAX_SEGMENTS]; // offset 128 with vec4 alignment!
0033     lowp vec4 colors[MAX_SEGMENTS]; // offset 1728
0034     int segmentCount; // offset 3328
0035 } ubuf; // size 3332
0036 
0037 layout (location = 0) in lowp vec2 uv;
0038 layout (location = 0) out lowp vec4 out_color;
0039 
0040 const lowp vec2 origin = vec2(0.0, 0.0);
0041 const lowp float lineSmooth = 0.001;
0042 
0043 lowp float rounded_segment(lowp float from, lowp float to, lowp float inner, lowp float outer, lowp float rounding)
0044 {
0045     return sdf_torus_segment(uv, from + rounding, to - rounding, inner + rounding, outer - rounding) - rounding;
0046 }
0047 
0048 void main()
0049 {
0050     lowp vec4 color = vec4(0.0);
0051 
0052     lowp float thickness = (ubuf.outerRadius - ubuf.innerRadius) / 2.0;
0053     lowp float rounding = ubuf.smoothEnds ? thickness : 0.0;
0054 
0055     // Background first, slightly smaller than the actual pie to avoid antialiasing artifacts.
0056     lowp float background_rounding = (ubuf.toAngle - ubuf.fromAngle) >= 2.0 * pi ? 0.001 : rounding + 0.001;
0057     lowp float background = rounded_segment(ubuf.fromAngle, ubuf.toAngle, ubuf.innerRadius, ubuf.outerRadius, background_rounding);
0058     color = sdf_render(background, color, ubuf.backgroundColor);
0059 
0060     for (int i = 0; i < ubuf.segmentCount && i < MAX_SEGMENTS; ++i) {
0061         lowp vec2 segment = ubuf.segments[i];
0062 
0063         lowp float segment_sdf = rounded_segment(segment.x, segment.y, ubuf.innerRadius, ubuf.outerRadius, rounding);
0064         color = sdf_render(segment_sdf, color, ubuf.colors[i]);
0065     }
0066 
0067     out_color = color * ubuf.opacity;
0068 }