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
9attribute vec4 gtf_Vertex;
10attribute vec4 gtf_Color;
11uniform mat4 gtf_ModelViewProjectionMatrix;
12varying vec4 color;
13
14void main (void)
15{
16	const float M_PI = 3.14159265358979323846;
17	vec3 x = 2.0 * (gtf_Color.ggg - 0.5);
18	vec3 y = 2.0 * (gtf_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		if(x[1] < 0.0 ^^ y[1] < 0.0)
82		{
83			sign[1] = -1.0;
84		}
85
86		if(abs(y[1]) <= abs(x[1]))
87		{
88			c[1] = abs(y[1] / x[1]);
89			// Taylors series expansion for atan
90			atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
91			scale[1] *= -1.0;
92			atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
93			scale[1] *= -1.0;
94			atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
95			scale[1] *= -1.0;
96			atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
97			scale[1] *= -1.0;
98			atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
99			scale[1] *= -1.0;
100			atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
101			scale[1] *= -1.0;
102
103			result[1] = sign[1] * atan_c[1] / (2.0 * M_PI) + 0.5;
104		}
105		else
106		{
107			c[1] = abs(x[1] / y[1]);
108
109			// Taylors series expansion for atan
110			atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
111			scale[1] *= -1.0;
112			atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
113			scale[1] *= -1.0;
114			atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
115			scale[1] *= -1.0;
116			atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
117			scale[1] *= -1.0;
118			atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
119			scale[1] *= -1.0;
120			atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
121			scale[1] *= -1.0;
122
123			result[1] = sign[1] * (M_PI / 2.0 - atan_c[1]) / (2.0 * M_PI) + 0.5;
124		}
125
126		if(x[1] < 0.0)
127			if(y[1] < 0.0) result[1] -= 0.5;
128			else if(y[1] > 0.0) result[1] += 0.5;
129	}
130
131	if(x[2] > epsilon || abs(y[2]) > epsilon)
132	{
133		if(x[2] < 0.0 ^^ y[2] < 0.0)
134		{
135			sign[2] = -1.0;
136		}
137
138		if(abs(y[2]) <= abs(x[2]))
139		{
140			c[2] = abs(y[2] / x[2]);
141			// Taylors series expansion for atan
142			atan_c[2] += scale[2] * pow(c[2], float(1)) / float(1);
143			scale[2] *= -1.0;
144			atan_c[2] += scale[2] * pow(c[2], float(3)) / float(3);
145			scale[2] *= -1.0;
146			atan_c[2] += scale[2] * pow(c[2], float(5)) / float(5);
147			scale[2] *= -1.0;
148			atan_c[2] += scale[2] * pow(c[2], float(7)) / float(7);
149			scale[2] *= -1.0;
150			atan_c[2] += scale[2] * pow(c[2], float(9)) / float(9);
151			scale[2] *= -1.0;
152			atan_c[2] += scale[2] * pow(c[2], float(11)) / float(11);
153			scale[2] *= -1.0;
154
155			result[2] = sign[2] * atan_c[2] / (2.0 * M_PI) + 0.5;
156		}
157		else
158		{
159			c[2] = abs(x[2] / y[2]);
160
161			// Taylors series expansion for atan
162			atan_c[2] += scale[2] * pow(c[2], float(1)) / float(1);
163			scale[2] *= -1.0;
164			atan_c[2] += scale[2] * pow(c[2], float(3)) / float(3);
165			scale[2] *= -1.0;
166			atan_c[2] += scale[2] * pow(c[2], float(5)) / float(5);
167			scale[2] *= -1.0;
168			atan_c[2] += scale[2] * pow(c[2], float(7)) / float(7);
169			scale[2] *= -1.0;
170			atan_c[2] += scale[2] * pow(c[2], float(9)) / float(9);
171			scale[2] *= -1.0;
172			atan_c[2] += scale[2] * pow(c[2], float(11)) / float(11);
173			scale[2] *= -1.0;
174
175			result[2] = sign[2] * (M_PI / 2.0 - atan_c[2]) / (2.0 * M_PI) + 0.5;
176		}
177
178		if(x[2] < 0.0)
179			if(y[2] < 0.0) result[2] -= 0.5;
180			else if(y[2] > 0.0) result[2] += 0.5;
181	}
182
183	color = result;
184	gl_Position = gtf_ModelViewProjectionMatrix * gtf_Vertex;
185}
186