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 c = 4.0 * 2.0 * (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
24	if(c[0] < 0.0)
25	{
26		sign[0] = -1.0;
27		c[0] *= -1.0;
28	}
29
30	if(c[0] <= 1.0)
31	{
32		// Taylors series expansion for atan
33		atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
34		scale[0] *= -1.0;
35		atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
36		scale[0] *= -1.0;
37		atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
38		scale[0] *= -1.0;
39		atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
40		scale[0] *= -1.0;
41		atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
42		scale[0] *= -1.0;
43		atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
44		scale[0] *= -1.0;
45
46		result[0] = sign[0] * atan_c[0] / M_PI + 0.5;
47	}
48	else
49	{
50		c[0] = 1.0 / c[0];
51
52		// Taylors series expansion for atan
53		atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
54		scale[0] *= -1.0;
55		atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
56		scale[0] *= -1.0;
57		atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
58		scale[0] *= -1.0;
59		atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
60		scale[0] *= -1.0;
61		atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
62		scale[0] *= -1.0;
63		atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
64		scale[0] *= -1.0;
65
66		result[0] = sign[0] * (M_PI / 2.0 - atan_c[0]) / M_PI + 0.5;
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
115	if(c[2] < 0.0)
116	{
117		sign[2] = -1.0;
118		c[2] *= -1.0;
119	}
120
121	if(c[2] <= 1.0)
122	{
123		// Taylors series expansion for atan
124		atan_c[2] += scale[2] * pow(c[2], float(1)) / float(1);
125		scale[2] *= -1.0;
126		atan_c[2] += scale[2] * pow(c[2], float(3)) / float(3);
127		scale[2] *= -1.0;
128		atan_c[2] += scale[2] * pow(c[2], float(5)) / float(5);
129		scale[2] *= -1.0;
130		atan_c[2] += scale[2] * pow(c[2], float(7)) / float(7);
131		scale[2] *= -1.0;
132		atan_c[2] += scale[2] * pow(c[2], float(9)) / float(9);
133		scale[2] *= -1.0;
134		atan_c[2] += scale[2] * pow(c[2], float(11)) / float(11);
135		scale[2] *= -1.0;
136
137		result[2] = sign[2] * atan_c[2] / M_PI + 0.5;
138	}
139	else
140	{
141		c[2] = 1.0 / c[2];
142
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] * (M_PI / 2.0 - atan_c[2]) / M_PI + 0.5;
158	}
159
160	gl_FragColor = result;
161}
162