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