From f4f7a71964f3fd4a689db4fd5a1a1f9350bad71c Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Tue, 28 May 2013 03:47:26 +0200 Subject: [PATCH 1/2] Back ported resolution for issue #71 for znear == 0 bug into branch 0.9.4 --- glm/gtc/matrix_transform.inl | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/glm/gtc/matrix_transform.inl b/glm/gtc/matrix_transform.inl index 2b0bb2a1..6f20b4cd 100644 --- a/glm/gtc/matrix_transform.inl +++ b/glm/gtc/matrix_transform.inl @@ -236,21 +236,19 @@ namespace glm valType const & zFar ) { + assert(aspect != valType(0)); + assert(zFar != zNear); + #ifdef GLM_FORCE_RADIANS valType const rad = fovy; #else valType const rad = glm::radians(fovy); #endif - - valType range = tan(rad / valType(2)) * zNear; - valType left = -range * aspect; - valType right = range * aspect; - valType bottom = -range; - valType top = range; + valType tanHalfFovy = tan(rad / valType(2)); detail::tmat4x4 Result(valType(0)); - Result[0][0] = (valType(2) * zNear) / (right - left); - Result[1][1] = (valType(2) * zNear) / (top - bottom); + Result[0][0] = valType(1) / (aspect * tanHalfFovy); + Result[1][1] = valType(1) / (tanHalfFovy); Result[2][2] = - (zFar + zNear) / (zFar - zNear); Result[2][3] = - valType(1); Result[3][2] = - (valType(2) * zFar * zNear) / (zFar - zNear); From bbf9989334690e7fe69cdfa970a002ac7ff62dc0 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Tue, 28 May 2013 03:48:41 +0200 Subject: [PATCH 2/2] Fixed test crash due to the normalization of a nan vector --- readme.txt | 1 + test/gtx/gtx_simd_mat4.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/readme.txt b/readme.txt index aabb7f7e..15978bfc 100644 --- a/readme.txt +++ b/readme.txt @@ -47,6 +47,7 @@ GLM 0.9.4.4: 2013-05-29 - Fixed CUDA warnings #86 - Fixed GLM natvis for VC11 #82 - Fixed GLM_GTX_multiple with negative values #79 +- Fixed glm::perspective when zNear is zero #71 ================================================================================ GLM 0.9.4.3: 2013-03-20 diff --git a/test/gtx/gtx_simd_mat4.cpp b/test/gtx/gtx_simd_mat4.cpp index 3634c8c0..ed9b5af9 100644 --- a/test/gtx/gtx_simd_mat4.cpp +++ b/test/gtx/gtx_simd_mat4.cpp @@ -203,21 +203,21 @@ int test_compute_gtx() for(std::size_t k = 0; k < Output.size(); ++k) { - float i = float(k) / 1000.f; + float i = float(k) / 1000.f + 0.001f; glm::vec3 A = glm::normalize(glm::vec3(i)); - glm::vec3 B = glm::cross(A, glm::vec3(0, 0, 1)); + glm::vec3 B = glm::cross(A, glm::normalize(glm::vec3(1, 1, 2))); glm::mat4 C = glm::rotate(glm::mat4(1.0f), i, B); glm::mat4 D = glm::scale(C, glm::vec3(0.8f, 1.0f, 1.2f)); glm::mat4 E = glm::translate(D, glm::vec3(1.4f, 1.2f, 1.1f)); glm::mat4 F = glm::perspective(i, 1.5f, 0.1f, 1000.f); glm::mat4 G = glm::inverse(F * E); glm::vec3 H = glm::unProject(glm::vec3(i), G, F, E[3]); - glm::vec3 I = glm::project(H, G, F, E[3]); - glm::mat4 J = glm::lookAt(glm::normalize(B), H, I); + glm::vec3 I = glm::any(glm::isnan(glm::project(H, G, F, E[3]))) ? glm::vec3(2) : glm::vec3(1); + glm::mat4 J = glm::lookAt(glm::normalize(glm::max(B, glm::vec3(0.001f))), H, I); glm::mat4 K = glm::transpose(J); glm::quat L = glm::normalize(glm::quat_cast(K)); glm::vec4 M = L * glm::smoothstep(K[3], J[3], glm::vec4(i)); - glm::mat4 N = glm::mat4(glm::normalize(M), K[3], J[3], glm::vec4(i)); + glm::mat4 N = glm::mat4(glm::normalize(glm::max(M, glm::vec4(0.001f))), K[3], J[3], glm::vec4(i)); glm::mat4 O = N * glm::inverse(N); glm::vec4 P = O * glm::reflect(N[3], glm::vec4(A, 1.0f)); glm::vec4 Q = glm::vec4(glm::dot(M, P));