diff --git a/doc/src/data.xml b/doc/src/data.xml index e076459b..e0d61a29 100644 --- a/doc/src/data.xml +++ b/doc/src/data.xml @@ -200,7 +200,7 @@ - + GLM 0.9.3.A (zip) @@ -209,7 +209,7 @@ GLM 0.9.3 Manual GLM 0.9.3 API - + This revision fixes two problems: First, it adds all matrix products for all possible combinations of none-squared matrices. Thanks to Grant James who has provide the code for that. diff --git a/glm/core/func_geometric.inl b/glm/core/func_geometric.inl index 438bef9d..8d479210 100644 --- a/glm/core/func_geometric.inl +++ b/glm/core/func_geometric.inl @@ -279,10 +279,29 @@ namespace glm genType const & N ) { - return I - N * dot(N, I) * float(2); + return I - N * dot(N, I) * genType(2); } // 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_common.cpp b/test/core/core_func_common.cpp index 9054632a..ee2be8ff 100644 --- a/test/core/core_func_common.cpp +++ b/test/core/core_func_common.cpp @@ -289,7 +289,7 @@ int test_roundEven() int main() { - int Error = 0; + int Error(0); Error += test_modf(); Error += test_floatBitsToInt(); diff --git a/test/core/core_func_geometric.cpp b/test/core/core_func_geometric.cpp index ebdb159b..7ef85fc4 100644 --- a/test/core/core_func_geometric.cpp +++ b/test/core/core_func_geometric.cpp @@ -2,17 +2,69 @@ // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) /////////////////////////////////////////////////////////////////////////////////////////////////// // Created : 2011-01-15 -// Updated : 2011-09-13 +// Updated : 2011-11-14 // Licence : This source is under MIT licence // File : test/gtx/func_geometric.cpp /////////////////////////////////////////////////////////////////////////////////////////////////// #include -int main() +int test_reflect() { - int Failed = 0; + int Error = 0; - return Failed; + { + glm::vec2 A(1.0f, 0.0f); + glm::vec2 B(0.0f, 1.0f); + glm::vec2 C = glm::reflect(A, B); + 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); + Error += C == glm::dvec2(-1.0, 0.0) ? 0 : 1; + } + + return Error; +} + +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::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::refract(A, B, 0.5); + Error += C == glm::dvec2(-1.0, 0.0) ? 0 : 1; + } + + return Error; +} + +int main() +{ + int Error(0); + + Error += test_reflect(); + Error += test_refract(); + + return Error; }