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 @@
-
+
@@ -209,7 +209,7 @@
-
+
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;
}