From c98340d9d2be5e405c4ff36a35b5aa63e5f03297 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Sat, 30 Dec 2017 12:18:32 +0300 Subject: [PATCH 1/8] exracting planes --- README.md | 1 + include/cglm/call.h | 1 + include/cglm/call/plane.h | 27 +++++++++++++++ include/cglm/cglm.h | 1 + include/cglm/plane.h | 70 +++++++++++++++++++++++++++++++++++++++ src/plane.c | 21 ++++++++++++ 6 files changed, 121 insertions(+) create mode 100644 include/cglm/call/plane.h create mode 100644 include/cglm/plane.h create mode 100644 src/plane.c diff --git a/README.md b/README.md index c90f6ea..3e6964a 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ https://github.com/g-truc/glm - euler angles / yaw-pitch-roll to matrix - extract euler angles - inline or pre-compiled function call +- extract view frustum planes
diff --git a/include/cglm/call.h b/include/cglm/call.h index 2b8025a..c306ab9 100644 --- a/include/cglm/call.h +++ b/include/cglm/call.h @@ -20,6 +20,7 @@ extern "C" { #include "call/cam.h" #include "call/quat.h" #include "call/euler.h" +#include "call/plane.h" #include "call/io.h" #ifdef __cplusplus diff --git a/include/cglm/call/plane.h b/include/cglm/call/plane.h new file mode 100644 index 0000000..18b090a --- /dev/null +++ b/include/cglm/call/plane.h @@ -0,0 +1,27 @@ +/* + * Copyright (c), Recep Aslantas. + * + * MIT License (MIT), http://opensource.org/licenses/MIT + * Full license can be found in the LICENSE file + */ + +#ifndef cglmc_plane_h +#define cglmc_plane_h +#ifdef __cplusplus +extern "C" { +#endif + +#include "../cglm.h" + +CGLM_EXPORT +void +glmc_plane_normalize(vec4 plane); + +CGLM_EXPORT +void +glmc_plane_extract(mat4 projView, vec4 dest[6]); + +#ifdef __cplusplus +} +#endif +#endif /* cglmc_plane_h */ diff --git a/include/cglm/cglm.h b/include/cglm/cglm.h index 1dabb70..24544d1 100644 --- a/include/cglm/cglm.h +++ b/include/cglm/cglm.h @@ -17,6 +17,7 @@ #include "cam.h" #include "quat.h" #include "euler.h" +#include "plane.h" #include "util.h" #include "io.h" diff --git a/include/cglm/plane.h b/include/cglm/plane.h new file mode 100644 index 0000000..d8cd050 --- /dev/null +++ b/include/cglm/plane.h @@ -0,0 +1,70 @@ +/* + * Copyright (c), Recep Aslantas. + * + * MIT License (MIT), http://opensource.org/licenses/MIT + * Full license can be found in the LICENSE file + */ + +#ifndef cglm_plane_h +#define cglm_plane_h + +#include "common.h" +#include "mat4.h" +#include "vec4.h" + +/* + Plane equation: Ax + By + Cz + D = 0; + + It stored in vec4 as [A, B, C, D]. (A, B, C) is normal and D is distance +*/ + +/* + Functions: + CGLM_INLINE void glm_plane_normalize(vec4 plane); + CGLM_INLINE void glm_plane_extract(mat4 projView, vec4 dest[6]); + */ + +/*! + * @brief normalizes a plane + * + * @param[in, out] plane pnale to normalize + */ +CGLM_INLINE +void +glm_plane_normalize(vec4 plane) { + glm_vec4_scale(plane, 1.0f / glm_vec_norm(plane), plane); +} + +/*! + * @brief extracts view frustum planes + * + * computing projView: glm_mat4_mul(proj, view, projView); + * + * exracted planes order: [left, right, bottom, top, near, far] + * + * @param[in] projView source + * @param[out] dest exracted view frustum planes (see brief) + */ +CGLM_INLINE +void +glm_plane_extract(mat4 projView, vec4 dest[6]) { + mat4 m; + + glm_mat4_transpose_to(projView, m); + + glm_vec4_add(m[3], m[0], dest[0]); + glm_vec4_sub(m[3], m[0], dest[1]); + glm_vec4_add(m[3], m[1], dest[2]); + glm_vec4_sub(m[3], m[1], dest[3]); + glm_vec4_add(m[3], m[2], dest[4]); + glm_vec4_sub(m[3], m[2], dest[5]); + + glm_plane_normalize(dest[0]); + glm_plane_normalize(dest[1]); + glm_plane_normalize(dest[2]); + glm_plane_normalize(dest[3]); + glm_plane_normalize(dest[4]); + glm_plane_normalize(dest[5]); +} + +#endif /* cglm_plane_h */ diff --git a/src/plane.c b/src/plane.c new file mode 100644 index 0000000..71e2587 --- /dev/null +++ b/src/plane.c @@ -0,0 +1,21 @@ +/* + * Copyright (c), Recep Aslantas. + * + * MIT License (MIT), http://opensource.org/licenses/MIT + * Full license can be found in the LICENSE file + */ + +#include "../include/cglm/cglm.h" +#include "../include/cglm/call.h" + +CGLM_EXPORT +void +glmc_plane_normalize(vec4 plane) { + glm_plane_normalize(plane); +} + +CGLM_EXPORT +void +glmc_plane_extract(mat4 projView, vec4 dest[6]) { + glm_plane_extract(projView, dest); +} From d14627ac524320effdef71417739667334f793cc Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Sat, 30 Dec 2017 13:14:09 +0300 Subject: [PATCH 2/8] vec: fix parameter types --- include/cglm/vec4-ext.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/cglm/vec4-ext.h b/include/cglm/vec4-ext.h index 6410e41..ca697af 100644 --- a/include/cglm/vec4-ext.h +++ b/include/cglm/vec4-ext.h @@ -17,7 +17,7 @@ CGLM_INLINE bool glm_vec4_eq_eps(vec4 v, float val); CGLM_INLINE bool glm_vec4_eq_all(vec4 v); CGLM_INLINE bool glm_vec4_eqv(vec4 v1, vec4 v2); - CGLM_INLINE bool glm_vec4_eqv_eps(vec3 v1, vec3 v2); + CGLM_INLINE bool glm_vec4_eqv_eps(vec4 v1, vec4 v2); CGLM_INLINE float glm_vec4_max(vec4 v); CGLM_INLINE float glm_vec4_min(vec4 v); */ @@ -133,7 +133,7 @@ glm_vec4_eqv(vec4 v1, vec4 v2) { */ CGLM_INLINE bool -glm_vec4_eqv_eps(vec3 v1, vec3 v2) { +glm_vec4_eqv_eps(vec4 v1, vec4 v2) { return fabsf(v1[0] - v2[0]) <= FLT_EPSILON && fabsf(v1[1] - v2[1]) <= FLT_EPSILON && fabsf(v1[2] - v2[2]) <= FLT_EPSILON From 99669a21a44a352247631beb276ee8a92d7006e1 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Sat, 30 Dec 2017 13:55:17 +0300 Subject: [PATCH 3/8] move extracting planes to camera header * since it related to view frustum / camera it should be in thie header or separate header called frustum.h * update LICENSE to add authors of algorithm --- LICENSE | 6 ++++++ include/cglm/call/cam.h | 4 ++++ include/cglm/call/plane.h | 4 ---- include/cglm/cam.h | 43 +++++++++++++++++++++++++++++++++++++++ include/cglm/plane.h | 34 +------------------------------ src/cam.c | 6 ++++++ src/plane.c | 6 ------ 7 files changed, 60 insertions(+), 43 deletions(-) diff --git a/LICENSE b/LICENSE index f22658b..2367e77 100644 --- a/LICENSE +++ b/LICENSE @@ -52,3 +52,9 @@ LICENSE: Computing Euler angles from a rotation matrix (euler.pdf) Gregory G. Slabaugh + +4. Extracting Planes +Fast Extraction of Viewing Frustum Planes from the World-View-Projection Matrix +Authors: + Gil Gribb (ggribb@ravensoft.com) + Klaus Hartmann (k_hartmann@osnabrueck.netsurf.de) diff --git a/include/cglm/call/cam.h b/include/cglm/call/cam.h index 03e066a..5b766a3 100644 --- a/include/cglm/call/cam.h +++ b/include/cglm/call/cam.h @@ -48,6 +48,10 @@ glmc_lookat(vec3 eye, vec3 up, mat4 dest); +CGLM_EXPORT +void +glmc_extract_planes(mat4 m, vec4 dest[6]); + #ifdef __cplusplus } #endif diff --git a/include/cglm/call/plane.h b/include/cglm/call/plane.h index 18b090a..f991121 100644 --- a/include/cglm/call/plane.h +++ b/include/cglm/call/plane.h @@ -17,10 +17,6 @@ CGLM_EXPORT void glmc_plane_normalize(vec4 plane); -CGLM_EXPORT -void -glmc_plane_extract(mat4 projView, vec4 dest[6]); - #ifdef __cplusplus } #endif diff --git a/include/cglm/cam.h b/include/cglm/cam.h index a78ba4b..1504637 100644 --- a/include/cglm/cam.h +++ b/include/cglm/cam.h @@ -50,12 +50,14 @@ float * __restrict farVal); CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float * __restrict farVal); CGLM_INLINE void glm_persp_decomp_near(mat4 proj, float *__restrict nearVal); + CGLM_INLINE void glm_extract_planes(mat4 m, vec4 dest[6]); */ #ifndef cglm_vcam_h #define cglm_vcam_h #include "common.h" +#include "plane.h" /*! * @brief set up perspective peprojection matrix @@ -422,4 +424,45 @@ void glm_persp_decomp_near(mat4 proj, float * __restrict nearVal) { *nearVal = proj[3][2] / (proj[2][2] - 1); } + + +/*! + * @brief extracts view frustum planes + * + * planes' space: + * 1- if m = proj: View Space + * 2- if m = projView: World Space + * 3- if m = MVP: Object Space + * + * You probably want to extract planes in world space so use projView as m + * Computing projView: + * glm_mat4_mul(proj, view, projView); + * + * Exracted planes order: [left, right, bottom, top, near, far] + * + * @param[in] m matrix (see brief) + * @param[out] dest exracted view frustum planes (see brief) + */ +CGLM_INLINE +void +glm_extract_planes(mat4 m, vec4 dest[6]) { + mat4 t; + + glm_mat4_transpose_to(m, t); + + glm_vec4_add(t[3], t[0], dest[0]); /* left */ + glm_vec4_sub(t[3], t[0], dest[1]); /* right */ + glm_vec4_add(t[3], t[1], dest[2]); /* bottom */ + glm_vec4_sub(t[3], t[1], dest[3]); /* top */ + glm_vec4_add(t[3], t[2], dest[4]); /* near */ + glm_vec4_sub(t[3], t[2], dest[5]); /* far */ + + glm_plane_normalize(dest[0]); + glm_plane_normalize(dest[1]); + glm_plane_normalize(dest[2]); + glm_plane_normalize(dest[3]); + glm_plane_normalize(dest[4]); + glm_plane_normalize(dest[5]); +} + #endif /* cglm_vcam_h */ diff --git a/include/cglm/plane.h b/include/cglm/plane.h index d8cd050..9faac9c 100644 --- a/include/cglm/plane.h +++ b/include/cglm/plane.h @@ -11,6 +11,7 @@ #include "common.h" #include "mat4.h" #include "vec4.h" +#include "vec3.h" /* Plane equation: Ax + By + Cz + D = 0; @@ -21,7 +22,6 @@ /* Functions: CGLM_INLINE void glm_plane_normalize(vec4 plane); - CGLM_INLINE void glm_plane_extract(mat4 projView, vec4 dest[6]); */ /*! @@ -35,36 +35,4 @@ glm_plane_normalize(vec4 plane) { glm_vec4_scale(plane, 1.0f / glm_vec_norm(plane), plane); } -/*! - * @brief extracts view frustum planes - * - * computing projView: glm_mat4_mul(proj, view, projView); - * - * exracted planes order: [left, right, bottom, top, near, far] - * - * @param[in] projView source - * @param[out] dest exracted view frustum planes (see brief) - */ -CGLM_INLINE -void -glm_plane_extract(mat4 projView, vec4 dest[6]) { - mat4 m; - - glm_mat4_transpose_to(projView, m); - - glm_vec4_add(m[3], m[0], dest[0]); - glm_vec4_sub(m[3], m[0], dest[1]); - glm_vec4_add(m[3], m[1], dest[2]); - glm_vec4_sub(m[3], m[1], dest[3]); - glm_vec4_add(m[3], m[2], dest[4]); - glm_vec4_sub(m[3], m[2], dest[5]); - - glm_plane_normalize(dest[0]); - glm_plane_normalize(dest[1]); - glm_plane_normalize(dest[2]); - glm_plane_normalize(dest[3]); - glm_plane_normalize(dest[4]); - glm_plane_normalize(dest[5]); -} - #endif /* cglm_plane_h */ diff --git a/src/cam.c b/src/cam.c index 0dcdc4b..1e36bfd 100644 --- a/src/cam.c +++ b/src/cam.c @@ -66,3 +66,9 @@ glmc_lookat(vec3 eye, mat4 dest) { glm_lookat(eye, center, up, dest); } + +CGLM_EXPORT +void +glmc_extract_planes(mat4 m, vec4 dest[6]) { + glm_extract_planes(m, dest); +} diff --git a/src/plane.c b/src/plane.c index 71e2587..7ee0c0f 100644 --- a/src/plane.c +++ b/src/plane.c @@ -13,9 +13,3 @@ void glmc_plane_normalize(vec4 plane) { glm_plane_normalize(plane); } - -CGLM_EXPORT -void -glmc_plane_extract(mat4 projView, vec4 dest[6]) { - glm_plane_extract(projView, dest); -} From 634e1170a3fa6b4e2e9dcbbcfa4cb467be06a848 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Sat, 30 Dec 2017 17:50:53 +0300 Subject: [PATCH 4/8] min and max util --- include/cglm/util.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/include/cglm/util.h b/include/cglm/util.h index d1b62a2..2d726a1 100644 --- a/include/cglm/util.h +++ b/include/cglm/util.h @@ -61,4 +61,20 @@ glm_pow2(float x) { return x * x; } +CGLM_INLINE +float +glm_min(float a, float b) { + if (a < b) + return a; + return b; +} + +CGLM_INLINE +float +glm_max(float a, float b) { + if (a < b) + return a; + return b; +} + #endif /* cglm_util_h */ From 400fc6cbeed50811c33d47da48e595a0785c93c1 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Sat, 30 Dec 2017 17:51:40 +0300 Subject: [PATCH 5/8] extracting view frustum corners --- include/cglm/cam.h | 47 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/include/cglm/cam.h b/include/cglm/cam.h index 1504637..8b65b17 100644 --- a/include/cglm/cam.h +++ b/include/cglm/cam.h @@ -425,18 +425,17 @@ glm_persp_decomp_near(mat4 proj, float * __restrict nearVal) { *nearVal = proj[3][2] / (proj[2][2] - 1); } - /*! * @brief extracts view frustum planes * * planes' space: * 1- if m = proj: View Space - * 2- if m = projView: World Space + * 2- if m = viewProj: World Space * 3- if m = MVP: Object Space * - * You probably want to extract planes in world space so use projView as m - * Computing projView: - * glm_mat4_mul(proj, view, projView); + * You probably want to extract planes in world space so use viewProj as m + * Computing viewProj: + * glm_mat4_mul(proj, view, viewProj); * * Exracted planes order: [left, right, bottom, top, near, far] * @@ -465,4 +464,42 @@ glm_extract_planes(mat4 m, vec4 dest[6]) { glm_plane_normalize(dest[5]); } +/*! + * @brief extracts view frustum corners using clip-space coordinates + * + * corners' space: + * 1- if m = invViewProj: World Space + * 2- if m = invMVP: Object Space + * + * You probably want to extract corners in world space so use invViewProj + * Computing invViewProj: + * glm_mat4_mul(proj, view, viewProj); + * ... + * glm_mat4_inv(viewProj, invViewProj); + * + * @param[in] invMat matrix (see brief) + * @param[out] dest exracted view frustum corners (see brief) + */ +CGLM_INLINE +void +glm_frustum_corners(mat4 invMat, vec4 dest[8]) { + glm_mat4_mulv(invMat, (vec4){-1.0f, -1.0f, -1.0f, 1.0f}, dest[0]); + glm_mat4_mulv(invMat, (vec4){-1.0f, 1.0f, -1.0f, 1.0f}, dest[1]); + glm_mat4_mulv(invMat, (vec4){ 1.0f, -1.0f, -1.0f, 1.0f}, dest[2]); + glm_mat4_mulv(invMat, (vec4){ 1.0f, 1.0f, -1.0f, 1.0f}, dest[3]); + glm_mat4_mulv(invMat, (vec4){-1.0f, -1.0f, 1.0f, 1.0f}, dest[4]); + glm_mat4_mulv(invMat, (vec4){-1.0f, 1.0f, 1.0f, 1.0f}, dest[5]); + glm_mat4_mulv(invMat, (vec4){ 1.0f, -1.0f, 1.0f, 1.0f}, dest[6]); + glm_mat4_mulv(invMat, (vec4){ 1.0f, 1.0f, 1.0f, 1.0f}, dest[7]); + + glm_vec4_scale(dest[0], 1.0f / dest[0][3], dest[0]); + glm_vec4_scale(dest[1], 1.0f / dest[1][3], dest[1]); + glm_vec4_scale(dest[2], 1.0f / dest[2][3], dest[2]); + glm_vec4_scale(dest[3], 1.0f / dest[3][3], dest[3]); + glm_vec4_scale(dest[4], 1.0f / dest[4][3], dest[4]); + glm_vec4_scale(dest[5], 1.0f / dest[5][3], dest[5]); + glm_vec4_scale(dest[6], 1.0f / dest[6][3], dest[6]); + glm_vec4_scale(dest[7], 1.0f / dest[7][3], dest[7]); +} + #endif /* cglm_vcam_h */ From 2d0a3ad82893baef32dfba82112cbcdbe66b9dbb Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Sat, 30 Dec 2017 18:05:11 +0300 Subject: [PATCH 6/8] use frustum namespace for frustum specific funcs --- include/cglm/call/cam.h | 6 +++++- include/cglm/cam.h | 5 +++-- src/cam.c | 10 ++++++++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/cglm/call/cam.h b/include/cglm/call/cam.h index 5b766a3..2a7d661 100644 --- a/include/cglm/call/cam.h +++ b/include/cglm/call/cam.h @@ -50,7 +50,11 @@ glmc_lookat(vec3 eye, CGLM_EXPORT void -glmc_extract_planes(mat4 m, vec4 dest[6]); +glmc_frustum_planes(mat4 m, vec4 dest[6]); + +CGLM_EXPORT +void +glmc_frustum_corners(mat4 invMat, vec4 dest[8]); #ifdef __cplusplus } diff --git a/include/cglm/cam.h b/include/cglm/cam.h index 8b65b17..41a2c4b 100644 --- a/include/cglm/cam.h +++ b/include/cglm/cam.h @@ -50,7 +50,8 @@ float * __restrict farVal); CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float * __restrict farVal); CGLM_INLINE void glm_persp_decomp_near(mat4 proj, float *__restrict nearVal); - CGLM_INLINE void glm_extract_planes(mat4 m, vec4 dest[6]); + CGLM_INLINE void glm_frustum_planes(mat4 m, vec4 dest[6]); + CGLM_INLINE void glm_frustum_corners(mat4 invMat, vec4 dest[8]); */ #ifndef cglm_vcam_h @@ -444,7 +445,7 @@ glm_persp_decomp_near(mat4 proj, float * __restrict nearVal) { */ CGLM_INLINE void -glm_extract_planes(mat4 m, vec4 dest[6]) { +glm_frustum_planes(mat4 m, vec4 dest[6]) { mat4 t; glm_mat4_transpose_to(m, t); diff --git a/src/cam.c b/src/cam.c index 1e36bfd..f588619 100644 --- a/src/cam.c +++ b/src/cam.c @@ -69,6 +69,12 @@ glmc_lookat(vec3 eye, CGLM_EXPORT void -glmc_extract_planes(mat4 m, vec4 dest[6]) { - glm_extract_planes(m, dest); +glmc_frustum_planes(mat4 m, vec4 dest[6]) { + glm_frustum_planes(m, dest); +} + +CGLM_EXPORT +void +glmc_frustum_corners(mat4 invMat, vec4 dest[8]) { + glm_frustum_corners(invMat, dest); } From eaf45e489d94d19678d56554d3fec6ed0ded1c31 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Sun, 31 Dec 2017 17:17:39 +0300 Subject: [PATCH 7/8] view frustum center --- include/cglm/call/cam.h | 4 ++++ include/cglm/cam.h | 23 +++++++++++++++++++++++ src/cam.c | 6 ++++++ 3 files changed, 33 insertions(+) diff --git a/include/cglm/call/cam.h b/include/cglm/call/cam.h index 2a7d661..7b2c409 100644 --- a/include/cglm/call/cam.h +++ b/include/cglm/call/cam.h @@ -56,6 +56,10 @@ CGLM_EXPORT void glmc_frustum_corners(mat4 invMat, vec4 dest[8]); +CGLM_EXPORT +void +glmc_frustum_center(vec4 corners[8], vec4 dest); + #ifdef __cplusplus } #endif diff --git a/include/cglm/cam.h b/include/cglm/cam.h index 41a2c4b..e8c4afb 100644 --- a/include/cglm/cam.h +++ b/include/cglm/cam.h @@ -503,4 +503,27 @@ glm_frustum_corners(mat4 invMat, vec4 dest[8]) { glm_vec4_scale(dest[7], 1.0f / dest[7][3], dest[7]); } +/*! + * @brief finds center of view frustum + * + * @param[in] corners view frustum corners + * @param[out] dest view frustum center + */ +CGLM_INLINE +void +glm_frustum_center(vec4 corners[8], vec4 dest) { + glm_vec4_broadcast(0.0f, dest); + + glm_vec4_add(corners[0], dest, dest); + glm_vec4_add(corners[1], dest, dest); + glm_vec4_add(corners[2], dest, dest); + glm_vec4_add(corners[3], dest, dest); + glm_vec4_add(corners[4], dest, dest); + glm_vec4_add(corners[5], dest, dest); + glm_vec4_add(corners[6], dest, dest); + glm_vec4_add(corners[7], dest, dest); + + glm_vec4_scale(dest, 0.125f, dest); +} + #endif /* cglm_vcam_h */ diff --git a/src/cam.c b/src/cam.c index f588619..602b1fc 100644 --- a/src/cam.c +++ b/src/cam.c @@ -78,3 +78,9 @@ void glmc_frustum_corners(mat4 invMat, vec4 dest[8]) { glm_frustum_corners(invMat, dest); } + +CGLM_EXPORT +void +glmc_frustum_center(vec4 corners[8], vec4 dest) { + glm_frustum_center(corners, dest); +} From 3e4f52b3af962a27b4b29a6b4d20a8c812112af6 Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Tue, 2 Jan 2018 10:16:46 +0300 Subject: [PATCH 8/8] optimize operations, fix max sign --- include/cglm/cam.h | 64 +++++++++++++++++++++++++++------------------ include/cglm/util.h | 2 +- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/include/cglm/cam.h b/include/cglm/cam.h index e8c4afb..5d39ef2 100644 --- a/include/cglm/cam.h +++ b/include/cglm/cam.h @@ -484,23 +484,34 @@ glm_frustum_planes(mat4 m, vec4 dest[6]) { CGLM_INLINE void glm_frustum_corners(mat4 invMat, vec4 dest[8]) { - glm_mat4_mulv(invMat, (vec4){-1.0f, -1.0f, -1.0f, 1.0f}, dest[0]); - glm_mat4_mulv(invMat, (vec4){-1.0f, 1.0f, -1.0f, 1.0f}, dest[1]); - glm_mat4_mulv(invMat, (vec4){ 1.0f, -1.0f, -1.0f, 1.0f}, dest[2]); - glm_mat4_mulv(invMat, (vec4){ 1.0f, 1.0f, -1.0f, 1.0f}, dest[3]); - glm_mat4_mulv(invMat, (vec4){-1.0f, -1.0f, 1.0f, 1.0f}, dest[4]); - glm_mat4_mulv(invMat, (vec4){-1.0f, 1.0f, 1.0f, 1.0f}, dest[5]); - glm_mat4_mulv(invMat, (vec4){ 1.0f, -1.0f, 1.0f, 1.0f}, dest[6]); - glm_mat4_mulv(invMat, (vec4){ 1.0f, 1.0f, 1.0f, 1.0f}, dest[7]); + vec4 c[8]; + vec4 ndcCorners[8] = { + {-1.0f, -1.0f, -1.0f, 1.0f}, + {-1.0f, 1.0f, -1.0f, 1.0f}, + { 1.0f, -1.0f, -1.0f, 1.0f}, + { 1.0f, 1.0f, -1.0f, 1.0f}, + {-1.0f, -1.0f, 1.0f, 1.0f}, + {-1.0f, 1.0f, 1.0f, 1.0f}, + { 1.0f, -1.0f, 1.0f, 1.0f}, + { 1.0f, 1.0f, 1.0f, 1.0f} + }; - glm_vec4_scale(dest[0], 1.0f / dest[0][3], dest[0]); - glm_vec4_scale(dest[1], 1.0f / dest[1][3], dest[1]); - glm_vec4_scale(dest[2], 1.0f / dest[2][3], dest[2]); - glm_vec4_scale(dest[3], 1.0f / dest[3][3], dest[3]); - glm_vec4_scale(dest[4], 1.0f / dest[4][3], dest[4]); - glm_vec4_scale(dest[5], 1.0f / dest[5][3], dest[5]); - glm_vec4_scale(dest[6], 1.0f / dest[6][3], dest[6]); - glm_vec4_scale(dest[7], 1.0f / dest[7][3], dest[7]); + glm_mat4_mulv(invMat, ndcCorners[0], c[0]); + glm_mat4_mulv(invMat, ndcCorners[1], c[1]); + glm_mat4_mulv(invMat, ndcCorners[2], c[2]); + glm_mat4_mulv(invMat, ndcCorners[3], c[3]); + glm_mat4_mulv(invMat, ndcCorners[4], c[4]); + glm_mat4_mulv(invMat, ndcCorners[5], c[5]); + glm_mat4_mulv(invMat, ndcCorners[6], c[6]); + glm_mat4_mulv(invMat, ndcCorners[7], c[7]); + + glm_vec4_scale(c[1], 1.0f / c[1][3], dest[1]); + glm_vec4_scale(c[2], 1.0f / c[2][3], dest[2]); + glm_vec4_scale(c[3], 1.0f / c[3][3], dest[3]); + glm_vec4_scale(c[4], 1.0f / c[4][3], dest[4]); + glm_vec4_scale(c[5], 1.0f / c[5][3], dest[5]); + glm_vec4_scale(c[6], 1.0f / c[6][3], dest[6]); + glm_vec4_scale(c[7], 1.0f / c[7][3], dest[7]); } /*! @@ -512,18 +523,19 @@ glm_frustum_corners(mat4 invMat, vec4 dest[8]) { CGLM_INLINE void glm_frustum_center(vec4 corners[8], vec4 dest) { - glm_vec4_broadcast(0.0f, dest); + vec4 center; - glm_vec4_add(corners[0], dest, dest); - glm_vec4_add(corners[1], dest, dest); - glm_vec4_add(corners[2], dest, dest); - glm_vec4_add(corners[3], dest, dest); - glm_vec4_add(corners[4], dest, dest); - glm_vec4_add(corners[5], dest, dest); - glm_vec4_add(corners[6], dest, dest); - glm_vec4_add(corners[7], dest, dest); + glm_vec4_copy(corners[0], center); - glm_vec4_scale(dest, 0.125f, dest); + glm_vec4_add(corners[1], center, center); + glm_vec4_add(corners[2], center, center); + glm_vec4_add(corners[3], center, center); + glm_vec4_add(corners[4], center, center); + glm_vec4_add(corners[5], center, center); + glm_vec4_add(corners[6], center, center); + glm_vec4_add(corners[7], center, center); + + glm_vec4_scale(center, 0.125f, dest); } #endif /* cglm_vcam_h */ diff --git a/include/cglm/util.h b/include/cglm/util.h index 2d726a1..6b97648 100644 --- a/include/cglm/util.h +++ b/include/cglm/util.h @@ -72,7 +72,7 @@ glm_min(float a, float b) { CGLM_INLINE float glm_max(float a, float b) { - if (a < b) + if (a > b) return a; return b; }