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	vec3 x = 2.0 * (color.ggg - 0.5);
18	vec3 y = 2.0 * (color.bbb - 0.5);
19	vec3 c;
20	vec3 atan_c = vec3(0.0);
21	vec3 scale = vec3(1.0);
22	vec3 sign = vec3(1.0);
23	vec4 result = vec4(0.0, 0.0, 0.0, 1.0);
24	const float epsilon = 1.0e-4;
25
26	// Avoid evaluating atan(0, x) for x < epsilon because it's implementation-dependent
27	if(x[0] > epsilon || abs(y[0]) > epsilon)
28	{
29		if(x[0] < 0.0 ^^ y[0] < 0.0)
30		{
31			sign[0] = -1.0;
32		}
33
34		if(abs(y[0]) <= abs(x[0]))
35		{
36			c[0] = abs(y[0] / x[0]);
37			// Taylors series expansion for atan
38			atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
39			scale[0] *= -1.0;
40			atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
41			scale[0] *= -1.0;
42			atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
43			scale[0] *= -1.0;
44			atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
45			scale[0] *= -1.0;
46			atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
47			scale[0] *= -1.0;
48			atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
49			scale[0] *= -1.0;
50
51			result[0] = sign[0] * atan_c[0] / (2.0 * M_PI) + 0.5;
52		}
53		else
54		{
55			c[0] = abs(x[0] / y[0]);
56
57			// Taylors series expansion for atan
58			atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
59			scale[0] *= -1.0;
60			atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
61			scale[0] *= -1.0;
62			atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
63			scale[0] *= -1.0;
64			atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
65			scale[0] *= -1.0;
66			atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
67			scale[0] *= -1.0;
68			atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
69			scale[0] *= -1.0;
70
71			result[0] = sign[0] * (M_PI / 2.0 - atan_c[0]) / (2.0 * M_PI) + 0.5;
72		}
73
74		if(x[0] < 0.0)
75			if(y[0] < 0.0) result[0] -= 0.5;
76			else if(y[0] > 0.0) result[0] += 0.5;
77	}
78
79	if(x[1] > epsilon || abs(y[1]) > epsilon)
80	{
81
82		if(x[1] < 0.0 ^^ y[1] < 0.0)
83		{
84			sign[1] = -1.0;
85		}
86
87		if(abs(y[1]) <= abs(x[1]))
88		{
89			c[1] = abs(y[1] / x[1]);
90			// Taylors series expansion for atan
91			atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
92			scale[1] *= -1.0;
93			atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
94			scale[1] *= -1.0;
95			atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
96			scale[1] *= -1.0;
97			atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
98			scale[1] *= -1.0;
99			atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
100			scale[1] *= -1.0;
101			atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
102			scale[1] *= -1.0;
103
104			result[1] = sign[1] * atan_c[1] / (2.0 * M_PI) + 0.5;
105		}
106		else
107		{
108			c[1] = abs(x[1] / y[1]);
109
110			// Taylors series expansion for atan
111			atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
112			scale[1] *= -1.0;
113			atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
114			scale[1] *= -1.0;
115			atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
116			scale[1] *= -1.0;
117			atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
118			scale[1] *= -1.0;
119			atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
120			scale[1] *= -1.0;
121			atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
122			scale[1] *= -1.0;
123
124			result[1] = sign[1] * (M_PI / 2.0 - atan_c[1]) / (2.0 * M_PI) + 0.5;
125		}
126
127		if(x[1] < 0.0)
128			if(y[1] < 0.0) result[1] -= 0.5;
129			else if(y[1] > 0.0) result[1] += 0.5;
130	}
131
132	if(x[2] > epsilon || abs(y[2]) > epsilon)
133	{
134
135		if(x[2] < 0.0 ^^ y[2] < 0.0)
136		{
137			sign[2] = -1.0;
138		}
139
140		if(abs(y[2]) <= abs(x[2]))
141		{
142			c[2] = abs(y[2] / x[2]);
143			// Taylors series expansion for atan
144			atan_c[2] += scale[2] * pow(c[2], float(1)) / float(1);
145			scale[2] *= -1.0;
146			atan_c[2] += scale[2] * pow(c[2], float(3)) / float(3);
147			scale[2] *= -1.0;
148			atan_c[2] += scale[2] * pow(c[2], float(5)) / float(5);
149			scale[2] *= -1.0;
150			atan_c[2] += scale[2] * pow(c[2], float(7)) / float(7);
151			scale[2] *= -1.0;
152			atan_c[2] += scale[2] * pow(c[2], float(9)) / float(9);
153			scale[2] *= -1.0;
154			atan_c[2] += scale[2] * pow(c[2], float(11)) / float(11);
155			scale[2] *= -1.0;
156
157			result[2] = sign[2] * atan_c[2] / (2.0 * M_PI) + 0.5;
158		}
159		else
160		{
161			c[2] = abs(x[2] / y[2]);
162
163			// Taylors series expansion for atan
164			atan_c[2] += scale[2] * pow(c[2], float(1)) / float(1);
165			scale[2] *= -1.0;
166			atan_c[2] += scale[2] * pow(c[2], float(3)) / float(3);
167			scale[2] *= -1.0;
168			atan_c[2] += scale[2] * pow(c[2], float(5)) / float(5);
169			scale[2] *= -1.0;
170			atan_c[2] += scale[2] * pow(c[2], float(7)) / float(7);
171			scale[2] *= -1.0;
172			atan_c[2] += scale[2] * pow(c[2], float(9)) / float(9);
173			scale[2] *= -1.0;
174			atan_c[2] += scale[2] * pow(c[2], float(11)) / float(11);
175			scale[2] *= -1.0;
176
177			result[2] = sign[2] * (M_PI / 2.0 - atan_c[2]) / (2.0 * M_PI) + 0.5;
178		}
179
180		if(x[2] < 0.0)
181			if(y[2] < 0.0) result[2] -= 0.5;
182			else if(y[2] > 0.0) result[2] += 0.5;
183	}
184
185	gl_FragColor = result;
186}
187