builtins: Add atan().
diff --git a/builtin_function.cpp b/builtin_function.cpp
index f9fdd485..1d847a6 100644
--- a/builtin_function.cpp
+++ b/builtin_function.cpp
@@ -199,6 +199,163 @@
    "))\n"
 };
 
+static const char *builtins_110_atan = {
+   "((function atan\n"
+   "   (signature float\n"
+   "     (parameters\n"
+   "       (declare (in) float x))\n"
+   "     ((return (call asin ((expression float *\n"
+   "			   (var_ref x)\n"
+   "			   (expression float rsq\n"
+   "			    (expression float +\n"
+   "			     (expression float *\n"
+   "			      (var_ref x)\n"
+   "			      (var_ref x))\n"
+   "			     (constant float (1.0))))))))))\n"
+   "\n"
+   "   (signature vec2\n"
+   "     (parameters\n"
+   "       (declare (in) vec2 y_over_x))\n"
+   "     ((return (call asin ((expression vec2 *\n"
+   "			   (var_ref y_over_x)\n"
+   "			   (expression vec2 rsq\n"
+   "			    (expression vec2 +\n"
+   "			     (expression vec2 *\n"
+   "			      (var_ref y_over_x)\n"
+   "			      (var_ref y_over_x))\n"
+   "			     (constant float (1.0))))))))))\n"
+   "\n"
+   "   (signature vec3\n"
+   "     (parameters\n"
+   "       (declare (in) vec3 y_over_x))\n"
+   "     ((return (call asin ((expression vec3 *\n"
+   "			   (var_ref y_over_x)\n"
+   "			   (expression vec3 rsq\n"
+   "			    (expression vec3 +\n"
+   "			     (expression vec3 *\n"
+   "			      (var_ref y_over_x)\n"
+   "			      (var_ref y_over_x))\n"
+   "			     (constant float (1.0))))))))))\n"
+   "\n"
+   "   (signature vec4\n"
+   "     (parameters\n"
+   "       (declare (in) vec4 y_over_x))\n"
+   "     ((return (call asin ((expression vec4 *\n"
+   "			   (var_ref y_over_x)\n"
+   "			   (expression vec4 rsq\n"
+   "			    (expression vec4 +\n"
+   "			     (expression vec4 *\n"
+   "			      (var_ref y_over_x)\n"
+   "			      (var_ref y_over_x))\n"
+   "			     (constant float (1.0))))))))))\n"
+   "\n"
+   "   (signature float\n"
+   "     (parameters\n"
+   "       (declare (in) float y)\n"
+   "       (declare (in) float x))\n"
+   "     ((declare () float r)\n"
+   "      (if (expression bool >\n"
+   "	   (expression float abs (var_ref x))\n"
+   "	   (constant float (.0001)))\n"
+   "       ((assign (constant bool (1))\n"
+   "	 (var_ref r) (call atan ((expression float /\n"
+   "				  (var_ref y)\n"
+   "				  (var_ref x)))))\n"
+   "	(if (expression bool <\n"
+   "	     (var_ref x)\n"
+   "	     (constant float (0.0)))\n"
+   "	 ((assign (constant bool (1))\n"
+   "	   (var_ref r)\n"
+   "	   (expression float +\n"
+   "	    (var_ref r)\n"
+   "	    (expression float *\n"
+   "	     (expression int sign (var_ref y))\n"
+   "	     (constant float (3.1415926))))))\n"
+   "	 ()))\n"
+   "       ())\n"
+   "      (return (var_ref r))))\n"
+   "\n"
+   "   (signature vec2\n"
+   "     (parameters\n"
+   "       (declare (in) vec2 y)\n"
+   "       (declare (in) vec2 x))\n"
+   "     ((declare () vec2 r)\n"
+   "      (if (expression bool >\n"
+   "	   (expression vec2 abs (var_ref x))\n"
+   "	   (constant float (.0001)))\n"
+   "       ((assign (constant bool (1))\n"
+   "	 (var_ref r) (call atan ((expression vec2 /\n"
+   "				  (var_ref y)\n"
+   "				  (var_ref x)))))\n"
+   "	(if (expression bool <\n"
+   "	     (var_ref x)\n"
+   "	     (constant float (0.0)))\n"
+   "	 ((assign (constant bool (1))\n"
+   "	   (var_ref r)\n"
+   "	   (expression vec2 +\n"
+   "	    (var_ref r)\n"
+   "	    (expression vec2 *\n"
+   "	     (expression int sign (var_ref y))\n"
+   "	     (constant float (3.1415926))))))\n"
+   "	 ()))\n"
+   "       ())\n"
+   "      (return (var_ref r))))\n"
+   "\n"
+   "   (signature vec3\n"
+   "     (parameters\n"
+   "       (declare (in) vec3 y)\n"
+   "       (declare (in) vec3 x))\n"
+   "     ((declare () vec3 r)\n"
+   "      (if (expression bool >\n"
+   "	   (expression vec3 abs (var_ref x))\n"
+   "	   (constant float (.0001)))\n"
+   "       ((assign (constant bool (1))\n"
+   "	 (var_ref r) (call atan ((expression vec3 /\n"
+   "				  (var_ref y)\n"
+   "				  (var_ref x)))))\n"
+   "	(if (expression bool <\n"
+   "	     (var_ref x)\n"
+   "	     (constant float (0.0)))\n"
+   "	 ((assign (constant bool (1))\n"
+   "	   (var_ref r)\n"
+   "	   (expression vec3 +\n"
+   "	    (var_ref r)\n"
+   "	    (expression vec3 *\n"
+   "	     (expression int sign (var_ref y))\n"
+   "	     (constant float (3.1415926))))))\n"
+   "	 ()))\n"
+   "       ())\n"
+   "      (return (var_ref r))))\n"
+   "\n"
+   "   (signature vec4\n"
+   "     (parameters\n"
+   "       (declare (in) vec4 y)\n"
+   "       (declare (in) vec4 x))\n"
+   "     ((declare () vec4 r)\n"
+   "      (if (expression bool >\n"
+   "	   (expression vec4 abs (var_ref x))\n"
+   "	   (constant float (.0001)))\n"
+   "       ((assign (constant bool (1))\n"
+   "	 (var_ref r) (call atan ((expression vec4 /\n"
+   "				  (var_ref y)\n"
+   "				  (var_ref x)))))\n"
+   "	(if (expression bool <\n"
+   "	     (var_ref x)\n"
+   "	     (constant float (0.0)))\n"
+   "	 ((assign (constant bool (1))\n"
+   "	   (var_ref r)\n"
+   "	   (expression vec4 +\n"
+   "	    (var_ref r)\n"
+   "	    (expression vec4 *\n"
+   "	     (expression int sign (var_ref y))\n"
+   "	     (constant float (3.1415926))))))\n"
+   "	 ()))\n"
+   "       ())\n"
+   "      (return (var_ref r))))\n"
+   "\n"
+   "))\n"
+};
+
 static const char *builtins_110_ceil = {
    "((function ceil\n"
    "   (signature float\n"
@@ -1563,6 +1720,7 @@
    builtins_110_all,
    builtins_110_any,
    builtins_110_asin,
+   builtins_110_atan,
    builtins_110_ceil,
    builtins_110_clamp,
    builtins_110_cos,