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 c = 4.0 * 2.0 * (gtf_Color.rgb - 0.5);
18	vec3 atan_c = vec3(0.0);
19	vec3 scale = vec3(1.0);
20	vec3 sign = vec3(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	if(c[2] < 0.0)
115	{
116		sign[2] = -1.0;
117		c[2] *= -1.0;
118	}
119
120	if(c[2] <= 1.0)
121	{
122		// Taylors series expansion for atan
123		atan_c[2] += scale[2] * pow(c[2], float(1)) / float(1);
124		scale[2] *= -1.0;
125		atan_c[2] += scale[2] * pow(c[2], float(3)) / float(3);
126		scale[2] *= -1.0;
127		atan_c[2] += scale[2] * pow(c[2], float(5)) / float(5);
128		scale[2] *= -1.0;
129		atan_c[2] += scale[2] * pow(c[2], float(7)) / float(7);
130		scale[2] *= -1.0;
131		atan_c[2] += scale[2] * pow(c[2], float(9)) / float(9);
132		scale[2] *= -1.0;
133		atan_c[2] += scale[2] * pow(c[2], float(11)) / float(11);
134		scale[2] *= -1.0;
135
136		result[2] = sign[2] * atan_c[2] / M_PI + 0.5;
137	}
138	else
139	{
140		c[2] = 1.0 / c[2];
141
142		// Taylors series expansion for atan
143		atan_c[2] += scale[2] * pow(c[2], float(1)) / float(1);
144		scale[2] *= -1.0;
145		atan_c[2] += scale[2] * pow(c[2], float(3)) / float(3);
146		scale[2] *= -1.0;
147		atan_c[2] += scale[2] * pow(c[2], float(5)) / float(5);
148		scale[2] *= -1.0;
149		atan_c[2] += scale[2] * pow(c[2], float(7)) / float(7);
150		scale[2] *= -1.0;
151		atan_c[2] += scale[2] * pow(c[2], float(9)) / float(9);
152		scale[2] *= -1.0;
153		atan_c[2] += scale[2] * pow(c[2], float(11)) / float(11);
154		scale[2] *= -1.0;
155
156		result[2] = sign[2] * (M_PI / 2.0 - atan_c[2]) / M_PI + 0.5;
157	}
158
159	color = result;
160	gl_Position = gtf_ModelViewProjectionMatrix * gtf_Vertex;
161}
162