glsl: improve the accuracy of the atan(x,y) builtin function.
authorPaul Berry <stereotype441@gmail.com>
Wed, 27 Jul 2011 22:53:31 +0000 (15:53 -0700)
committerPaul Berry <stereotype441@gmail.com>
Mon, 1 Aug 2011 21:37:38 +0000 (14:37 -0700)
The previous formula for atan(x,y) returned a value of +/- pi whenever
|x|<0.0001, and used a formula based on atan(y/x) otherwise.  This
broke in cases where both x and y were small (e.g. atan(1e-5, 1e-5)).

This patch modifies the formula so that it returns a value of +/- pi
whenever |x|<1e-8*|y|, and uses the formula based on atan(y/x)
otherwise.

src/glsl/builtins/ir/atan

index cfecc1f1749717711ea50089fba8f0794df7085d..7b5ea13c6ba6da4c69b5c9bd766c123ab52d62a5 100644 (file)
@@ -54,7 +54,9 @@
     )
     (
       (declare () float r)
-      (if (expression bool > (expression float abs (var_ref x)) (constant float (0.000100))) (
+      (if (expression bool >
+           (expression float abs (var_ref x))
+           (expression float * (constant float (1.0e-8)) (expression float abs (var_ref y)))) (
         (assign (x) (var_ref r) (call atan ((expression float / (var_ref y) (var_ref x)))))
         (if (expression bool < (var_ref x) (constant float (0.000000)) ) (
           (if (expression bool >= (var_ref y) (constant float (0.000000)) )