first commit
This commit is contained in:
		
							
								
								
									
										183
									
								
								include/cglm/clipspace/ortho_lh_no.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								include/cglm/clipspace/ortho_lh_no.h
									
									
									
									
									
										Normal file
									
								
							@@ -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*/
 | 
			
		||||
							
								
								
									
										177
									
								
								include/cglm/clipspace/ortho_lh_zo.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								include/cglm/clipspace/ortho_lh_zo.h
									
									
									
									
									
										Normal file
									
								
							@@ -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*/
 | 
			
		||||
							
								
								
									
										183
									
								
								include/cglm/clipspace/ortho_rh_no.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								include/cglm/clipspace/ortho_rh_no.h
									
									
									
									
									
										Normal file
									
								
							@@ -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*/
 | 
			
		||||
							
								
								
									
										181
									
								
								include/cglm/clipspace/ortho_rh_zo.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										181
									
								
								include/cglm/clipspace/ortho_rh_zo.h
									
									
									
									
									
										Normal file
									
								
							@@ -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*/
 | 
			
		||||
							
								
								
									
										48
									
								
								include/cglm/clipspace/persp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								include/cglm/clipspace/persp.h
									
									
									
									
									
										Normal file
									
								
							@@ -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 */
 | 
			
		||||
							
								
								
									
										395
									
								
								include/cglm/clipspace/persp_lh_no.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										395
									
								
								include/cglm/clipspace/persp_lh_no.h
									
									
									
									
									
										Normal file
									
								
							@@ -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 / botom 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*/
 | 
			
		||||
							
								
								
									
										387
									
								
								include/cglm/clipspace/persp_lh_zo.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										387
									
								
								include/cglm/clipspace/persp_lh_zo.h
									
									
									
									
									
										Normal file
									
								
							@@ -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*/
 | 
			
		||||
							
								
								
									
										395
									
								
								include/cglm/clipspace/persp_rh_no.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										395
									
								
								include/cglm/clipspace/persp_rh_no.h
									
									
									
									
									
										Normal file
									
								
							@@ -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 / botom 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*/
 | 
			
		||||
							
								
								
									
										389
									
								
								include/cglm/clipspace/persp_rh_zo.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										389
									
								
								include/cglm/clipspace/persp_rh_zo.h
									
									
									
									
									
										Normal file
									
								
							@@ -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*/
 | 
			
		||||
							
								
								
									
										109
									
								
								include/cglm/clipspace/project_no.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								include/cglm/clipspace/project_no.h
									
									
									
									
									
										Normal file
									
								
							@@ -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 */
 | 
			
		||||
							
								
								
									
										111
									
								
								include/cglm/clipspace/project_zo.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								include/cglm/clipspace/project_zo.h
									
									
									
									
									
										Normal file
									
								
							@@ -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 */
 | 
			
		||||
							
								
								
									
										99
									
								
								include/cglm/clipspace/view_lh.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								include/cglm/clipspace/view_lh.h
									
									
									
									
									
										Normal file
									
								
							@@ -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*/
 | 
			
		||||
							
								
								
									
										74
									
								
								include/cglm/clipspace/view_lh_no.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								include/cglm/clipspace/view_lh_no.h
									
									
									
									
									
										Normal file
									
								
							@@ -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*/
 | 
			
		||||
							
								
								
									
										74
									
								
								include/cglm/clipspace/view_lh_zo.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								include/cglm/clipspace/view_lh_zo.h
									
									
									
									
									
										Normal file
									
								
							@@ -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*/
 | 
			
		||||
							
								
								
									
										99
									
								
								include/cglm/clipspace/view_rh.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								include/cglm/clipspace/view_rh.h
									
									
									
									
									
										Normal file
									
								
							@@ -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*/
 | 
			
		||||
							
								
								
									
										74
									
								
								include/cglm/clipspace/view_rh_no.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								include/cglm/clipspace/view_rh_no.h
									
									
									
									
									
										Normal file
									
								
							@@ -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*/
 | 
			
		||||
							
								
								
									
										74
									
								
								include/cglm/clipspace/view_rh_zo.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								include/cglm/clipspace/view_rh_zo.h
									
									
									
									
									
										Normal file
									
								
							@@ -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*/
 | 
			
		||||
		Reference in New Issue
	
	Block a user