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