diff --git a/glm/core/func_geometric.inl b/glm/core/func_geometric.inl index 494c875f..8d479210 100644 --- a/glm/core/func_geometric.inl +++ b/glm/core/func_geometric.inl @@ -283,6 +283,25 @@ namespace glm } // refract + template + GLM_FUNC_QUALIFIER genType refract + ( + genType const & I, + genType const & N, + genType const & eta + ) + { + //It could be a vector + //GLM_STATIC_ASSERT(detail::type::is_float); + + genType dotValue = dot(N, I); + genType k = genType(1) - eta * eta * (genType(1) - dotValue * dotValue); + if(k < genType(0)) + return genType(0); + else + return eta * I - (eta * dotValue + sqrt(k)) * N; + } + template GLM_FUNC_QUALIFIER genType refract ( diff --git a/test/core/core_func_geometric.cpp b/test/core/core_func_geometric.cpp index 05dbbade..7ef85fc4 100644 --- a/test/core/core_func_geometric.cpp +++ b/test/core/core_func_geometric.cpp @@ -34,17 +34,24 @@ int test_refract() { int Error = 0; + { + float A(1.0f); + float B(1.0f); + float C = glm::refract(A, B, 0.5f); + Error += C == 1.0f ? 0 : 1; + } + { glm::vec2 A(1.0f, 0.0f); glm::vec2 B(0.0f, 1.0f); - glm::vec2 C = glm::reflect(A, B); + glm::vec2 C = glm::refract(A, B, 0.5f); Error += C == glm::vec2(-1.0, 0.0) ? 0 : 1; } { glm::dvec2 A(1.0f, 0.0f); glm::dvec2 B(0.0f, 1.0f); - glm::dvec2 C = glm::reflect(A, B); + glm::dvec2 C = glm::refract(A, B, 0.5); Error += C == glm::dvec2(-1.0, 0.0) ? 0 : 1; }