From f71e404c9a4eab63dbb9e4de65614d8a78d03100 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mika=20Isoj=C3=A4rvi?= Date: Fri, 25 Mar 2016 10:04:08 -0700 Subject: [PATCH] Allow alternative form for refract(). Bug: 27266906 Change-Id: Ib24c8d065d922a987feb0271f397d83b837ae936 --- modules/glshared/glsBuiltinPrecisionTests.cpp | 50 +++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/modules/glshared/glsBuiltinPrecisionTests.cpp b/modules/glshared/glsBuiltinPrecisionTests.cpp index d32a373..fee0c53 100644 --- a/modules/glshared/glsBuiltinPrecisionTests.cpp +++ b/modules/glshared/glsBuiltinPrecisionTests.cpp @@ -3127,6 +3127,49 @@ protected: } }; +template +struct ApplyRefract +{ + static ExprP apply (ExpandContext& ctx, + const ExprP& i, + const ExprP& n, + const ExprP& eta) + { + const ExprP dotNI = bindExpression("dotNI", ctx, dot(n, i)); + const ExprP k = bindExpression("k", ctx, constant(1.0f) - eta * eta * + (constant(1.0f) - dotNI * dotNI)); + + return cond(k < constant(0.0f), + genXType(constant(0.0f)), + i * eta - n * (eta * dotNI + sqrt(k))); + }; +}; + +template +struct ApplyRefract<1, Ret, Arg0, Arg1> +{ + static ExprP apply (ExpandContext& ctx, + const ExprP& i, + const ExprP& n, + const ExprP& eta) + { + const ExprP dotNI = bindExpression("dotNI", ctx, dot(n, i)); + const ExprP k1 = bindExpression("k1", ctx, constant(1.0f) - eta * eta * + (constant(1.0f) - dotNI * dotNI)); + + const ExprP k2 = bindExpression("k2", ctx, + (((dotNI * (-dotNI)) + constant(1.0f)) * eta) + * (-eta) + constant(1.0f)); + + return alternatives(cond(k1 < constant(0.0f), + genXType(constant(0.0f)), + i * eta - n * (eta * dotNI + sqrt(k1))), + cond(k2 < constant(0.0f), + genXType(constant(0.0f)), + i * eta - n * (eta * dotNI + sqrt(k2)))); + }; +}; + template class Refract : public DerivedFunc< Signature::Container, @@ -3151,13 +3194,8 @@ protected: const ExprP& i = args.a; const ExprP& n = args.b; const ExprP& eta = args.c; - const ExprP dotNI = bindExpression("dotNI", ctx, dot(n, i)); - const ExprP k = bindExpression("k", ctx, constant(1.0f) - eta * eta * - (constant(1.0f) - dotNI * dotNI)); - return cond(k < constant(0.0f), - genXType(constant(0.0f)), - i * eta - n * (eta * dotNI + sqrt(k))); + return ApplyRefract::apply(ctx, i, n, eta); } }; -- 2.7.4