[dali_2.3.19] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / resources / dli_arc.fsh
1 #version 300 es\r
2 \r
3 #ifdef HIGHP\r
4   precision highp float;\r
5 #else\r
6   precision mediump float;\r
7 #endif\r
8 \r
9 #define ROUND_STARTCAP   0x1\r
10 #define ROUND_ENDCAP     0x2\r
11 #define SQUARE_STARTCAP  0x4\r
12 #define SQUARE_ENDCAP    0x8\r
13 precision mediump float;\r
14 \r
15 in vec2 vUV;\r
16 \r
17 uniform vec4 uColor;\r
18 uniform int antiAliasing;\r
19 uniform float radius;\r
20 uniform vec2 startAngle;\r
21 uniform vec2 endAngle;\r
22 uniform int arcCaps;\r
23 \r
24 out vec4 FragColor;\r
25 \r
26 \r
27 void main()\r
28 {\r
29 ////////////////////\r
30 //Inputs\r
31   float radius1 = 1.0;\r
32   float uvPixel = length( dFdx( vUV ) ) * 2.0;\r
33   float dx = mix( 0.0001, uvPixel, antiAliasing > 0 );\r
34   float radius2 = mix( 1.0 - radius * uvPixel - dx , -radius , step( 0.0, -radius ) );\r
35 ////////////////////\r
36   float alpha = 0.0;\r
37   float circle = 0.0;\r
38 \r
39   vec2 uv = fract(vUV) * 2.0 - 1.0;\r
40 \r
41   float ang_img = endAngle.y * startAngle.x - endAngle.x * startAngle.y;\r
42   float half1 = uv.x * startAngle.x - uv.y * startAngle.y;\r
43   float half2 = uv.y * endAngle.y - uv.x * endAngle.x;\r
44   float len = length(uv);\r
45   float equalAngles = step(0.99999, dot(endAngle, startAngle));\r
46   float right_side = step(0.0, ang_img);\r
47   vec2 uv_norm = normalize(uv);\r
48   float cap_radius = -0.5 + radius2 / 2.0;\r
49   float square_cap;\r
50   float sq_plane;\r
51 \r
52     /******************************************\r
53    * Equivalent to:\r
54    * if( len > radius1 || len < radius2 )\r
55    */\r
56   circle = alpha =  smoothstep( len, len + dx, radius1 ) * smoothstep( -len, -len + dx, -radius2 );\r
57   float half1_step = smoothstep( -dx, 0.0, half1 );\r
58   float half2_step = smoothstep( -dx, 0.0, half2 );\r
59 \r
60   float neg_angimg = max( half1_step, half2_step );\r
61   float pos_angimg = min( half1_step, half2_step );\r
62   /******************************************\r
63    * Equivalent to:\r
64   if(ang_img < 0.0)\r
65   {\r
66     alpha *= max(smoothstep( 0.0, dx, half1 ), smoothstep( 0.0, dx, half2));\r
67   }\r
68   else\r
69   {\r
70     alpha *= min(smoothstep( 0.0, dx, half1 ) , smoothstep( 0.0, dx, half2 ));\r
71   }\r
72   */\r
73   alpha *= mix( neg_angimg, pos_angimg, step(0.0, ang_img) );\r
74 \r
75   alpha = mix( alpha, mix( circle, 0.0, right_side ), equalAngles );\r
76 \r
77   if((arcCaps & ROUND_STARTCAP) > 0)\r
78   {\r
79     len = length(uv - normalize( vec2( startAngle.y, startAngle.x )) * (1.0 + cap_radius));\r
80     alpha = max(alpha, smoothstep(cap_radius, cap_radius + dx, -len) );\r
81   }\r
82   if((arcCaps & ROUND_ENDCAP) > 0)\r
83   {\r
84     len = length(uv - normalize( vec2( endAngle.y, endAngle.x )) * (1.0 + cap_radius));\r
85     alpha = max(alpha, smoothstep(cap_radius, cap_radius + dx, -len) );\r
86   }\r
87 \r
88   if((arcCaps & SQUARE_STARTCAP) > 0)\r
89   {\r
90     sq_plane = -uv.x * startAngle.y - uv.y * startAngle.x;\r
91     square_cap = min(step( 0.0, -half1 ), smoothstep( cap_radius, cap_radius + dx, half1 ));\r
92     square_cap = min(square_cap, smoothstep( radius2, radius2 + dx, -sq_plane ));\r
93     square_cap = min(square_cap, smoothstep( -1.0, -1.0 + dx, sq_plane ));\r
94     alpha = max(square_cap, alpha);\r
95   }\r
96 \r
97   if((arcCaps & SQUARE_ENDCAP) > 0)\r
98   {\r
99     sq_plane = -uv.x * endAngle.y - uv.y * endAngle.x;\r
100     square_cap = min(step( 0.0, -half2 ), smoothstep( cap_radius, cap_radius + dx, half2 ));\r
101     square_cap = min(square_cap, smoothstep( radius2, radius2 + dx, -sq_plane ));\r
102     square_cap = min(square_cap, smoothstep( -1.0, -1.0 + dx, sq_plane ));\r
103     alpha = max(square_cap, alpha);\r
104   }\r
105 \r
106   if( alpha == 0.0 )\r
107   {\r
108     discard;\r
109   }\r
110 \r
111   FragColor = vec4(vec3(uColor), uColor.a * alpha);\r
112 }\r