summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Berry <[email protected]>2011-07-27 15:53:31 -0700
committerPaul Berry <[email protected]>2011-08-01 14:37:38 -0700
commitb1b4ea0b3679db0b8fddaa9663a10d4712bba3b7 (patch)
tree37b2c030f632c42ec7e6d2dfdd00ba19122bf99a /src
parentd4c80f5f85c749df3fc091ff07b60ef4989fa6d9 (diff)
glsl: improve the accuracy of the atan(x,y) builtin function.
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.
Diffstat (limited to 'src')
-rw-r--r--src/glsl/builtins/ir/atan4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/glsl/builtins/ir/atan b/src/glsl/builtins/ir/atan
index cfecc1f1749..7b5ea13c6ba 100644
--- a/src/glsl/builtins/ir/atan
+++ b/src/glsl/builtins/ir/atan
@@ -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)) )