From ed5ffc43cb683cb14150d2cf381a92776a60ebc3 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Sun, 21 May 2017 19:30:38 +0300 Subject: [PATCH] optimize projection functions --- include/cglm-cam.h | 47 +++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/include/cglm-cam.h b/include/cglm-cam.h index 837049e..8750da1 100644 --- a/include/cglm-cam.h +++ b/include/cglm-cam.h @@ -30,21 +30,22 @@ glm_frustum(float left, float nearVal, float farVal, mat4 dest) { - float rl, tb, fn; + float rl, tb, fn, nv; glm__memzero(float, dest, sizeof(mat4)); - rl = 1.0f / (right - left); - tb = 1.0f / (top - bottom); - fn = 1.0f / (farVal - nearVal); + rl = 1.0f / (right - left); + tb = 1.0f / (top - bottom); + fn =-1.0f / (farVal - nearVal); + nv = 2.0f * nearVal; - dest[0][0] = 2.0f * nearVal * rl; - dest[1][1] = 2.0f * nearVal * tb; - dest[2][0] = (right + left) * rl; - dest[2][1] = (top + bottom) * tb; - dest[2][2] = -(farVal + nearVal) * fn; - dest[2][3] = -1.0f; - dest[3][2] = -2.0f * farVal * nearVal * fn; + dest[0][0] = nv * rl; + dest[1][1] = nv * tb; + dest[2][0] = (right + left) * rl; + dest[2][1] = (top + bottom) * tb; + dest[2][2] = (farVal + nearVal) * fn; + dest[2][3] =-1.0f; + dest[3][2] = farVal * nv * fn; } /*! @@ -71,16 +72,16 @@ glm_ortho(float left, glm__memzero(float, dest, sizeof(mat4)); - rl = 1.0f / (right - left); - tb = 1.0f / (top - bottom); - fn = 1.0f / (farVal - nearVal); + rl = 1.0f / (right - left); + tb = 1.0f / (top - bottom); + fn =-1.0f / (farVal - nearVal); dest[0][0] = 2.0f * rl; dest[1][1] = 2.0f * tb; - dest[2][2] =-2.0f * fn; - dest[3][0] =-(right + left) * rl; - dest[3][1] =-(top + bottom) * tb; - dest[3][2] =-(farVal + nearVal) * fn; + dest[2][2] = 2.0f * fn; + dest[3][0] =-(right + left) * rl; + dest[3][1] =-(top + bottom) * tb; + dest[3][2] = (farVal + nearVal) * fn; dest[3][3] = 1.0f; } @@ -102,7 +103,7 @@ glm_ortho_default(float aspect, -100.0f, 100.0f, dest); - return; + return; } glm_ortho(-1.0f, @@ -134,7 +135,7 @@ glm_ortho_default_s(float aspect, -size - 100.0f, size + 100.0f, dest); - return; + return; } glm_ortho(-size, @@ -166,14 +167,14 @@ glm_perspective(float fovy, glm__memzero(float, dest, sizeof(mat4)); - f = cosf(fovy * 0.5f) / sinf(fovy * 0.5f); + f = 1.0f / tanf(fovy * 0.5f); fn = 1.0f / (nearVal - farVal); dest[0][0] = f / aspect; dest[1][1] = f; dest[2][2] = (nearVal + farVal) * fn; dest[2][3] =-1.0f; - dest[3][2] = 2 * nearVal * farVal * fn; + dest[3][2] = 2.0f * nearVal * farVal * fn; } /*! @@ -206,7 +207,7 @@ CGLM_INLINE void glm_perspective_resize(float aspect, mat4 proj) { - if (proj[0][0] == 0) + if (proj[0][0] == 0.0f) return; proj[0][0] = proj[1][1] / aspect;