mesa: fix/improve the atan(y,x) function
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 17 Jul 2008 16:03:10 +0000 (10:03 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 17 Jul 2008 16:08:14 +0000 (10:08 -0600)
src/mesa/shader/slang/library/slang_common_builtin.gc

index b095a6434b6cb8be1ecc7a449a09496974ef61ba..3726335471fb93badc63ac363adbb1367fe82d97 100644 (file)
@@ -401,16 +401,17 @@ vec4 atan(const vec4 y_over_x)
 
 float atan(const float y, const float x)
 {
-    if (x == 0.0)
-       return 0.0;
-    float z = atan(y / x);
-    if (x < 0.0)
-    {
-        if (y < 0.0)
-            return z - 3.141593;
-        return z + 3.141593;
-    }
-    return z;
+   float r;
+   if (abs(x) > 1.0e-4) {
+      r = atan(y / x);
+      if (x < 0.0) {
+         r = r + sign(y) * 3.141593;
+      }
+   }
+   else {
+      r = sign(y) * 1.5707965;  // pi/2
+   }
+   return r;
 }
 
 vec2 atan(const vec2 u, const vec2 v)