1
2/*
3Copyright (c) 2019 The Khronos Group Inc.
4Use of this source code is governed by an MIT-style license that can be
5found in the LICENSE.txt file.
6*/
7
8
9#ifdef GL_ES
10precision mediump float;
11#endif
12varying vec4 color;
13
14void main (void)
15{
16	const float M_PI = 3.14159265358979323846;
17	vec2 c = 4.0 * 2.0 * (color.rg - 0.5);
18	vec2 atan_c = vec2(0.0);
19	vec2 scale = vec2(1.0);
20	vec2 sign = vec2(1.0);
21	vec4 result = vec4(0.0, 0.0, 0.0, 1.0);
22
23	if(c[0] < 0.0)
24	{
25		sign[0] = -1.0;
26		c[0] *= -1.0;
27	}
28
29	if(c[0] <= 1.0)
30	{
31		// Taylors series expansion for atan
32		atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
33		scale[0] *= -1.0;
34		atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
35		scale[0] *= -1.0;
36		atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
37		scale[0] *= -1.0;
38		atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
39		scale[0] *= -1.0;
40		atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
41		scale[0] *= -1.0;
42		atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
43		scale[0] *= -1.0;
44
45		result[0] = sign[0] * atan_c[0] / M_PI + 0.5;
46	}
47	else
48	{
49		c[0] = 1.0 / c[0];
50
51		// Taylors series expansion for atan
52		atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
53		scale[0] *= -1.0;
54		atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
55		scale[0] *= -1.0;
56		atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
57		scale[0] *= -1.0;
58		atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
59		scale[0] *= -1.0;
60		atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
61		scale[0] *= -1.0;
62		atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
63		scale[0] *= -1.0;
64
65		result[0] = sign[0] * (M_PI / 2.0 - atan_c[0]) / M_PI + 0.5;
66	}
67
68
69	if(c[1] < 0.0)
70	{
71		sign[1] = -1.0;
72		c[1] *= -1.0;
73	}
74
75	if(c[1] <= 1.0)
76	{
77		// Taylors series expansion for atan
78		atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
79		scale[1] *= -1.0;
80		atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
81		scale[1] *= -1.0;
82		atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
83		scale[1] *= -1.0;
84		atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
85		scale[1] *= -1.0;
86		atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
87		scale[1] *= -1.0;
88		atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
89		scale[1] *= -1.0;
90
91		result[1] = sign[1] * atan_c[1] / M_PI + 0.5;
92	}
93	else
94	{
95		c[1] = 1.0 / c[1];
96
97		// Taylors series expansion for atan
98		atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
99		scale[1] *= -1.0;
100		atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
101		scale[1] *= -1.0;
102		atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
103		scale[1] *= -1.0;
104		atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
105		scale[1] *= -1.0;
106		atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
107		scale[1] *= -1.0;
108		atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
109		scale[1] *= -1.0;
110
111		result[1] = sign[1] * (M_PI / 2.0 - atan_c[1]) / M_PI + 0.5;
112	}
113
114	gl_FragColor = result;
115}
116