Implement 'refract' builtin.

This commit is contained in:
Kenneth Graunke
2010-06-09 14:30:52 -07:00
parent 3ffedf1249
commit cbd881da3f
2 changed files with 208 additions and 0 deletions

View 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,

102
builtins/110/refract Normal file
View File

@@ -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))))))))
))