mirror of
https://github.com/recp/cglm.git
synced 2025-10-04 09:08:53 +00:00
frustum, ortho and perspective functions
This commit is contained in:
@@ -5,10 +5,79 @@
|
|||||||
* Full license can be found in the LICENSE file
|
* Full license can be found in the LICENSE file
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
TODO: GLdouble vs float ?
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef glm_vcam_h
|
#ifndef glm_vcam_h
|
||||||
#define glm_vcam_h
|
#define glm_vcam_h
|
||||||
|
|
||||||
#include "cglm.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
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
|
@@ -32,16 +32,18 @@
|
|||||||
*desti++ = *srci++; \
|
*desti++ = *srci++; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define glm__memzero(dest, size) \
|
#define glm__memset(type, dest, size, val) \
|
||||||
do { \
|
do { \
|
||||||
int32_t *desti; \
|
type *desti; \
|
||||||
int32_t *desti_end; \
|
type *desti_end; \
|
||||||
\
|
\
|
||||||
desti = (int32_t *)dest; \
|
desti = (type *)dest; \
|
||||||
desti_end = (int32_t *)((char *)desti + size); \
|
desti_end = (type *)((char *)desti + size); \
|
||||||
\
|
\
|
||||||
while (desti != desti_end) \
|
while (desti != desti_end) \
|
||||||
*desti++ = 0; \
|
*desti++ = val; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define glm__memzero(type, dest, size) glm__memset(type, dest, size, 0)
|
||||||
|
|
||||||
#endif /* glm_common_h */
|
#endif /* glm_common_h */
|
||||||
|
Reference in New Issue
Block a user