summaryrefslogtreecommitdiff
path: root/include/cglm/clipspace
diff options
context:
space:
mode:
Diffstat (limited to 'include/cglm/clipspace')
-rw-r--r--include/cglm/clipspace/ortho_lh_no.h183
-rw-r--r--include/cglm/clipspace/ortho_lh_zo.h177
-rw-r--r--include/cglm/clipspace/ortho_rh_no.h183
-rw-r--r--include/cglm/clipspace/ortho_rh_zo.h181
-rw-r--r--include/cglm/clipspace/persp.h48
-rw-r--r--include/cglm/clipspace/persp_lh_no.h395
-rw-r--r--include/cglm/clipspace/persp_lh_zo.h387
-rw-r--r--include/cglm/clipspace/persp_rh_no.h395
-rw-r--r--include/cglm/clipspace/persp_rh_zo.h389
-rw-r--r--include/cglm/clipspace/project_no.h109
-rw-r--r--include/cglm/clipspace/project_zo.h111
-rw-r--r--include/cglm/clipspace/view_lh.h99
-rw-r--r--include/cglm/clipspace/view_lh_no.h74
-rw-r--r--include/cglm/clipspace/view_lh_zo.h74
-rw-r--r--include/cglm/clipspace/view_rh.h99
-rw-r--r--include/cglm/clipspace/view_rh_no.h74
-rw-r--r--include/cglm/clipspace/view_rh_zo.h74
17 files changed, 3052 insertions, 0 deletions
diff --git a/include/cglm/clipspace/ortho_lh_no.h b/include/cglm/clipspace/ortho_lh_no.h
new file mode 100644
index 0000000..76c7a94
--- /dev/null
+++ b/include/cglm/clipspace/ortho_lh_no.h
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+/*
+ Functions:
+ CGLM_INLINE void glm_ortho_lh_no(float left, float right,
+ float bottom, float top,
+ float nearZ, float farZ,
+ mat4 dest)
+ CGLM_INLINE void glm_ortho_aabb_lh_no(vec3 box[2], mat4 dest)
+ CGLM_INLINE void glm_ortho_aabb_p_lh_no(vec3 box[2],
+ float padding,
+ mat4 dest)
+ CGLM_INLINE void glm_ortho_aabb_pz_lh_no(vec3 box[2],
+ float padding,
+ mat4 dest)
+ CGLM_INLINE void glm_ortho_default_lh_no(float aspect,
+ mat4 dest)
+ CGLM_INLINE void glm_ortho_default_s_lh_no(float aspect,
+ float size,
+ mat4 dest)
+ */
+
+#ifndef cglm_ortho_lh_no_h
+#define cglm_ortho_lh_no_h
+
+#include "../common.h"
+#include "../plane.h"
+#include "../mat4.h"
+
+/*!
+ * @brief set up orthographic projection matrix
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] left viewport.left
+ * @param[in] right viewport.right
+ * @param[in] bottom viewport.bottom
+ * @param[in] top viewport.top
+ * @param[in] nearZ near clipping plane
+ * @param[in] farZ far clipping plane
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_lh_no(float left, float right,
+ float bottom, float top,
+ float nearZ, float farZ,
+ mat4 dest) {
+ float rl, tb, fn;
+
+ glm_mat4_zero(dest);
+
+ rl = 1.0f / (right - left);
+ tb = 1.0f / (top - bottom);
+ fn =-1.0f / (farZ - nearZ);
+
+ 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] = (farZ + nearZ) * fn;
+ dest[3][3] = 1.0f;
+}
+
+/*!
+ * @brief set up orthographic projection matrix using bounding box
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * bounding box (AABB) must be in view space
+ *
+ * @param[in] box AABB
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_aabb_lh_no(vec3 box[2], mat4 dest) {
+ glm_ortho_lh_no(box[0][0], box[1][0],
+ box[0][1], box[1][1],
+ -box[1][2], -box[0][2],
+ dest);
+}
+
+/*!
+ * @brief set up orthographic projection matrix using bounding box
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * bounding box (AABB) must be in view space
+ *
+ * @param[in] box AABB
+ * @param[in] padding padding
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_aabb_p_lh_no(vec3 box[2], float padding, mat4 dest) {
+ glm_ortho_lh_no(box[0][0] - padding, box[1][0] + padding,
+ box[0][1] - padding, box[1][1] + padding,
+ -(box[1][2] + padding), -(box[0][2] - padding),
+ dest);
+}
+
+/*!
+ * @brief set up orthographic projection matrix using bounding box
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * bounding box (AABB) must be in view space
+ *
+ * @param[in] box AABB
+ * @param[in] padding padding for near and far
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_aabb_pz_lh_no(vec3 box[2], float padding, mat4 dest) {
+ glm_ortho_lh_no(box[0][0], box[1][0],
+ box[0][1], box[1][1],
+ -(box[1][2] + padding), -(box[0][2] - padding),
+ dest);
+}
+
+/*!
+ * @brief set up unit orthographic projection matrix
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] aspect aspect ration ( width / height )
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_default_lh_no(float aspect, mat4 dest) {
+ if (aspect >= 1.0f) {
+ glm_ortho_lh_no(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
+ return;
+ }
+
+ aspect = 1.0f / aspect;
+
+ glm_ortho_lh_no(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
+}
+
+/*!
+ * @brief set up orthographic projection matrix with given CUBE size
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] aspect aspect ratio ( width / height )
+ * @param[in] size cube size
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_default_s_lh_no(float aspect, float size, mat4 dest) {
+ if (aspect >= 1.0f) {
+ glm_ortho_lh_no(-size * aspect,
+ size * aspect,
+ -size,
+ size,
+ -size - 100.0f,
+ size + 100.0f,
+ dest);
+ return;
+ }
+
+ glm_ortho_lh_no(-size,
+ size,
+ -size / aspect,
+ size / aspect,
+ -size - 100.0f,
+ size + 100.0f,
+ dest);
+}
+
+#endif /*cglm_ortho_lh_no_h*/
diff --git a/include/cglm/clipspace/ortho_lh_zo.h b/include/cglm/clipspace/ortho_lh_zo.h
new file mode 100644
index 0000000..e45530d
--- /dev/null
+++ b/include/cglm/clipspace/ortho_lh_zo.h
@@ -0,0 +1,177 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+/*
+ Functions:
+ CGLM_INLINE void glm_ortho_lh_zo(float left, float right,
+ float bottom, float top,
+ float nearZ, float farZ,
+ mat4 dest)
+ CGLM_INLINE void glm_ortho_aabb_lh_zo(vec3 box[2], mat4 dest)
+ CGLM_INLINE void glm_ortho_aabb_p_lh_zo(vec3 box[2],
+ float padding,
+ mat4 dest)
+ CGLM_INLINE void glm_ortho_aabb_pz_lh_zo(vec3 box[2],
+ float padding,
+ mat4 dest)
+ CGLM_INLINE void glm_ortho_default_lh_zo(float aspect,
+ mat4 dest)
+ CGLM_INLINE void glm_ortho_default_s_lh_zo(float aspect,
+ float size,
+ mat4 dest)
+ */
+
+#ifndef cglm_ortho_lh_zo_h
+#define cglm_ortho_lh_zo_h
+
+#include "../common.h"
+#include "../plane.h"
+#include "../mat4.h"
+
+/*!
+ * @brief set up orthographic projection matrix with a left-hand coordinate
+ * system and a clip-space of [0, 1].
+ *
+ * @param[in] left viewport.left
+ * @param[in] right viewport.right
+ * @param[in] bottom viewport.bottom
+ * @param[in] top viewport.top
+ * @param[in] nearZ near clipping plane
+ * @param[in] farZ far clipping plane
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_lh_zo(float left, float right,
+ float bottom, float top,
+ float nearZ, float farZ,
+ mat4 dest) {
+ float rl, tb, fn;
+
+ glm_mat4_zero(dest);
+
+ rl = 1.0f / (right - left);
+ tb = 1.0f / (top - bottom);
+ fn =-1.0f / (farZ - nearZ);
+
+ dest[0][0] = 2.0f * rl;
+ dest[1][1] = 2.0f * tb;
+ dest[2][2] =-fn;
+ dest[3][0] =-(right + left) * rl;
+ dest[3][1] =-(top + bottom) * tb;
+ dest[3][2] = nearZ * fn;
+ dest[3][3] = 1.0f;
+}
+
+/*!
+ * @brief set up orthographic projection matrix using bounding box
+ * with a left-hand coordinate system and a clip-space of [0, 1].
+ *
+ * bounding box (AABB) must be in view space
+ *
+ * @param[in] box AABB
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_aabb_lh_zo(vec3 box[2], mat4 dest) {
+ glm_ortho_lh_zo(box[0][0], box[1][0],
+ box[0][1], box[1][1],
+ -box[1][2], -box[0][2],
+ dest);
+}
+
+/*!
+ * @brief set up orthographic projection matrix using bounding box
+ * with a left-hand coordinate system and a clip-space of [0, 1].
+ *
+ * bounding box (AABB) must be in view space
+ *
+ * @param[in] box AABB
+ * @param[in] padding padding
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_aabb_p_lh_zo(vec3 box[2], float padding, mat4 dest) {
+ glm_ortho_lh_zo(box[0][0] - padding, box[1][0] + padding,
+ box[0][1] - padding, box[1][1] + padding,
+ -(box[1][2] + padding), -(box[0][2] - padding),
+ dest);
+}
+
+/*!
+ * @brief set up orthographic projection matrix using bounding box
+ * with a left-hand coordinate system and a clip-space of [0, 1].
+ *
+ * bounding box (AABB) must be in view space
+ *
+ * @param[in] box AABB
+ * @param[in] padding padding for near and far
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_aabb_pz_lh_zo(vec3 box[2], float padding, mat4 dest) {
+ glm_ortho_lh_zo(box[0][0], box[1][0],
+ box[0][1], box[1][1],
+ -(box[1][2] + padding), -(box[0][2] - padding),
+ dest);
+}
+
+/*!
+ * @brief set up unit orthographic projection matrix
+ * with a left-hand coordinate system and a clip-space of [0, 1].
+ *
+ * @param[in] aspect aspect ration ( width / height )
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_default_lh_zo(float aspect, mat4 dest) {
+ if (aspect >= 1.0f) {
+ glm_ortho_lh_zo(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
+ return;
+ }
+
+ aspect = 1.0f / aspect;
+
+ glm_ortho_lh_zo(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
+}
+
+/*!
+ * @brief set up orthographic projection matrix with given CUBE size
+ * with a left-hand coordinate system and a clip-space of [0, 1].
+ *
+ * @param[in] aspect aspect ratio ( width / height )
+ * @param[in] size cube size
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_default_s_lh_zo(float aspect, float size, mat4 dest) {
+ if (aspect >= 1.0f) {
+ glm_ortho_lh_zo(-size * aspect,
+ size * aspect,
+ -size,
+ size,
+ -size - 100.0f,
+ size + 100.0f,
+ dest);
+ return;
+ }
+
+ glm_ortho_lh_zo(-size,
+ size,
+ -size / aspect,
+ size / aspect,
+ -size - 100.0f,
+ size + 100.0f,
+ dest);
+}
+
+#endif /*cglm_ortho_lh_zo_h*/
diff --git a/include/cglm/clipspace/ortho_rh_no.h b/include/cglm/clipspace/ortho_rh_no.h
new file mode 100644
index 0000000..aa7a906
--- /dev/null
+++ b/include/cglm/clipspace/ortho_rh_no.h
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+/*
+ Functions:
+ CGLM_INLINE void glm_ortho_rh_no(float left, float right,
+ float bottom, float top,
+ float nearZ, float farZ,
+ mat4 dest)
+ CGLM_INLINE void glm_ortho_aabb_rh_no(vec3 box[2], mat4 dest)
+ CGLM_INLINE void glm_ortho_aabb_p_rh_no(vec3 box[2],
+ float padding,
+ mat4 dest)
+ CGLM_INLINE void glm_ortho_aabb_pz_rh_no(vec3 box[2],
+ float padding,
+ mat4 dest)
+ CGLM_INLINE void glm_ortho_default_rh_no(float aspect,
+ mat4 dest)
+ CGLM_INLINE void glm_ortho_default_s_rh_no(float aspect,
+ float size,
+ mat4 dest)
+ */
+
+#ifndef cglm_ortho_rh_no_h
+#define cglm_ortho_rh_no_h
+
+#include "../common.h"
+#include "../plane.h"
+#include "../mat4.h"
+
+/*!
+ * @brief set up orthographic projection matrix
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] left viewport.left
+ * @param[in] right viewport.right
+ * @param[in] bottom viewport.bottom
+ * @param[in] top viewport.top
+ * @param[in] nearZ near clipping plane
+ * @param[in] farZ far clipping plane
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_rh_no(float left, float right,
+ float bottom, float top,
+ float nearZ, float farZ,
+ mat4 dest) {
+ float rl, tb, fn;
+
+ glm_mat4_zero(dest);
+
+ rl = 1.0f / (right - left);
+ tb = 1.0f / (top - bottom);
+ fn =-1.0f / (farZ - nearZ);
+
+ 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] = (farZ + nearZ) * fn;
+ dest[3][3] = 1.0f;
+}
+
+/*!
+ * @brief set up orthographic projection matrix using bounding box
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * bounding box (AABB) must be in view space
+ *
+ * @param[in] box AABB
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_aabb_rh_no(vec3 box[2], mat4 dest) {
+ glm_ortho_rh_no(box[0][0], box[1][0],
+ box[0][1], box[1][1],
+ -box[1][2], -box[0][2],
+ dest);
+}
+
+/*!
+ * @brief set up orthographic projection matrix using bounding box
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * bounding box (AABB) must be in view space
+ *
+ * @param[in] box AABB
+ * @param[in] padding padding
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_aabb_p_rh_no(vec3 box[2], float padding, mat4 dest) {
+ glm_ortho_rh_no(box[0][0] - padding, box[1][0] + padding,
+ box[0][1] - padding, box[1][1] + padding,
+ -(box[1][2] + padding), -(box[0][2] - padding),
+ dest);
+}
+
+/*!
+ * @brief set up orthographic projection matrix using bounding box
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * bounding box (AABB) must be in view space
+ *
+ * @param[in] box AABB
+ * @param[in] padding padding for near and far
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_aabb_pz_rh_no(vec3 box[2], float padding, mat4 dest) {
+ glm_ortho_rh_no(box[0][0], box[1][0],
+ box[0][1], box[1][1],
+ -(box[1][2] + padding), -(box[0][2] - padding),
+ dest);
+}
+
+/*!
+ * @brief set up unit orthographic projection matrix
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] aspect aspect ration ( width / height )
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_default_rh_no(float aspect, mat4 dest) {
+ if (aspect >= 1.0f) {
+ glm_ortho_rh_no(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
+ return;
+ }
+
+ aspect = 1.0f / aspect;
+
+ glm_ortho_rh_no(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
+}
+
+/*!
+ * @brief set up orthographic projection matrix with given CUBE size
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] aspect aspect ratio ( width / height )
+ * @param[in] size cube size
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_default_s_rh_no(float aspect, float size, mat4 dest) {
+ if (aspect >= 1.0f) {
+ glm_ortho_rh_no(-size * aspect,
+ size * aspect,
+ -size,
+ size,
+ -size - 100.0f,
+ size + 100.0f,
+ dest);
+ return;
+ }
+
+ glm_ortho_rh_no(-size,
+ size,
+ -size / aspect,
+ size / aspect,
+ -size - 100.0f,
+ size + 100.0f,
+ dest);
+}
+
+#endif /*cglm_ortho_rh_no_h*/
diff --git a/include/cglm/clipspace/ortho_rh_zo.h b/include/cglm/clipspace/ortho_rh_zo.h
new file mode 100644
index 0000000..7a0876c
--- /dev/null
+++ b/include/cglm/clipspace/ortho_rh_zo.h
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+/*
+ Functions:
+ CGLM_INLINE void glm_ortho_rh_zo(float left, float right,
+ float bottom, float top,
+ float nearZ, float farZ,
+ mat4 dest)
+ CGLM_INLINE void glm_ortho_aabb_rh_zo(vec3 box[2], mat4 dest)
+ CGLM_INLINE void glm_ortho_aabb_p_rh_zo(vec3 box[2],
+ float padding,
+ mat4 dest)
+ CGLM_INLINE void glm_ortho_aabb_pz_rh_zo(vec3 box[2],
+ float padding,
+ mat4 dest)
+ CGLM_INLINE void glm_ortho_default_rh_zo(float aspect,
+ mat4 dest)
+ CGLM_INLINE void glm_ortho_default_s_rh_zo(float aspect,
+ float size,
+ mat4 dest)
+ */
+
+#ifndef cglm_ortho_rh_zo_h
+#define cglm_ortho_rh_zo_h
+
+#include "../common.h"
+#include "../plane.h"
+#include "../mat4.h"
+
+/*!
+ * @brief set up orthographic projection matrix with a right-hand coordinate
+ * system and a clip-space of [0, 1].
+ *
+ * @param[in] left viewport.left
+ * @param[in] right viewport.right
+ * @param[in] bottom viewport.bottom
+ * @param[in] top viewport.top
+ * @param[in] nearZ near clipping plane
+ * @param[in] farZ far clipping plane
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_rh_zo(float left, float right,
+ float bottom, float top,
+ float nearZ, float farZ,
+ mat4 dest) {
+ float rl, tb, fn;
+
+ glm_mat4_zero(dest);
+
+ rl = 1.0f / (right - left);
+ tb = 1.0f / (top - bottom);
+ fn =-1.0f / (farZ - nearZ);
+
+ dest[0][0] = 2.0f * rl;
+ dest[1][1] = 2.0f * tb;
+ dest[2][2] = fn;
+ dest[3][0] =-(right + left) * rl;
+ dest[3][1] =-(top + bottom) * tb;
+ dest[3][2] = nearZ * fn;
+ dest[3][3] = 1.0f;
+}
+
+/*!
+ * @brief set up orthographic projection matrix using bounding box
+ * with a right-hand coordinate system and a clip-space with depth
+ * values from zero to one.
+ *
+ * bounding box (AABB) must be in view space
+ *
+ * @param[in] box AABB
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_aabb_rh_zo(vec3 box[2], mat4 dest) {
+ glm_ortho_rh_zo(box[0][0], box[1][0],
+ box[0][1], box[1][1],
+ -box[1][2], -box[0][2],
+ dest);
+}
+
+/*!
+ * @brief set up orthographic projection matrix using bounding box
+ * with a right-hand coordinate system and a clip-space with depth
+ * values from zero to one.
+ *
+ * bounding box (AABB) must be in view space
+ *
+ * @param[in] box AABB
+ * @param[in] padding padding
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_aabb_p_rh_zo(vec3 box[2], float padding, mat4 dest) {
+ glm_ortho_rh_zo(box[0][0] - padding, box[1][0] + padding,
+ box[0][1] - padding, box[1][1] + padding,
+ -(box[1][2] + padding), -(box[0][2] - padding),
+ dest);
+}
+
+/*!
+ * @brief set up orthographic projection matrix using bounding box
+ * with a right-hand coordinate system and a clip-space with depth
+ * values from zero to one.
+ *
+ * bounding box (AABB) must be in view space
+ *
+ * @param[in] box AABB
+ * @param[in] padding padding for near and far
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_aabb_pz_rh_zo(vec3 box[2], float padding, mat4 dest) {
+ glm_ortho_rh_zo(box[0][0], box[1][0],
+ box[0][1], box[1][1],
+ -(box[1][2] + padding), -(box[0][2] - padding),
+ dest);
+}
+
+/*!
+ * @brief set up unit orthographic projection matrix with a right-hand
+ * coordinate system and a clip-space of [0, 1].
+ *
+ * @param[in] aspect aspect ration ( width / height )
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_default_rh_zo(float aspect, mat4 dest) {
+ if (aspect >= 1.0f) {
+ glm_ortho_rh_zo(-aspect, aspect, -1.0f, 1.0f, -100.0f, 100.0f, dest);
+ return;
+ }
+
+ aspect = 1.0f / aspect;
+
+ glm_ortho_rh_zo(-1.0f, 1.0f, -aspect, aspect, -100.0f, 100.0f, dest);
+}
+
+/*!
+ * @brief set up orthographic projection matrix with given CUBE size
+ * with a right-hand coordinate system and a clip-space with depth
+ * values from zero to one.
+ *
+ * @param[in] aspect aspect ratio ( width / height )
+ * @param[in] size cube size
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_ortho_default_s_rh_zo(float aspect, float size, mat4 dest) {
+ if (aspect >= 1.0f) {
+ glm_ortho_rh_zo(-size * aspect,
+ size * aspect,
+ -size,
+ size,
+ -size - 100.0f,
+ size + 100.0f,
+ dest);
+ return;
+ }
+
+ glm_ortho_rh_zo(-size,
+ size,
+ -size / aspect,
+ size / aspect,
+ -size - 100.0f,
+ size + 100.0f,
+ dest);
+}
+
+#endif /*cglm_ortho_rh_zo_h*/
diff --git a/include/cglm/clipspace/persp.h b/include/cglm/clipspace/persp.h
new file mode 100644
index 0000000..15aa715
--- /dev/null
+++ b/include/cglm/clipspace/persp.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+/*
+ Functions:
+ CGLM_INLINE void glm_persp_decomp_far(mat4 proj, float *farZ)
+ CGLM_INLINE float glm_persp_fovy(mat4 proj)
+ CGLM_INLINE float glm_persp_aspect(mat4 proj)
+ CGLM_INLINE void glm_persp_sizes(mat4 proj, float fovy, vec4 dest)
+ */
+
+#ifndef cglm_persp_h
+#define cglm_persp_h
+
+#include "../common.h"
+#include "../plane.h"
+#include "../mat4.h"
+
+/*!
+ * @brief returns field of view angle along the Y-axis (in radians)
+ *
+ * if you need to degrees, use glm_deg to convert it or use this:
+ * fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
+ *
+ * @param[in] proj perspective projection matrix
+ */
+CGLM_INLINE
+float
+glm_persp_fovy(mat4 proj) {
+ return 2.0f * atanf(1.0f / proj[1][1]);
+}
+
+/*!
+ * @brief returns aspect ratio of perspective projection
+ *
+ * @param[in] proj perspective projection matrix
+ */
+CGLM_INLINE
+float
+glm_persp_aspect(mat4 proj) {
+ return proj[1][1] / proj[0][0];
+}
+
+#endif /* cglm_persp_h */
diff --git a/include/cglm/clipspace/persp_lh_no.h b/include/cglm/clipspace/persp_lh_no.h
new file mode 100644
index 0000000..d28923a
--- /dev/null
+++ b/include/cglm/clipspace/persp_lh_no.h
@@ -0,0 +1,395 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+/*
+ Functions:
+ CGLM_INLINE void glm_frustum_lh_no(float left, float right,
+ float bottom, float top,
+ float nearZ, float farZ,
+ mat4 dest)
+ CGLM_INLINE void glm_perspective_lh_no(float fovy,
+ float aspect,
+ float nearZ,
+ float farZ,
+ mat4 dest)
+ CGLM_INLINE void glm_perspective_default_lh_no(float aspect, mat4 dest)
+ CGLM_INLINE void glm_perspective_resize_lh_no(float aspect, mat4 proj)
+ CGLM_INLINE void glm_persp_move_far_lh_no(mat4 proj,
+ float deltaFar)
+ CGLM_INLINE void glm_persp_decomp_lh_no(mat4 proj,
+ float * __restrict nearZ,
+ float * __restrict farZ,
+ float * __restrict top,
+ float * __restrict bottom,
+ float * __restrict left,
+ float * __restrict right)
+ CGLM_INLINE void glm_persp_decompv_lh_no(mat4 proj,
+ float dest[6])
+ CGLM_INLINE void glm_persp_decomp_x_lh_no(mat4 proj,
+ float * __restrict left,
+ float * __restrict right)
+ CGLM_INLINE void glm_persp_decomp_y_lh_no(mat4 proj,
+ float * __restrict top,
+ float * __restrict bottom)
+ CGLM_INLINE void glm_persp_decomp_z_lh_no(mat4 proj,
+ float * __restrict nearZ,
+ float * __restrict farZ)
+ CGLM_INLINE void glm_persp_decomp_far_lh_no(mat4 proj, float * __restrict farZ)
+ CGLM_INLINE void glm_persp_decomp_near_lh_no(mat4 proj, float * __restrict nearZ)
+ CGLM_INLINE void glm_persp_sizes_lh_no(mat4 proj, float fovy, vec4 dest)
+ */
+
+#ifndef cglm_persp_lh_no_h
+#define cglm_persp_lh_no_h
+
+#include "../common.h"
+#include "persp.h"
+
+/*!
+ * @brief set up perspective peprojection matrix
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] left viewport.left
+ * @param[in] right viewport.right
+ * @param[in] bottom viewport.bottom
+ * @param[in] top viewport.top
+ * @param[in] nearZ near clipping plane
+ * @param[in] farZ far clipping plane
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_frustum_lh_no(float left, float right,
+ float bottom, float top,
+ float nearZ, float farZ,
+ mat4 dest) {
+ float rl, tb, fn, nv;
+
+ glm_mat4_zero(dest);
+
+ rl = 1.0f / (right - left);
+ tb = 1.0f / (top - bottom);
+ fn =-1.0f / (farZ - nearZ);
+ nv = 2.0f * nearZ;
+
+ 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] =-(farZ + nearZ) * fn;
+ dest[2][3] = 1.0f;
+ dest[3][2] = farZ * nv * fn;
+}
+
+/*!
+ * @brief set up perspective projection matrix
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] fovy field of view angle
+ * @param[in] aspect aspect ratio ( width / height )
+ * @param[in] nearZ near clipping plane
+ * @param[in] farZ far clipping planes
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_perspective_lh_no(float fovy,
+ float aspect,
+ float nearZ,
+ float farZ,
+ mat4 dest) {
+ float f, fn;
+
+ glm_mat4_zero(dest);
+
+ f = 1.0f / tanf(fovy * 0.5f);
+ fn = 1.0f / (nearZ - farZ);
+
+ dest[0][0] = f / aspect;
+ dest[1][1] = f;
+ dest[2][2] =-(nearZ + farZ) * fn;
+ dest[2][3] = 1.0f;
+ dest[3][2] = 2.0f * nearZ * farZ * fn;
+
+}
+
+/*!
+ * @brief set up perspective projection matrix with default near/far
+ * and angle values with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] aspect aspect ratio ( width / height )
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_perspective_default_lh_no(float aspect, mat4 dest) {
+ glm_perspective_lh_no(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
+}
+
+/*!
+ * @brief resize perspective matrix by aspect ratio ( width / height )
+ * this makes very easy to resize proj matrix when window /viewport
+ * resized with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] aspect aspect ratio ( width / height )
+ * @param[in, out] proj perspective projection matrix
+ */
+CGLM_INLINE
+void
+glm_perspective_resize_lh_no(float aspect, mat4 proj) {
+ if (proj[0][0] == 0.0f)
+ return;
+
+ proj[0][0] = proj[1][1] / aspect;
+}
+
+/*!
+ * @brief extend perspective projection matrix's far distance
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * this function does not guarantee far >= near, be aware of that!
+ *
+ * @param[in, out] proj projection matrix to extend
+ * @param[in] deltaFar distance from existing far (negative to shink)
+ */
+CGLM_INLINE
+void
+glm_persp_move_far_lh_no(mat4 proj, float deltaFar) {
+ float fn, farZ, nearZ, p22, p32;
+
+ p22 = -proj[2][2];
+ p32 = proj[3][2];
+
+ nearZ = p32 / (p22 - 1.0f);
+ farZ = p32 / (p22 + 1.0f) + deltaFar;
+ fn = 1.0f / (nearZ - farZ);
+
+ proj[2][2] = -(farZ + nearZ) * fn;
+ proj[3][2] = 2.0f * nearZ * farZ * fn;
+}
+
+/*!
+ * @brief decomposes frustum values of perspective projection
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] nearZ near
+ * @param[out] farZ far
+ * @param[out] top top
+ * @param[out] bottom bottom
+ * @param[out] left left
+ * @param[out] right right
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_lh_no(mat4 proj,
+ float * __restrict nearZ, float * __restrict farZ,
+ float * __restrict top, float * __restrict bottom,
+ float * __restrict left, float * __restrict right) {
+ float m00, m11, m20, m21, m22, m32, n, f;
+ float n_m11, n_m00;
+
+ m00 = proj[0][0];
+ m11 = proj[1][1];
+ m20 = proj[2][0];
+ m21 = proj[2][1];
+ m22 =-proj[2][2];
+ m32 = proj[3][2];
+
+ n = m32 / (m22 - 1.0f);
+ f = m32 / (m22 + 1.0f);
+
+ n_m11 = n / m11;
+ n_m00 = n / m00;
+
+ *nearZ = n;
+ *farZ = f;
+ *bottom = n_m11 * (m21 - 1.0f);
+ *top = n_m11 * (m21 + 1.0f);
+ *left = n_m00 * (m20 - 1.0f);
+ *right = n_m00 * (m20 + 1.0f);
+}
+
+/*!
+ * @brief decomposes frustum values of perspective projection
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ * this makes easy to get all values at once
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] dest array
+ */
+CGLM_INLINE
+void
+glm_persp_decompv_lh_no(mat4 proj, float dest[6]) {
+ glm_persp_decomp_lh_no(proj, &dest[0], &dest[1], &dest[2],
+ &dest[3], &dest[4], &dest[5]);
+}
+
+/*!
+ * @brief decomposes left and right values of perspective projection
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ * x stands for x axis (left / right axis)
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] left left
+ * @param[out] right right
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_x_lh_no(mat4 proj,
+ float * __restrict left,
+ float * __restrict right) {
+ float nearZ, m20, m00, m22;
+
+ m00 = proj[0][0];
+ m20 = proj[2][0];
+ m22 =-proj[2][2];
+
+ nearZ = proj[3][2] / (m22 - 1.0f);
+ *left = nearZ * (m20 - 1.0f) / m00;
+ *right = nearZ * (m20 + 1.0f) / m00;
+}
+
+/*!
+ * @brief decomposes top and bottom values of perspective projection
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ * y stands for y axis (top / bottom axis)
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] top top
+ * @param[out] bottom bottom
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_y_lh_no(mat4 proj,
+ float * __restrict top,
+ float * __restrict bottom) {
+ float nearZ, m21, m11, m22;
+
+ m21 = proj[2][1];
+ m11 = proj[1][1];
+ m22 =-proj[2][2];
+
+ nearZ = proj[3][2] / (m22 - 1.0f);
+ *bottom = nearZ * (m21 - 1.0f) / m11;
+ *top = nearZ * (m21 + 1.0f) / m11;
+}
+
+/*!
+ * @brief decomposes near and far values of perspective projection
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ * z stands for z axis (near / far axis)
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] nearZ near
+ * @param[out] farZ far
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_z_lh_no(mat4 proj,
+ float * __restrict nearZ,
+ float * __restrict farZ) {
+ float m32, m22;
+
+ m32 = proj[3][2];
+ m22 =-proj[2][2];
+
+ *nearZ = m32 / (m22 - 1.0f);
+ *farZ = m32 / (m22 + 1.0f);
+}
+
+/*!
+ * @brief decomposes far value of perspective projection
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] farZ far
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_far_lh_no(mat4 proj, float * __restrict farZ) {
+ *farZ = proj[3][2] / (-proj[2][2] + 1.0f);
+}
+
+/*!
+ * @brief decomposes near value of perspective projection
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] nearZ near
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_near_lh_no(mat4 proj, float * __restrict nearZ) {
+ *nearZ = proj[3][2] / (-proj[2][2] - 1.0f);
+}
+
+/*!
+ * @brief returns sizes of near and far planes of perspective projection
+ * with a left-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[in] fovy fovy (see brief)
+ * @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
+ */
+CGLM_INLINE
+void
+glm_persp_sizes_lh_no(mat4 proj, float fovy, vec4 dest) {
+ float t, a, nearZ, farZ;
+
+ t = 2.0f * tanf(fovy * 0.5f);
+ a = glm_persp_aspect(proj);
+
+ glm_persp_decomp_z_lh_no(proj, &nearZ, &farZ);
+
+ dest[1] = t * nearZ;
+ dest[3] = t * farZ;
+ dest[0] = a * dest[1];
+ dest[2] = a * dest[3];
+}
+
+/*!
+ * @brief returns field of view angle along the Y-axis (in radians)
+ * with a left-hand coordinate system and a clip-space of [-1, 1].
+ *
+ * if you need to degrees, use glm_deg to convert it or use this:
+ * fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
+ *
+ * @param[in] proj perspective projection matrix
+ */
+CGLM_INLINE
+float
+glm_persp_fovy_lh_no(mat4 proj) {
+ return glm_persp_fovy(proj);
+}
+
+/*!
+ * @brief returns aspect ratio of perspective projection
+ * with a left-hand coordinate system and a clip-space of [-1, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ */
+CGLM_INLINE
+float
+glm_persp_aspect_lh_no(mat4 proj) {
+ return glm_persp_aspect(proj);
+}
+
+#endif /*cglm_cam_lh_no_h*/
diff --git a/include/cglm/clipspace/persp_lh_zo.h b/include/cglm/clipspace/persp_lh_zo.h
new file mode 100644
index 0000000..de89643
--- /dev/null
+++ b/include/cglm/clipspace/persp_lh_zo.h
@@ -0,0 +1,387 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+/*
+ Functions:
+ CGLM_INLINE void glm_frustum_lh_zo(float left, float right,
+ float bottom, float top,
+ float nearZ, float farZ,
+ mat4 dest)
+ CGLM_INLINE void glm_perspective_lh_zo(float fovy,
+ float aspect,
+ float nearZ,
+ float farZ,
+ mat4 dest)
+ CGLM_INLINE void glm_perspective_default_lh_zo(float aspect, mat4 dest)
+ CGLM_INLINE void glm_perspective_resize_lh_zo(float aspect, mat4 proj)
+ CGLM_INLINE void glm_persp_move_far_lh_zo(mat4 proj,
+ float deltaFar)
+ CGLM_INLINE void glm_persp_decomp_lh_zo(mat4 proj,
+ float * __restrict nearZ,
+ float * __restrict farZ,
+ float * __restrict top,
+ float * __restrict bottom,
+ float * __restrict left,
+ float * __restrict right)
+ CGLM_INLINE void glm_persp_decompv_lh_zo(mat4 proj,
+ float dest[6])
+ CGLM_INLINE void glm_persp_decomp_x_lh_zo(mat4 proj,
+ float * __restrict left,
+ float * __restrict right)
+ CGLM_INLINE void glm_persp_decomp_y_lh_zo(mat4 proj,
+ float * __restrict top,
+ float * __restrict bottom)
+ CGLM_INLINE void glm_persp_decomp_z_lh_zo(mat4 proj,
+ float * __restrict nearZ,
+ float * __restrict farZ)
+ CGLM_INLINE void glm_persp_decomp_far_lh_zo(mat4 proj, float * __restrict farZ)
+ CGLM_INLINE void glm_persp_decomp_near_lh_zo(mat4 proj, float * __restrict nearZ)
+ CGLM_INLINE void glm_persp_sizes_lh_zo(mat4 proj, float fovy, vec4 dest)
+ */
+
+#ifndef cglm_persp_lh_zo_h
+#define cglm_persp_lh_zo_h
+
+#include "../common.h"
+#include "persp.h"
+
+/*!
+ * @brief set up perspective peprojection matrix with a left-hand coordinate
+ * system and a clip-space of [0, 1].
+ *
+ * @param[in] left viewport.left
+ * @param[in] right viewport.right
+ * @param[in] bottom viewport.bottom
+ * @param[in] top viewport.top
+ * @param[in] nearZ near clipping plane
+ * @param[in] farZ far clipping plane
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_frustum_lh_zo(float left, float right,
+ float bottom, float top,
+ float nearZ, float farZ,
+ mat4 dest) {
+ float rl, tb, fn, nv;
+
+ glm_mat4_zero(dest);
+
+ rl = 1.0f / (right - left);
+ tb = 1.0f / (top - bottom);
+ fn =-1.0f / (farZ - nearZ);
+ nv = 2.0f * nearZ;
+
+ 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] =-farZ * fn;
+ dest[2][3] = 1.0f;
+ dest[3][2] = farZ * nearZ * fn;
+}
+
+/*!
+ * @brief set up perspective projection matrix with a left-hand coordinate
+ * system and a clip-space of [0, 1].
+ *
+ * @param[in] fovy field of view angle
+ * @param[in] aspect aspect ratio ( width / height )
+ * @param[in] nearZ near clipping plane
+ * @param[in] farZ far clipping planes
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_perspective_lh_zo(float fovy,
+ float aspect,
+ float nearZ,
+ float farZ,
+ mat4 dest) {
+ float f, fn;
+
+ glm_mat4_zero(dest);
+
+ f = 1.0f / tanf(fovy * 0.5f);
+ fn = 1.0f / (nearZ - farZ);
+
+ dest[0][0] = f / aspect;
+ dest[1][1] = f;
+ dest[2][2] =-farZ * fn;
+ dest[2][3] = 1.0f;
+ dest[3][2] = nearZ * farZ * fn;
+}
+
+/*!
+ * @brief extend perspective projection matrix's far distance with a
+ * left-hand coordinate system and a clip-space with depth values
+ * from zero to one.
+ *
+ * this function does not guarantee far >= near, be aware of that!
+ *
+ * @param[in, out] proj projection matrix to extend
+ * @param[in] deltaFar distance from existing far (negative to shink)
+ */
+CGLM_INLINE
+void
+glm_persp_move_far_lh_zo(mat4 proj, float deltaFar) {
+ float fn, farZ, nearZ, p22, p32;
+
+ p22 = -proj[2][2];
+ p32 = proj[3][2];
+
+ nearZ = p32 / p22;
+ farZ = p32 / (p22 + 1.0f) + deltaFar;
+ fn = 1.0f / (nearZ - farZ);
+
+ proj[2][2] = -farZ * fn;
+ proj[3][2] = nearZ * farZ * fn;
+}
+
+/*!
+ * @brief set up perspective projection matrix with default near/far
+ * and angle values with a left-hand coordinate system and a
+ * clip-space of [0, 1].
+ *
+ * @param[in] aspect aspect ratio ( width / height )
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_perspective_default_lh_zo(float aspect, mat4 dest) {
+ glm_perspective_lh_zo(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
+}
+
+/*!
+ * @brief resize perspective matrix by aspect ratio ( width / height )
+ * this makes very easy to resize proj matrix when window /viewport
+ * reized
+ *
+ * @param[in] aspect aspect ratio ( width / height )
+ * @param[in, out] proj perspective projection matrix
+ */
+CGLM_INLINE
+void
+glm_perspective_resize_lh_zo(float aspect, mat4 proj) {
+ if (proj[0][0] == 0.0f)
+ return;
+
+ proj[0][0] = proj[1][1] / aspect;
+}
+
+/*!
+ * @brief decomposes frustum values of perspective projection
+ * with angle values with a left-hand coordinate system and a
+ * clip-space of [0, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] nearZ near
+ * @param[out] farZ far
+ * @param[out] top top
+ * @param[out] bottom bottom
+ * @param[out] left left
+ * @param[out] right right
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_lh_zo(mat4 proj,
+ float * __restrict nearZ, float * __restrict farZ,
+ float * __restrict top, float * __restrict bottom,
+ float * __restrict left, float * __restrict right) {
+ float m00, m11, m20, m21, m22, m32, n, f;
+ float n_m11, n_m00;
+
+ m00 = proj[0][0];
+ m11 = proj[1][1];
+ m20 = proj[2][0];
+ m21 = proj[2][1];
+ m22 =-proj[2][2];
+ m32 = proj[3][2];
+
+ n = m32 / m22;
+ f = m32 / (m22 + 1.0f);
+
+ n_m11 = n / m11;
+ n_m00 = n / m00;
+
+ *nearZ = n;
+ *farZ = f;
+ *bottom = n_m11 * (m21 - 1.0f);
+ *top = n_m11 * (m21 + 1.0f);
+ *left = n_m00 * (m20 - 1.0f);
+ *right = n_m00 * (m20 + 1.0f);
+}
+
+/*!
+ * @brief decomposes frustum values of perspective projection
+ * with angle values with a left-hand coordinate system and a
+ * clip-space of [0, 1].
+ * this makes easy to get all values at once
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] dest array
+ */
+CGLM_INLINE
+void
+glm_persp_decompv_lh_zo(mat4 proj, float dest[6]) {
+ glm_persp_decomp_lh_zo(proj, &dest[0], &dest[1], &dest[2],
+ &dest[3], &dest[4], &dest[5]);
+}
+
+/*!
+ * @brief decomposes left and right values of perspective projection (ZO).
+ * x stands for x axis (left / right axis)
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] left left
+ * @param[out] right right
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_x_lh_zo(mat4 proj,
+ float * __restrict left,
+ float * __restrict right) {
+ float nearZ, m20, m00;
+
+ m00 = proj[0][0];
+ m20 = proj[2][0];
+
+ nearZ = proj[3][2] / (proj[3][3]);
+ *left = nearZ * (m20 - 1.0f) / m00;
+ *right = nearZ * (m20 + 1.0f) / m00;
+}
+
+/*!
+ * @brief decomposes top and bottom values of perspective projection
+ * with angle values with a left-hand coordinate system and a
+ * clip-space of [0, 1].
+ * y stands for y axis (top / bottom axis)
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] top top
+ * @param[out] bottom bottom
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_y_lh_zo(mat4 proj,
+ float * __restrict top,
+ float * __restrict bottom) {
+ float nearZ, m21, m11;
+
+ m21 = proj[2][1];
+ m11 = proj[1][1];
+
+ nearZ = proj[3][2] / (proj[3][3]);
+ *bottom = nearZ * (m21 - 1) / m11;
+ *top = nearZ * (m21 + 1) / m11;
+}
+
+/*!
+ * @brief decomposes near and far values of perspective projection
+ * with angle values with a left-hand coordinate system and a
+ * clip-space of [0, 1].
+ * z stands for z axis (near / far axis)
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] nearZ near
+ * @param[out] farZ far
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_z_lh_zo(mat4 proj,
+ float * __restrict nearZ,
+ float * __restrict farZ) {
+ float m32, m22;
+
+ m32 = proj[3][2];
+ m22 = -proj[2][2];
+
+ *nearZ = m32 / m22;
+ *farZ = m32 / (m22 + 1.0f);
+}
+
+/*!
+ * @brief decomposes far value of perspective projection
+ * with angle values with a left-hand coordinate system and a
+ * clip-space of [0, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] farZ far
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_far_lh_zo(mat4 proj, float * __restrict farZ) {
+ *farZ = proj[3][2] / (-proj[2][2] + 1.0f);
+}
+
+/*!
+ * @brief decomposes near value of perspective projection
+ * with angle values with a left-hand coordinate system and a
+ * clip-space of [0, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] nearZ near
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_near_lh_zo(mat4 proj, float * __restrict nearZ) {
+ *nearZ = proj[3][2] / -proj[2][2];
+}
+
+/*!
+ * @brief returns sizes of near and far planes of perspective projection
+ * with a left-hand coordinate system and a
+ * clip-space of [0, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[in] fovy fovy (see brief)
+ * @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
+ */
+CGLM_INLINE
+void
+glm_persp_sizes_lh_zo(mat4 proj, float fovy, vec4 dest) {
+ float t, a, nearZ, farZ;
+
+ t = 2.0f * tanf(fovy * 0.5f);
+ a = glm_persp_aspect(proj);
+
+ glm_persp_decomp_z_lh_zo(proj, &nearZ, &farZ);
+
+ dest[1] = t * nearZ;
+ dest[3] = t * farZ;
+ dest[0] = a * dest[1];
+ dest[2] = a * dest[3];
+}
+
+/*!
+ * @brief returns field of view angle along the Y-axis (in radians)
+ * with a left-hand coordinate system and a clip-space of [0, 1].
+ *
+ * if you need to degrees, use glm_deg to convert it or use this:
+ * fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
+ *
+ * @param[in] proj perspective projection matrix
+ */
+CGLM_INLINE
+float
+glm_persp_fovy_lh_zo(mat4 proj) {
+ return glm_persp_fovy(proj);
+}
+
+/*!
+ * @brief returns aspect ratio of perspective projection
+ * with a left-hand coordinate system and a clip-space of [0, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ */
+CGLM_INLINE
+float
+glm_persp_aspect_lh_zo(mat4 proj) {
+ return glm_persp_aspect(proj);
+}
+
+#endif /*cglm_persp_lh_zo_h*/
diff --git a/include/cglm/clipspace/persp_rh_no.h b/include/cglm/clipspace/persp_rh_no.h
new file mode 100644
index 0000000..9252332
--- /dev/null
+++ b/include/cglm/clipspace/persp_rh_no.h
@@ -0,0 +1,395 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+/*
+ Functions:
+ CGLM_INLINE void glm_frustum_rh_no(float left, float right,
+ float bottom, float top,
+ float nearZ, float farZ,
+ mat4 dest)
+ CGLM_INLINE void glm_perspective_rh_no(float fovy,
+ float aspect,
+ float nearZ,
+ float farZ,
+ mat4 dest)
+ CGLM_INLINE void glm_perspective_default_rh_no(float aspect, mat4 dest)
+ CGLM_INLINE void glm_perspective_resize_rh_no(float aspect, mat4 proj)
+ CGLM_INLINE void glm_persp_move_far_rh_no(mat4 proj,
+ float deltaFar)
+ CGLM_INLINE void glm_persp_decomp_rh_no(mat4 proj,
+ float * __restrict nearZ,
+ float * __restrict farZ,
+ float * __restrict top,
+ float * __restrict bottom,
+ float * __restrict left,
+ float * __restrict right)
+ CGLM_INLINE void glm_persp_decompv_rh_no(mat4 proj,
+ float dest[6])
+ CGLM_INLINE void glm_persp_decomp_x_rh_no(mat4 proj,
+ float * __restrict left,
+ float * __restrict right)
+ CGLM_INLINE void glm_persp_decomp_y_rh_no(mat4 proj,
+ float * __restrict top,
+ float * __restrict bottom)
+ CGLM_INLINE void glm_persp_decomp_z_rh_no(mat4 proj,
+ float * __restrict nearZ,
+ float * __restrict farZ)
+ CGLM_INLINE void glm_persp_decomp_far_rh_no(mat4 proj, float * __restrict farZ)
+ CGLM_INLINE void glm_persp_decomp_near_rh_no(mat4 proj, float * __restrict nearZ)
+ CGLM_INLINE void glm_persp_sizes_rh_no(mat4 proj, float fovy, vec4 dest)
+ */
+
+#ifndef cglm_persp_rh_no_h
+#define cglm_persp_rh_no_h
+
+#include "../common.h"
+#include "persp.h"
+
+/*!
+ * @brief set up perspective peprojection matrix
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] left viewport.left
+ * @param[in] right viewport.right
+ * @param[in] bottom viewport.bottom
+ * @param[in] top viewport.top
+ * @param[in] nearZ near clipping plane
+ * @param[in] farZ far clipping plane
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_frustum_rh_no(float left, float right,
+ float bottom, float top,
+ float nearZ, float farZ,
+ mat4 dest) {
+ float rl, tb, fn, nv;
+
+ glm_mat4_zero(dest);
+
+ rl = 1.0f / (right - left);
+ tb = 1.0f / (top - bottom);
+ fn =-1.0f / (farZ - nearZ);
+ nv = 2.0f * nearZ;
+
+ 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] = (farZ + nearZ) * fn;
+ dest[2][3] =-1.0f;
+ dest[3][2] = farZ * nv * fn;
+}
+
+/*!
+ * @brief set up perspective projection matrix
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] fovy field of view angle
+ * @param[in] aspect aspect ratio ( width / height )
+ * @param[in] nearZ near clipping plane
+ * @param[in] farZ far clipping planes
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_perspective_rh_no(float fovy,
+ float aspect,
+ float nearZ,
+ float farZ,
+ mat4 dest) {
+ float f, fn;
+
+ glm_mat4_zero(dest);
+
+ f = 1.0f / tanf(fovy * 0.5f);
+ fn = 1.0f / (nearZ - farZ);
+
+ dest[0][0] = f / aspect;
+ dest[1][1] = f;
+ dest[2][2] = (nearZ + farZ) * fn;
+ dest[2][3] =-1.0f;
+ dest[3][2] = 2.0f * nearZ * farZ * fn;
+
+}
+
+/*!
+ * @brief set up perspective projection matrix with default near/far
+ * and angle values with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] aspect aspect ratio ( width / height )
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_perspective_default_rh_no(float aspect, mat4 dest) {
+ glm_perspective_rh_no(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
+}
+
+/*!
+ * @brief resize perspective matrix by aspect ratio ( width / height )
+ * this makes very easy to resize proj matrix when window /viewport
+ * resized with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] aspect aspect ratio ( width / height )
+ * @param[in, out] proj perspective projection matrix
+ */
+CGLM_INLINE
+void
+glm_perspective_resize_rh_no(float aspect, mat4 proj) {
+ if (proj[0][0] == 0.0f)
+ return;
+
+ proj[0][0] = proj[1][1] / aspect;
+}
+
+/*!
+ * @brief extend perspective projection matrix's far distance
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * this function does not guarantee far >= near, be aware of that!
+ *
+ * @param[in, out] proj projection matrix to extend
+ * @param[in] deltaFar distance from existing far (negative to shink)
+ */
+CGLM_INLINE
+void
+glm_persp_move_far_rh_no(mat4 proj, float deltaFar) {
+ float fn, farZ, nearZ, p22, p32;
+
+ p22 = proj[2][2];
+ p32 = proj[3][2];
+
+ nearZ = p32 / (p22 - 1.0f);
+ farZ = p32 / (p22 + 1.0f) + deltaFar;
+ fn = 1.0f / (nearZ - farZ);
+
+ proj[2][2] = (farZ + nearZ) * fn;
+ proj[3][2] = 2.0f * nearZ * farZ * fn;
+}
+
+/*!
+ * @brief decomposes frustum values of perspective projection
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] nearZ near
+ * @param[out] farZ far
+ * @param[out] top top
+ * @param[out] bottom bottom
+ * @param[out] left left
+ * @param[out] right right
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_rh_no(mat4 proj,
+ float * __restrict nearZ, float * __restrict farZ,
+ float * __restrict top, float * __restrict bottom,
+ float * __restrict left, float * __restrict right) {
+ float m00, m11, m20, m21, m22, m32, n, f;
+ float n_m11, n_m00;
+
+ m00 = proj[0][0];
+ m11 = proj[1][1];
+ m20 = proj[2][0];
+ m21 = proj[2][1];
+ m22 = proj[2][2];
+ m32 = proj[3][2];
+
+ n = m32 / (m22 - 1.0f);
+ f = m32 / (m22 + 1.0f);
+
+ n_m11 = n / m11;
+ n_m00 = n / m00;
+
+ *nearZ = n;
+ *farZ = f;
+ *bottom = n_m11 * (m21 - 1.0f);
+ *top = n_m11 * (m21 + 1.0f);
+ *left = n_m00 * (m20 - 1.0f);
+ *right = n_m00 * (m20 + 1.0f);
+}
+
+/*!
+ * @brief decomposes frustum values of perspective projection
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ * this makes easy to get all values at once
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] dest array
+ */
+CGLM_INLINE
+void
+glm_persp_decompv_rh_no(mat4 proj, float dest[6]) {
+ glm_persp_decomp_rh_no(proj, &dest[0], &dest[1], &dest[2],
+ &dest[3], &dest[4], &dest[5]);
+}
+
+/*!
+ * @brief decomposes left and right values of perspective projection
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ * x stands for x axis (left / right axis)
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] left left
+ * @param[out] right right
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_x_rh_no(mat4 proj,
+ float * __restrict left,
+ float * __restrict right) {
+ float nearZ, m20, m00, m22;
+
+ m00 = proj[0][0];
+ m20 = proj[2][0];
+ m22 = proj[2][2];
+
+ nearZ = proj[3][2] / (m22 - 1.0f);
+ *left = nearZ * (m20 - 1.0f) / m00;
+ *right = nearZ * (m20 + 1.0f) / m00;
+}
+
+/*!
+ * @brief decomposes top and bottom values of perspective projection
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ * y stands for y axis (top / bottom axis)
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] top top
+ * @param[out] bottom bottom
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_y_rh_no(mat4 proj,
+ float * __restrict top,
+ float * __restrict bottom) {
+ float nearZ, m21, m11, m22;
+
+ m21 = proj[2][1];
+ m11 = proj[1][1];
+ m22 = proj[2][2];
+
+ nearZ = proj[3][2] / (m22 - 1.0f);
+ *bottom = nearZ * (m21 - 1.0f) / m11;
+ *top = nearZ * (m21 + 1.0f) / m11;
+}
+
+/*!
+ * @brief decomposes near and far values of perspective projection
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ * z stands for z axis (near / far axis)
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] nearZ near
+ * @param[out] farZ far
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_z_rh_no(mat4 proj,
+ float * __restrict nearZ,
+ float * __restrict farZ) {
+ float m32, m22;
+
+ m32 = proj[3][2];
+ m22 = proj[2][2];
+
+ *nearZ = m32 / (m22 - 1.0f);
+ *farZ = m32 / (m22 + 1.0f);
+}
+
+/*!
+ * @brief decomposes far value of perspective projection
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] farZ far
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_far_rh_no(mat4 proj, float * __restrict farZ) {
+ *farZ = proj[3][2] / (proj[2][2] + 1.0f);
+}
+
+/*!
+ * @brief decomposes near value of perspective projection
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] nearZ near
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_near_rh_no(mat4 proj, float * __restrict nearZ) {
+ *nearZ = proj[3][2] / (proj[2][2] - 1.0f);
+}
+
+/*!
+ * @brief returns sizes of near and far planes of perspective projection
+ * with a right-hand coordinate system and a
+ * clip-space of [-1, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[in] fovy fovy (see brief)
+ * @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
+ */
+CGLM_INLINE
+void
+glm_persp_sizes_rh_no(mat4 proj, float fovy, vec4 dest) {
+ float t, a, nearZ, farZ;
+
+ t = 2.0f * tanf(fovy * 0.5f);
+ a = glm_persp_aspect(proj);
+
+ glm_persp_decomp_z_rh_no(proj, &nearZ, &farZ);
+
+ dest[1] = t * nearZ;
+ dest[3] = t * farZ;
+ dest[0] = a * dest[1];
+ dest[2] = a * dest[3];
+}
+
+/*!
+ * @brief returns field of view angle along the Y-axis (in radians)
+ * with a right-hand coordinate system and a clip-space of [-1, 1].
+ *
+ * if you need to degrees, use glm_deg to convert it or use this:
+ * fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
+ *
+ * @param[in] proj perspective projection matrix
+ */
+CGLM_INLINE
+float
+glm_persp_fovy_rh_no(mat4 proj) {
+ return glm_persp_fovy(proj);
+}
+
+/*!
+ * @brief returns aspect ratio of perspective projection
+ * with a right-hand coordinate system and a clip-space of [-1, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ */
+CGLM_INLINE
+float
+glm_persp_aspect_rh_no(mat4 proj) {
+ return glm_persp_aspect(proj);
+}
+
+#endif /*cglm_cam_rh_no_h*/
diff --git a/include/cglm/clipspace/persp_rh_zo.h b/include/cglm/clipspace/persp_rh_zo.h
new file mode 100644
index 0000000..ce632b3
--- /dev/null
+++ b/include/cglm/clipspace/persp_rh_zo.h
@@ -0,0 +1,389 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+/*
+ Functions:
+ CGLM_INLINE void glm_frustum_rh_zo(float left, float right,
+ float bottom, float top,
+ float nearZ, float farZ,
+ mat4 dest)
+ CGLM_INLINE void glm_perspective_rh_zo(float fovy,
+ float aspect,
+ float nearZ,
+ float farZ,
+ mat4 dest)
+ CGLM_INLINE void glm_perspective_default_rh_zo(float aspect, mat4 dest)
+ CGLM_INLINE void glm_perspective_resize_rh_zo(float aspect, mat4 proj)
+ CGLM_INLINE void glm_persp_move_far_rh_zo(mat4 proj,
+ float deltaFar)
+ CGLM_INLINE void glm_persp_decomp_rh_zo(mat4 proj,
+ float * __restrict nearZ,
+ float * __restrict farZ,
+ float * __restrict top,
+ float * __restrict bottom,
+ float * __restrict left,
+ float * __restrict right)
+ CGLM_INLINE void glm_persp_decompv_rh_zo(mat4 proj,
+ float dest[6])
+ CGLM_INLINE void glm_persp_decomp_x_rh_zo(mat4 proj,
+ float * __restrict left,
+ float * __restrict right)
+ CGLM_INLINE void glm_persp_decomp_y_rh_zo(mat4 proj,
+ float * __restrict top,
+ float * __restrict bottom)
+ CGLM_INLINE void glm_persp_decomp_z_rh_zo(mat4 proj,
+ float * __restrict nearZ,
+ float * __restrict farZ)
+ CGLM_INLINE void glm_persp_decomp_far_rh_zo(mat4 proj, float * __restrict farZ)
+ CGLM_INLINE void glm_persp_decomp_near_rh_zo(mat4 proj, float * __restrict nearZ)
+ CGLM_INLINE void glm_persp_sizes_rh_zo(mat4 proj, float fovy, vec4 dest)
+ */
+
+#ifndef cglm_persp_rh_zo_h
+#define cglm_persp_rh_zo_h
+
+#include "../common.h"
+#include "persp.h"
+
+/*!
+ * @brief set up perspective peprojection matrix with a right-hand coordinate
+ * system and a clip-space of [0, 1].
+ *
+ * @param[in] left viewport.left
+ * @param[in] right viewport.right
+ * @param[in] bottom viewport.bottom
+ * @param[in] top viewport.top
+ * @param[in] nearZ near clipping plane
+ * @param[in] farZ far clipping plane
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_frustum_rh_zo(float left, float right,
+ float bottom, float top,
+ float nearZ, float farZ,
+ mat4 dest) {
+ float rl, tb, fn, nv;
+
+ glm_mat4_zero(dest);
+
+ rl = 1.0f / (right - left);
+ tb = 1.0f / (top - bottom);
+ fn =-1.0f / (farZ - nearZ);
+ nv = 2.0f * nearZ;
+
+ 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] = farZ * fn;
+ dest[2][3] =-1.0f;
+ dest[3][2] = farZ * nearZ * fn;
+}
+
+/*!
+ * @brief set up perspective projection matrix with a right-hand coordinate
+ * system and a clip-space of [0, 1].
+ *
+ * @param[in] fovy field of view angle
+ * @param[in] aspect aspect ratio ( width / height )
+ * @param[in] nearZ near clipping plane
+ * @param[in] farZ far clipping planes
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_perspective_rh_zo(float fovy,
+ float aspect,
+ float nearZ,
+ float farZ,
+ mat4 dest) {
+ float f, fn;
+
+ glm_mat4_zero(dest);
+
+ f = 1.0f / tanf(fovy * 0.5f);
+ fn = 1.0f / (nearZ - farZ);
+
+ dest[0][0] = f / aspect;
+ dest[1][1] = f;
+ dest[2][2] = farZ * fn;
+ dest[2][3] =-1.0f;
+ dest[3][2] = nearZ * farZ * fn;
+}
+
+/*!
+ * @brief set up perspective projection matrix with default near/far
+ * and angle values with a right-hand coordinate system and a
+ * clip-space of [0, 1].
+ *
+ * @param[in] aspect aspect ratio ( width / height )
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_perspective_default_rh_zo(float aspect, mat4 dest) {
+ glm_perspective_rh_zo(GLM_PI_4f, aspect, 0.01f, 100.0f, dest);
+}
+
+/*!
+ * @brief resize perspective matrix by aspect ratio ( width / height )
+ * this makes very easy to resize proj matrix when window /viewport
+ * resized with a right-hand coordinate system and a clip-space of
+ * [0, 1].
+ *
+ * @param[in] aspect aspect ratio ( width / height )
+ * @param[in, out] proj perspective projection matrix
+ */
+CGLM_INLINE
+void
+glm_perspective_resize_rh_zo(float aspect, mat4 proj) {
+ if (proj[0][0] == 0.0f)
+ return;
+
+ proj[0][0] = proj[1][1] / aspect;
+}
+
+/*!
+ * @brief extend perspective projection matrix's far distance with a
+ * right-hand coordinate system and a clip-space of [0, 1].
+ *
+ * this function does not guarantee far >= near, be aware of that!
+ *
+ * @param[in, out] proj projection matrix to extend
+ * @param[in] deltaFar distance from existing far (negative to shink)
+ */
+CGLM_INLINE
+void
+glm_persp_move_far_rh_zo(mat4 proj, float deltaFar) {
+ float fn, farZ, nearZ, p22, p32;
+
+ p22 = proj[2][2];
+ p32 = proj[3][2];
+
+ nearZ = p32 / p22;
+ farZ = p32 / (p22 + 1.0f) + deltaFar;
+ fn = 1.0f / (nearZ - farZ);
+
+ proj[2][2] = farZ * fn;
+ proj[3][2] = nearZ * farZ * fn;
+}
+
+/*!
+ * @brief decomposes frustum values of perspective projection
+ * with angle values with a right-hand coordinate system and a
+ * clip-space of [0, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] nearZ near
+ * @param[out] farZ far
+ * @param[out] top top
+ * @param[out] bottom bottom
+ * @param[out] left left
+ * @param[out] right right
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_rh_zo(mat4 proj,
+ float * __restrict nearZ, float * __restrict farZ,
+ float * __restrict top, float * __restrict bottom,
+ float * __restrict left, float * __restrict right) {
+ float m00, m11, m20, m21, m22, m32, n, f;
+ float n_m11, n_m00;
+
+ m00 = proj[0][0];
+ m11 = proj[1][1];
+ m20 = proj[2][0];
+ m21 = proj[2][1];
+ m22 = proj[2][2];
+ m32 = proj[3][2];
+
+ n = m32 / m22;
+ f = m32 / (m22 + 1.0f);
+
+ n_m11 = n / m11;
+ n_m00 = n / m00;
+
+ *nearZ = n;
+ *farZ = f;
+ *bottom = n_m11 * (m21 - 1.0f);
+ *top = n_m11 * (m21 + 1.0f);
+ *left = n_m00 * (m20 - 1.0f);
+ *right = n_m00 * (m20 + 1.0f);
+}
+
+/*!
+ * @brief decomposes frustum values of perspective projection
+ * with angle values with a right-hand coordinate system and a
+ * clip-space of [0, 1].
+ * this makes easy to get all values at once
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] dest array
+ */
+CGLM_INLINE
+void
+glm_persp_decompv_rh_zo(mat4 proj, float dest[6]) {
+ glm_persp_decomp_rh_zo(proj, &dest[0], &dest[1], &dest[2],
+ &dest[3], &dest[4], &dest[5]);
+}
+
+/*!
+ * @brief decomposes left and right values of perspective projection (ZO).
+ * x stands for x axis (left / right axis)
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] left left
+ * @param[out] right right
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_x_rh_zo(mat4 proj,
+ float * __restrict left,
+ float * __restrict right) {
+ float nearZ, m20, m00, m22;
+
+ m00 = proj[0][0];
+ m20 = proj[2][0];
+ m22 = proj[2][2];
+
+ nearZ = proj[3][2] / m22;
+ *left = nearZ * (m20 - 1.0f) / m00;
+ *right = nearZ * (m20 + 1.0f) / m00;
+}
+
+/*!
+ * @brief decomposes top and bottom values of perspective projection
+ * with angle values with a right-hand coordinate system and a
+ * clip-space of [0, 1].
+ * y stands for y axis (top / bottom axis)
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] top top
+ * @param[out] bottom bottom
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_y_rh_zo(mat4 proj,
+ float * __restrict top,
+ float * __restrict bottom) {
+ float nearZ, m21, m11, m22;
+
+ m21 = proj[2][1];
+ m11 = proj[1][1];
+ m22 = proj[2][2];
+
+ nearZ = proj[3][2] / m22;
+ *bottom = nearZ * (m21 - 1) / m11;
+ *top = nearZ * (m21 + 1) / m11;
+}
+
+/*!
+ * @brief decomposes near and far values of perspective projection
+ * with angle values with a right-hand coordinate system and a
+ * clip-space of [0, 1].
+ * z stands for z axis (near / far axis)
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] nearZ near
+ * @param[out] farZ far
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_z_rh_zo(mat4 proj,
+ float * __restrict nearZ,
+ float * __restrict farZ) {
+ float m32, m22;
+
+ m32 = proj[3][2];
+ m22 = proj[2][2];
+
+ *nearZ = m32 / m22;
+ *farZ = m32 / (m22 + 1.0f);
+}
+
+/*!
+ * @brief decomposes far value of perspective projection
+ * with angle values with a right-hand coordinate system and a
+ * clip-space of [0, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] farZ far
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_far_rh_zo(mat4 proj, float * __restrict farZ) {
+ *farZ = proj[3][2] / (proj[2][2] + 1.0f);
+}
+
+/*!
+ * @brief decomposes near value of perspective projection
+ * with angle values with a right-hand coordinate system and a
+ * clip-space of [0, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[out] nearZ near
+ */
+CGLM_INLINE
+void
+glm_persp_decomp_near_rh_zo(mat4 proj, float * __restrict nearZ) {
+ *nearZ = proj[3][2] / proj[2][2];
+}
+
+/*!
+ * @brief returns sizes of near and far planes of perspective projection
+ * with a right-hand coordinate system and a
+ * clip-space of [0, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ * @param[in] fovy fovy (see brief)
+ * @param[out] dest sizes order: [Wnear, Hnear, Wfar, Hfar]
+ */
+CGLM_INLINE
+void
+glm_persp_sizes_rh_zo(mat4 proj, float fovy, vec4 dest) {
+ float t, a, nearZ, farZ;
+
+ t = 2.0f * tanf(fovy * 0.5f);
+ a = glm_persp_aspect(proj);
+
+ glm_persp_decomp_z_rh_zo(proj, &nearZ, &farZ);
+
+ dest[1] = t * nearZ;
+ dest[3] = t * farZ;
+ dest[0] = a * dest[1];
+ dest[2] = a * dest[3];
+}
+
+/*!
+ * @brief returns field of view angle along the Y-axis (in radians)
+ * with a right-hand coordinate system and a clip-space of [0, 1].
+ *
+ * if you need to degrees, use glm_deg to convert it or use this:
+ * fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
+ *
+ * @param[in] proj perspective projection matrix
+ */
+CGLM_INLINE
+float
+glm_persp_fovy_rh_zo(mat4 proj) {
+ return glm_persp_fovy(proj);
+}
+
+/*!
+ * @brief returns aspect ratio of perspective projection
+ * with a right-hand coordinate system and a clip-space of [0, 1].
+ *
+ * @param[in] proj perspective projection matrix
+ */
+CGLM_INLINE
+float
+glm_persp_aspect_rh_zo(mat4 proj) {
+ return glm_persp_aspect(proj);
+}
+
+#endif /*cglm_persp_rh_zo_h*/
diff --git a/include/cglm/clipspace/project_no.h b/include/cglm/clipspace/project_no.h
new file mode 100644
index 0000000..71fbc52
--- /dev/null
+++ b/include/cglm/clipspace/project_no.h
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+#ifndef cglm_project_no_h
+#define cglm_project_no_h
+
+#include "../common.h"
+#include "../vec3.h"
+#include "../vec4.h"
+#include "../mat4.h"
+
+/*!
+ * @brief maps the specified viewport coordinates into specified space [1]
+ * the matrix should contain projection matrix.
+ *
+ * if you don't have ( and don't want to have ) an inverse matrix then use
+ * glm_unproject version. You may use existing inverse of matrix in somewhere
+ * else, this is why glm_unprojecti exists to save save inversion cost
+ *
+ * [1] space:
+ * 1- if m = invProj: View Space
+ * 2- if m = invViewProj: World Space
+ * 3- if m = invMVP: Object Space
+ *
+ * You probably want to map the coordinates into object space
+ * so use invMVP as m
+ *
+ * Computing viewProj:
+ * glm_mat4_mul(proj, view, viewProj);
+ * glm_mat4_mul(viewProj, model, MVP);
+ * glm_mat4_inv(viewProj, invMVP);
+ *
+ * @param[in] pos point/position in viewport coordinates
+ * @param[in] invMat matrix (see brief)
+ * @param[in] vp viewport as [x, y, width, height]
+ * @param[out] dest unprojected coordinates
+ */
+CGLM_INLINE
+void
+glm_unprojecti_no(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
+ vec4 v;
+
+ v[0] = 2.0f * (pos[0] - vp[0]) / vp[2] - 1.0f;
+ v[1] = 2.0f * (pos[1] - vp[1]) / vp[3] - 1.0f;
+ v[2] = 2.0f * pos[2] - 1.0f;
+ v[3] = 1.0f;
+
+ glm_mat4_mulv(invMat, v, v);
+ glm_vec4_scale(v, 1.0f / v[3], v);
+ glm_vec3(v, dest);
+}
+
+/*!
+ * @brief map object coordinates to window coordinates
+ *
+ * Computing MVP:
+ * glm_mat4_mul(proj, view, viewProj);
+ * glm_mat4_mul(viewProj, model, MVP);
+ *
+ * @param[in] pos object coordinates
+ * @param[in] m MVP matrix
+ * @param[in] vp viewport as [x, y, width, height]
+ * @param[out] dest projected coordinates
+ */
+CGLM_INLINE
+void
+glm_project_no(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
+ CGLM_ALIGN(16) vec4 pos4;
+
+ glm_vec4(pos, 1.0f, pos4);
+
+ glm_mat4_mulv(m, pos4, pos4);
+ glm_vec4_scale(pos4, 1.0f / pos4[3], pos4); /* pos = pos / pos.w */
+ glm_vec4_scale(pos4, 0.5f, pos4);
+ glm_vec4_adds(pos4, 0.5f, pos4);
+
+ dest[0] = pos4[0] * vp[2] + vp[0];
+ dest[1] = pos4[1] * vp[3] + vp[1];
+ dest[2] = pos4[2];
+}
+
+/*!
+ * @brief map object's z coordinate to window coordinates
+ *
+ * Computing MVP:
+ * glm_mat4_mul(proj, view, viewProj);
+ * glm_mat4_mul(viewProj, model, MVP);
+ *
+ * @param[in] v object coordinates
+ * @param[in] m MVP matrix
+ *
+ * @returns projected z coordinate
+ */
+CGLM_INLINE
+float
+glm_project_z_no(vec3 v, mat4 m) {
+ float z, w;
+
+ z = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2];
+ w = m[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] + m[3][3];
+
+ return 0.5f * (z / w) + 0.5f;
+}
+
+#endif /* cglm_project_no_h */
diff --git a/include/cglm/clipspace/project_zo.h b/include/cglm/clipspace/project_zo.h
new file mode 100644
index 0000000..dc32078
--- /dev/null
+++ b/include/cglm/clipspace/project_zo.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+#ifndef cglm_project_zo_h
+#define cglm_project_zo_h
+
+#include "../common.h"
+#include "../vec3.h"
+#include "../vec4.h"
+#include "../mat4.h"
+
+/*!
+ * @brief maps the specified viewport coordinates into specified space [1]
+ * the matrix should contain projection matrix.
+ *
+ * if you don't have ( and don't want to have ) an inverse matrix then use
+ * glm_unproject version. You may use existing inverse of matrix in somewhere
+ * else, this is why glm_unprojecti exists to save save inversion cost
+ *
+ * [1] space:
+ * 1- if m = invProj: View Space
+ * 2- if m = invViewProj: World Space
+ * 3- if m = invMVP: Object Space
+ *
+ * You probably want to map the coordinates into object space
+ * so use invMVP as m
+ *
+ * Computing viewProj:
+ * glm_mat4_mul(proj, view, viewProj);
+ * glm_mat4_mul(viewProj, model, MVP);
+ * glm_mat4_inv(viewProj, invMVP);
+ *
+ * @param[in] pos point/position in viewport coordinates
+ * @param[in] invMat matrix (see brief)
+ * @param[in] vp viewport as [x, y, width, height]
+ * @param[out] dest unprojected coordinates
+ */
+CGLM_INLINE
+void
+glm_unprojecti_zo(vec3 pos, mat4 invMat, vec4 vp, vec3 dest) {
+ vec4 v;
+
+ v[0] = 2.0f * (pos[0] - vp[0]) / vp[2] - 1.0f;
+ v[1] = 2.0f * (pos[1] - vp[1]) / vp[3] - 1.0f;
+ v[2] = pos[2];
+ v[3] = 1.0f;
+
+ glm_mat4_mulv(invMat, v, v);
+ glm_vec4_scale(v, 1.0f / v[3], v);
+ glm_vec3(v, dest);
+}
+
+/*!
+ * @brief map object coordinates to window coordinates
+ *
+ * Computing MVP:
+ * glm_mat4_mul(proj, view, viewProj);
+ * glm_mat4_mul(viewProj, model, MVP);
+ *
+ * @param[in] pos object coordinates
+ * @param[in] m MVP matrix
+ * @param[in] vp viewport as [x, y, width, height]
+ * @param[out] dest projected coordinates
+ */
+CGLM_INLINE
+void
+glm_project_zo(vec3 pos, mat4 m, vec4 vp, vec3 dest) {
+ CGLM_ALIGN(16) vec4 pos4;
+
+ glm_vec4(pos, 1.0f, pos4);
+
+ glm_mat4_mulv(m, pos4, pos4);
+ glm_vec4_scale(pos4, 1.0f / pos4[3], pos4); /* pos = pos / pos.w */
+
+ dest[2] = pos4[2];
+
+ glm_vec4_scale(pos4, 0.5f, pos4);
+ glm_vec4_adds(pos4, 0.5f, pos4);
+
+ dest[0] = pos4[0] * vp[2] + vp[0];
+ dest[1] = pos4[1] * vp[3] + vp[1];
+}
+
+/*!
+ * @brief map object's z coordinate to window coordinates
+ *
+ * Computing MVP:
+ * glm_mat4_mul(proj, view, viewProj);
+ * glm_mat4_mul(viewProj, model, MVP);
+ *
+ * @param[in] v object coordinates
+ * @param[in] m MVP matrix
+ *
+ * @returns projected z coordinate
+ */
+CGLM_INLINE
+float
+glm_project_z_zo(vec3 v, mat4 m) {
+ float z, w;
+
+ z = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2];
+ w = m[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] + m[3][3];
+
+ return z / w;
+}
+
+#endif /* cglm_project_zo_h */
diff --git a/include/cglm/clipspace/view_lh.h b/include/cglm/clipspace/view_lh.h
new file mode 100644
index 0000000..5667694
--- /dev/null
+++ b/include/cglm/clipspace/view_lh.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+/*
+ Functions:
+ CGLM_INLINE void glm_lookat_lh(vec3 eye, vec3 center, vec3 up, mat4 dest)
+ CGLM_INLINE void glm_look_lh(vec3 eye, vec3 dir, vec3 up, mat4 dest)
+ CGLM_INLINE void glm_look_anyup_lh(vec3 eye, vec3 dir, mat4 dest)
+ */
+
+#ifndef cglm_view_lh_h
+#define cglm_view_lh_h
+
+#include "../common.h"
+#include "../plane.h"
+
+/*!
+ * @brief set up view matrix (LH)
+ *
+ * NOTE: The UP vector must not be parallel to the line of sight from
+ * the eye point to the reference point
+ *
+ * @param[in] eye eye vector
+ * @param[in] center center vector
+ * @param[in] up up vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_lookat_lh(vec3 eye, vec3 center, vec3 up, mat4 dest) {
+ CGLM_ALIGN(8) vec3 f, u, s;
+
+ glm_vec3_sub(center, eye, f);
+ glm_vec3_normalize(f);
+
+ glm_vec3_crossn(up, f, s);
+ glm_vec3_cross(f, s, u);
+
+ dest[0][0] = s[0];
+ dest[0][1] = u[0];
+ dest[0][2] = f[0];
+ dest[1][0] = s[1];
+ dest[1][1] = u[1];
+ dest[1][2] = f[1];
+ dest[2][0] = s[2];
+ dest[2][1] = u[2];
+ dest[2][2] = f[2];
+ dest[3][0] =-glm_vec3_dot(s, eye);
+ dest[3][1] =-glm_vec3_dot(u, eye);
+ dest[3][2] =-glm_vec3_dot(f, eye);
+ dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
+ dest[3][3] = 1.0f;
+}
+
+/*!
+ * @brief set up view matrix with left handed coordinate system
+ *
+ * convenient wrapper for lookat: if you only have direction not target self
+ * then this might be useful. Because you need to get target from direction.
+ *
+ * NOTE: The UP vector must not be parallel to the line of sight from
+ * the eye point to the reference point
+ *
+ * @param[in] eye eye vector
+ * @param[in] dir direction vector
+ * @param[in] up up vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_look_lh(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
+ CGLM_ALIGN(8) vec3 target;
+ glm_vec3_add(eye, dir, target);
+ glm_lookat_lh(eye, target, up, dest);
+}
+
+/*!
+ * @brief set up view matrix with left handed coordinate system
+ *
+ * convenient wrapper for look: if you only have direction and if you don't
+ * care what UP vector is then this might be useful to create view matrix
+ *
+ * @param[in] eye eye vector
+ * @param[in] dir direction vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_look_anyup_lh(vec3 eye, vec3 dir, mat4 dest) {
+ CGLM_ALIGN(8) vec3 up;
+ glm_vec3_ortho(dir, up);
+ glm_look_lh(eye, dir, up, dest);
+}
+
+#endif /*cglm_view_lh_h*/
diff --git a/include/cglm/clipspace/view_lh_no.h b/include/cglm/clipspace/view_lh_no.h
new file mode 100644
index 0000000..454d903
--- /dev/null
+++ b/include/cglm/clipspace/view_lh_no.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+/*
+ Functions:
+ CGLM_INLINE void glm_lookat_lh_no(vec3 eye, vec3 center, vec3 up, mat4 dest)
+ CGLM_INLINE void glm_look_lh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest)
+ CGLM_INLINE void glm_look_anyup_lh_no(vec3 eye, vec3 dir, mat4 dest)
+ */
+
+#ifndef cglm_view_lh_no_h
+#define cglm_view_lh_no_h
+
+#include "../common.h"
+#include "view_lh.h"
+
+/*!
+ * @brief set up view matrix with left handed coordinate system.
+ *
+ * NOTE: The UP vector must not be parallel to the line of sight from
+ * the eye point to the reference point
+ *
+ * @param[in] eye eye vector
+ * @param[in] center center vector
+ * @param[in] up up vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_lookat_lh_no(vec3 eye, vec3 center, vec3 up, mat4 dest) {
+ glm_lookat_lh(eye, center, up, dest);
+}
+
+/*!
+ * @brief set up view matrix with left handed coordinate system.
+ *
+ * convenient wrapper for lookat: if you only have direction not target self
+ * then this might be useful. Because you need to get target from direction.
+ *
+ * NOTE: The UP vector must not be parallel to the line of sight from
+ * the eye point to the reference point
+ *
+ * @param[in] eye eye vector
+ * @param[in] dir direction vector
+ * @param[in] up up vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_look_lh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
+ glm_look_lh(eye, dir, up, dest);
+}
+
+/*!
+ * @brief set up view matrix with left handed coordinate system.
+ *
+ * convenient wrapper for look: if you only have direction and if you don't
+ * care what UP vector is then this might be useful to create view matrix
+ *
+ * @param[in] eye eye vector
+ * @param[in] dir direction vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_look_anyup_lh_no(vec3 eye, vec3 dir, mat4 dest) {
+ glm_look_anyup_lh(eye, dir, dest);
+}
+
+#endif /*cglm_view_lh_no_h*/
diff --git a/include/cglm/clipspace/view_lh_zo.h b/include/cglm/clipspace/view_lh_zo.h
new file mode 100644
index 0000000..6b0c4d1
--- /dev/null
+++ b/include/cglm/clipspace/view_lh_zo.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+/*
+ Functions:
+ CGLM_INLINE void glm_lookat_lh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest)
+ CGLM_INLINE void glm_look_lh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest)
+ CGLM_INLINE void glm_look_anyup_lh_zo(vec3 eye, vec3 dir, mat4 dest)
+ */
+
+#ifndef cglm_view_lh_zo_h
+#define cglm_view_lh_zo_h
+
+#include "../common.h"
+#include "view_lh.h"
+
+/*!
+ * @brief set up view matrix with left handed coordinate system.
+ *
+ * NOTE: The UP vector must not be parallel to the line of sight from
+ * the eye point to the reference point
+ *
+ * @param[in] eye eye vector
+ * @param[in] center center vector
+ * @param[in] up up vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_lookat_lh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest) {
+ glm_lookat_lh(eye, center, up, dest);
+}
+
+/*!
+ * @brief set up view matrix with left handed coordinate system.
+ *
+ * convenient wrapper for lookat: if you only have direction not target self
+ * then this might be useful. Because you need to get target from direction.
+ *
+ * NOTE: The UP vector must not be parallel to the line of sight from
+ * the eye point to the reference point
+ *
+ * @param[in] eye eye vector
+ * @param[in] dir direction vector
+ * @param[in] up up vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_look_lh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
+ glm_look_lh(eye, dir, up, dest);
+}
+
+/*!
+ * @brief set up view matrix with left handed coordinate system.
+ *
+ * convenient wrapper for look: if you only have direction and if you don't
+ * care what UP vector is then this might be useful to create view matrix
+ *
+ * @param[in] eye eye vector
+ * @param[in] dir direction vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_look_anyup_lh_zo(vec3 eye, vec3 dir, mat4 dest) {
+ glm_look_anyup_lh(eye, dir, dest);
+}
+
+#endif /*cglm_view_lh_zo_h*/
diff --git a/include/cglm/clipspace/view_rh.h b/include/cglm/clipspace/view_rh.h
new file mode 100644
index 0000000..51ec916
--- /dev/null
+++ b/include/cglm/clipspace/view_rh.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+/*
+ Functions:
+ CGLM_INLINE void glm_lookat_rh(vec3 eye, vec3 center, vec3 up, mat4 dest)
+ CGLM_INLINE void glm_look_rh(vec3 eye, vec3 dir, vec3 up, mat4 dest)
+ CGLM_INLINE void glm_look_anyup_rh(vec3 eye, vec3 dir, mat4 dest)
+ */
+
+#ifndef cglm_view_rh_h
+#define cglm_view_rh_h
+
+#include "../common.h"
+#include "../plane.h"
+
+/*!
+ * @brief set up view matrix with right handed coordinate system.
+ *
+ * NOTE: The UP vector must not be parallel to the line of sight from
+ * the eye point to the reference point
+ *
+ * @param[in] eye eye vector
+ * @param[in] center center vector
+ * @param[in] up up vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_lookat_rh(vec3 eye, vec3 center, vec3 up, mat4 dest) {
+ CGLM_ALIGN(8) vec3 f, u, s;
+
+ glm_vec3_sub(center, eye, f);
+ glm_vec3_normalize(f);
+
+ glm_vec3_crossn(f, up, s);
+ glm_vec3_cross(s, f, u);
+
+ dest[0][0] = s[0];
+ dest[0][1] = u[0];
+ dest[0][2] =-f[0];
+ dest[1][0] = s[1];
+ dest[1][1] = u[1];
+ dest[1][2] =-f[1];
+ dest[2][0] = s[2];
+ dest[2][1] = u[2];
+ dest[2][2] =-f[2];
+ dest[3][0] =-glm_vec3_dot(s, eye);
+ dest[3][1] =-glm_vec3_dot(u, eye);
+ dest[3][2] = glm_vec3_dot(f, eye);
+ dest[0][3] = dest[1][3] = dest[2][3] = 0.0f;
+ dest[3][3] = 1.0f;
+}
+
+/*!
+ * @brief set up view matrix with right handed coordinate system.
+ *
+ * convenient wrapper for lookat: if you only have direction not target self
+ * then this might be useful. Because you need to get target from direction.
+ *
+ * NOTE: The UP vector must not be parallel to the line of sight from
+ * the eye point to the reference point
+ *
+ * @param[in] eye eye vector
+ * @param[in] dir direction vector
+ * @param[in] up up vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_look_rh(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
+ CGLM_ALIGN(8) vec3 target;
+ glm_vec3_add(eye, dir, target);
+ glm_lookat_rh(eye, target, up, dest);
+}
+
+/*!
+ * @brief set up view matrix with right handed coordinate system.
+ *
+ * convenient wrapper for look: if you only have direction and if you don't
+ * care what UP vector is then this might be useful to create view matrix
+ *
+ * @param[in] eye eye vector
+ * @param[in] dir direction vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_look_anyup_rh(vec3 eye, vec3 dir, mat4 dest) {
+ CGLM_ALIGN(8) vec3 up;
+ glm_vec3_ortho(dir, up);
+ glm_look_rh(eye, dir, up, dest);
+}
+
+#endif /*cglm_view_rh_h*/
diff --git a/include/cglm/clipspace/view_rh_no.h b/include/cglm/clipspace/view_rh_no.h
new file mode 100644
index 0000000..ca36d30
--- /dev/null
+++ b/include/cglm/clipspace/view_rh_no.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+/*
+ Functions:
+ CGLM_INLINE void glm_lookat_rh_no(vec3 eye, vec3 center, vec3 up, mat4 dest)
+ CGLM_INLINE void glm_look_rh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest)
+ CGLM_INLINE void glm_look_anyup_rh_no(vec3 eye, vec3 dir, mat4 dest)
+ */
+
+#ifndef cglm_view_rh_no_h
+#define cglm_view_rh_no_h
+
+#include "../common.h"
+#include "view_rh.h"
+
+/*!
+ * @brief set up view matrix with right handed coordinate system.
+ *
+ * NOTE: The UP vector must not be parallel to the line of sight from
+ * the eye point to the reference point
+ *
+ * @param[in] eye eye vector
+ * @param[in] center center vector
+ * @param[in] up up vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_lookat_rh_no(vec3 eye, vec3 center, vec3 up, mat4 dest) {
+ glm_lookat_rh(eye, center, up, dest);
+}
+
+/*!
+ * @brief set up view matrix with right handed coordinate system.
+ *
+ * convenient wrapper for lookat: if you only have direction not target self
+ * then this might be useful. Because you need to get target from direction.
+ *
+ * NOTE: The UP vector must not be parallel to the line of sight from
+ * the eye point to the reference point
+ *
+ * @param[in] eye eye vector
+ * @param[in] dir direction vector
+ * @param[in] up up vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_look_rh_no(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
+ glm_look_rh(eye, dir, up, dest);
+}
+
+/*!
+ * @brief set up view matrix with right handed coordinate system.
+ *
+ * convenient wrapper for look: if you only have direction and if you don't
+ * care what UP vector is then this might be useful to create view matrix
+ *
+ * @param[in] eye eye vector
+ * @param[in] dir direction vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_look_anyup_rh_no(vec3 eye, vec3 dir, mat4 dest) {
+ glm_look_anyup_rh(eye, dir, dest);
+}
+
+#endif /*cglm_view_rh_no_h*/
diff --git a/include/cglm/clipspace/view_rh_zo.h b/include/cglm/clipspace/view_rh_zo.h
new file mode 100644
index 0000000..1ad5c91
--- /dev/null
+++ b/include/cglm/clipspace/view_rh_zo.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+/*
+ Functions:
+ CGLM_INLINE void glm_lookat_rh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest)
+ CGLM_INLINE void glm_look_rh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest)
+ CGLM_INLINE void glm_look_anyup_rh_zo(vec3 eye, vec3 dir, mat4 dest)
+ */
+
+#ifndef cglm_view_rh_zo_h
+#define cglm_view_rh_zo_h
+
+#include "../common.h"
+#include "view_rh.h"
+
+/*!
+ * @brief set up view matrix with right handed coordinate system.
+ *
+ * NOTE: The UP vector must not be parallel to the line of sight from
+ * the eye point to the reference point
+ *
+ * @param[in] eye eye vector
+ * @param[in] center center vector
+ * @param[in] up up vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_lookat_rh_zo(vec3 eye, vec3 center, vec3 up, mat4 dest) {
+ glm_lookat_rh(eye, center, up, dest);
+}
+
+/*!
+ * @brief set up view matrix with right handed coordinate system.
+ *
+ * convenient wrapper for lookat: if you only have direction not target self
+ * then this might be useful. Because you need to get target from direction.
+ *
+ * NOTE: The UP vector must not be parallel to the line of sight from
+ * the eye point to the reference point
+ *
+ * @param[in] eye eye vector
+ * @param[in] dir direction vector
+ * @param[in] up up vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_look_rh_zo(vec3 eye, vec3 dir, vec3 up, mat4 dest) {
+ glm_look_rh(eye, dir, up, dest);
+}
+
+/*!
+ * @brief set up view matrix with right handed coordinate system.
+ *
+ * convenient wrapper for look: if you only have direction and if you don't
+ * care what UP vector is then this might be useful to create view matrix
+ *
+ * @param[in] eye eye vector
+ * @param[in] dir direction vector
+ * @param[out] dest result matrix
+ */
+CGLM_INLINE
+void
+glm_look_anyup_rh_zo(vec3 eye, vec3 dir, mat4 dest) {
+ glm_look_anyup_rh(eye, dir, dest);
+}
+
+#endif /*cglm_view_rh_zo_h*/