Implement 'refract' builtin.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 9 Jun 2010 21:30:52 +0000 (14:30 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 9 Jun 2010 21:44:39 +0000 (14:44 -0700)
builtin_function.cpp
builtins/110/refract [new file with mode: 0644]

index c75805c..377fd50 100644 (file)
@@ -1718,6 +1718,111 @@ static const char *builtins_110_reflect = {
    "))\n"
 };
 
+static const char *builtins_110_refract = {
+   "((function refract\n"
+   "   (signature float\n"
+   "     (parameters\n"
+   "       (declare (in) float i)\n"
+   "       (declare (in) float n)\n"
+   "       (declare (in) float eta))\n"
+   "     ((declare () float k)\n"
+   "      (assign (constant bool (1)) (var_ref k)\n"
+   "              (expression float - (constant float (1.0))\n"
+   "           (expression float * (var_ref eta)\n"
+   "             (expression float * (var_ref eta)\n"
+   "               (expression float - (constant float (1.0))\n"
+   "                 (expression float * \n"
+   "                   (expression float dot (var_ref n) (var_ref i))\n"
+   "                   (expression float dot (var_ref n) (var_ref i))))))))\n"
+   "      (if (expression bool < (var_ref k) (constant float (0.0)))\n"
+   "          ((return (constant float (0.0))))\n"
+   "     ((return (expression float -\n"
+   "                (expression float * (var_ref eta) (var_ref i))\n"
+   "                (expression float *\n"
+   "                  (expression float +\n"
+   "                    (expression float * (var_ref eta)\n"
+   "                      (expression float dot (var_ref n) (var_ref i)))\n"
+   "                    (expression float sqrt (var_ref k)))\n"
+   "                  (var_ref n))))))))\n"
+   "\n"
+   "   (signature vec2\n"
+   "     (parameters\n"
+   "       (declare (in) vec2 i)\n"
+   "       (declare (in) vec2 n)\n"
+   "       (declare (in) float eta))\n"
+   "     ((declare () float k)\n"
+   "      (assign (constant bool (1)) (var_ref k)\n"
+   "              (expression float - (constant float (1.0))\n"
+   "           (expression float * (var_ref eta)\n"
+   "             (expression float * (var_ref eta)\n"
+   "               (expression float - (constant float (1.0))\n"
+   "                 (expression float * \n"
+   "                   (expression float dot (var_ref n) (var_ref i))\n"
+   "                   (expression float dot (var_ref n) (var_ref i))))))))\n"
+   "      (if (expression bool < (var_ref k) (constant float (0.0)))\n"
+   "          ((return (constant vec2 (0.0 0.0))))\n"
+   "     ((return (expression vec2 -\n"
+   "                (expression vec2 * (var_ref eta) (var_ref i))\n"
+   "                (expression vec2 *\n"
+   "                  (expression float +\n"
+   "                    (expression float * (var_ref eta)\n"
+   "                      (expression float dot (var_ref n) (var_ref i)))\n"
+   "                    (expression float sqrt (var_ref k)))\n"
+   "                  (var_ref n))))))))\n"
+   "\n"
+   "   (signature vec3\n"
+   "     (parameters\n"
+   "       (declare (in) vec3 i)\n"
+   "       (declare (in) vec3 n)\n"
+   "       (declare (in) float eta))\n"
+   "     ((declare () float k)\n"
+   "      (assign (constant bool (1)) (var_ref k)\n"
+   "              (expression float - (constant float (1.0))\n"
+   "           (expression float * (var_ref eta)\n"
+   "             (expression float * (var_ref eta)\n"
+   "               (expression float - (constant float (1.0))\n"
+   "                 (expression float * \n"
+   "                   (expression float dot (var_ref n) (var_ref i))\n"
+   "                   (expression float dot (var_ref n) (var_ref i))))))))\n"
+   "      (if (expression bool < (var_ref k) (constant float (0.0)))\n"
+   "          ((return (constant vec3 (0.0 0.0))))\n"
+   "     ((return (expression vec3 -\n"
+   "                (expression vec3 * (var_ref eta) (var_ref i))\n"
+   "                (expression vec3 *\n"
+   "                  (expression float +\n"
+   "                    (expression float * (var_ref eta)\n"
+   "                      (expression float dot (var_ref n) (var_ref i)))\n"
+   "                    (expression float sqrt (var_ref k)))\n"
+   "                  (var_ref n))))))))\n"
+   "\n"
+   "   (signature vec4\n"
+   "     (parameters\n"
+   "       (declare (in) vec4 i)\n"
+   "       (declare (in) vec4 n)\n"
+   "       (declare (in) float eta))\n"
+   "     ((declare () float k)\n"
+   "      (assign (constant bool (1)) (var_ref k)\n"
+   "              (expression float - (constant float (1.0))\n"
+   "           (expression float * (var_ref eta)\n"
+   "             (expression float * (var_ref eta)\n"
+   "               (expression float - (constant float (1.0))\n"
+   "                 (expression float * \n"
+   "                   (expression float dot (var_ref n) (var_ref i))\n"
+   "                   (expression float dot (var_ref n) (var_ref i))))))))\n"
+   "      (if (expression bool < (var_ref k) (constant float (0.0)))\n"
+   "          ((return (constant vec4 (0.0 0.0))))\n"
+   "     ((return (expression vec4 -\n"
+   "                (expression vec4 * (var_ref eta) (var_ref i))\n"
+   "                (expression vec4 *\n"
+   "                  (expression float +\n"
+   "                    (expression float * (var_ref eta)\n"
+   "                      (expression float dot (var_ref n) (var_ref i)))\n"
+   "                    (expression float sqrt (var_ref k)))\n"
+   "                  (var_ref n))))))))\n"
+   "\n"
+   "))\n"
+};
+
 static const char *builtins_110_sign = {
    "((function sign\n"
    "   (signature float\n"
@@ -2379,6 +2484,7 @@ static const char *functions_for_110 [] = {
    builtins_110_pow,
    builtins_110_radians,
    builtins_110_reflect,
+   builtins_110_refract,
    builtins_110_sign,
    builtins_110_sin,
    builtins_110_smoothstep,
diff --git a/builtins/110/refract b/builtins/110/refract
new file mode 100644 (file)
index 0000000..e9b1475
--- /dev/null
@@ -0,0 +1,102 @@
+((function refract
+   (signature float
+     (parameters
+       (declare (in) float i)
+       (declare (in) float n)
+       (declare (in) float eta))
+     ((declare () float k)
+      (assign (constant bool (1)) (var_ref k)
+              (expression float - (constant float (1.0))
+               (expression float * (var_ref eta)
+                 (expression float * (var_ref eta)
+                   (expression float - (constant float (1.0))
+                     (expression float * 
+                       (expression float dot (var_ref n) (var_ref i))
+                       (expression float dot (var_ref n) (var_ref i))))))))
+      (if (expression bool < (var_ref k) (constant float (0.0)))
+          ((return (constant float (0.0))))
+         ((return (expression float -
+                    (expression float * (var_ref eta) (var_ref i))
+                    (expression float *
+                      (expression float +
+                        (expression float * (var_ref eta)
+                          (expression float dot (var_ref n) (var_ref i)))
+                        (expression float sqrt (var_ref k)))
+                      (var_ref n))))))))
+
+   (signature vec2
+     (parameters
+       (declare (in) vec2 i)
+       (declare (in) vec2 n)
+       (declare (in) float eta))
+     ((declare () float k)
+      (assign (constant bool (1)) (var_ref k)
+              (expression float - (constant float (1.0))
+               (expression float * (var_ref eta)
+                 (expression float * (var_ref eta)
+                   (expression float - (constant float (1.0))
+                     (expression float * 
+                       (expression float dot (var_ref n) (var_ref i))
+                       (expression float dot (var_ref n) (var_ref i))))))))
+      (if (expression bool < (var_ref k) (constant float (0.0)))
+          ((return (constant vec2 (0.0 0.0))))
+         ((return (expression vec2 -
+                    (expression vec2 * (var_ref eta) (var_ref i))
+                    (expression vec2 *
+                      (expression float +
+                        (expression float * (var_ref eta)
+                          (expression float dot (var_ref n) (var_ref i)))
+                        (expression float sqrt (var_ref k)))
+                      (var_ref n))))))))
+
+   (signature vec3
+     (parameters
+       (declare (in) vec3 i)
+       (declare (in) vec3 n)
+       (declare (in) float eta))
+     ((declare () float k)
+      (assign (constant bool (1)) (var_ref k)
+              (expression float - (constant float (1.0))
+               (expression float * (var_ref eta)
+                 (expression float * (var_ref eta)
+                   (expression float - (constant float (1.0))
+                     (expression float * 
+                       (expression float dot (var_ref n) (var_ref i))
+                       (expression float dot (var_ref n) (var_ref i))))))))
+      (if (expression bool < (var_ref k) (constant float (0.0)))
+          ((return (constant vec3 (0.0 0.0))))
+         ((return (expression vec3 -
+                    (expression vec3 * (var_ref eta) (var_ref i))
+                    (expression vec3 *
+                      (expression float +
+                        (expression float * (var_ref eta)
+                          (expression float dot (var_ref n) (var_ref i)))
+                        (expression float sqrt (var_ref k)))
+                      (var_ref n))))))))
+
+   (signature vec4
+     (parameters
+       (declare (in) vec4 i)
+       (declare (in) vec4 n)
+       (declare (in) float eta))
+     ((declare () float k)
+      (assign (constant bool (1)) (var_ref k)
+              (expression float - (constant float (1.0))
+               (expression float * (var_ref eta)
+                 (expression float * (var_ref eta)
+                   (expression float - (constant float (1.0))
+                     (expression float * 
+                       (expression float dot (var_ref n) (var_ref i))
+                       (expression float dot (var_ref n) (var_ref i))))))))
+      (if (expression bool < (var_ref k) (constant float (0.0)))
+          ((return (constant vec4 (0.0 0.0))))
+         ((return (expression vec4 -
+                    (expression vec4 * (var_ref eta) (var_ref i))
+                    (expression vec4 *
+                      (expression float +
+                        (expression float * (var_ref eta)
+                          (expression float dot (var_ref n) (var_ref i)))
+                        (expression float sqrt (var_ref k)))
+                      (var_ref n))))))))
+
+))