frustum, ortho and perspective functions

This commit is contained in:
Recep Aslantas
2016-09-17 19:04:53 +03:00
parent 146dbe4656
commit 5a28f2ec60
2 changed files with 77 additions and 6 deletions

View File

@@ -5,10 +5,79 @@
* Full license can be found in the LICENSE file
*/
/*
TODO: GLdouble vs float ?
*/
#ifndef glm_vcam_h
#define glm_vcam_h
#include "cglm.h"
#include <math.h>
CGLM_INLINE
void
glm_frustum(float left,
float right,
float bottom,
float top,
float near,
float far,
mat4 dest) {
/* https://www.opengl.org/sdk/docs/man2/xhtml/glFrustum.xml */
glm__memzero(float, dest, sizeof(mat4));
dest[0][0] = 2.0f * near / (right - left);
dest[1][1] = 2.0f * near / (top - bottom);
dest[2][0] = (right + left) / (right - left);
dest[2][1] = (top + bottom) / (top - bottom);
dest[2][2] = -(far + near) / (far - near);
dest[2][3] = -1.0f;
dest[3][2] = -2.0f * far * near / (far - near);
}
CGLM_INLINE
void
glm_ortho(float left,
float right,
float bottom,
float top,
float near,
float far,
mat4 dest) {
/* https://www.opengl.org/sdk/docs/man2/xhtml/glOrtho.xml */
glm__memzero(float, dest, sizeof(mat4));
dest[0][0] = 2.0f / (right - left);
dest[1][1] = 2.0f / (top - bottom);
dest[2][2] =-2.0f / (far - near);
dest[3][0] =-(right + left) / (right - left);
dest[3][1] =-(top + bottom) / (top - bottom);
dest[3][2] =-(far + near) / (far - near);
}
CGLM_INLINE
void
glm_perspective(float fovy,
float aspect,
float near,
float far,
mat4 dest) {
/* https://www.opengl.org/sdk/docs/man2/xhtml/gluPerspective.xml */
float f;
glm__memzero(float, dest, sizeof(mat4));
f = cosf(fovy * 0.5f) / sinf(fovy * 0.5f);
dest[0][0] = f / aspect;
dest[1][1] = f;
dest[2][2] = (near + far) / (near - far);
dest[2][3] =-1.0f;
dest[3][2] = 2 * near * far / (near - far);
}
CGLM_INLINE
void

View File

@@ -32,16 +32,18 @@
*desti++ = *srci++; \
} while (0)
#define glm__memzero(dest, size) \
#define glm__memset(type, dest, size, val) \
do { \
int32_t *desti; \
int32_t *desti_end; \
type *desti; \
type *desti_end; \
\
desti = (int32_t *)dest; \
desti_end = (int32_t *)((char *)desti + size); \
desti = (type *)dest; \
desti_end = (type *)((char *)desti + size); \
\
while (desti != desti_end) \
*desti++ = 0; \
*desti++ = val; \
} while (0)
#define glm__memzero(type, dest, size) glm__memset(type, dest, size, 0)
#endif /* glm_common_h */