From 6635fdd7c1e612ebc858f4c275dd9986b6cd441d Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Sun, 11 Sep 2016 23:11:24 +0300 Subject: [PATCH] lookat --- include/cglm-cam.h | 47 ++++++++++++++++++++++++++++++++++++++++++++++ include/cglm-vec.h | 25 ++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 include/cglm-cam.h diff --git a/include/cglm-cam.h b/include/cglm-cam.h new file mode 100644 index 0000000..58403cd --- /dev/null +++ b/include/cglm-cam.h @@ -0,0 +1,47 @@ +/* + * Copyright (c), Recep Aslantas. + * + * MIT License (MIT), http://opensource.org/licenses/MIT + * Full license can be found in the LICENSE file + */ + +#ifndef glm_vcam_h +#define glm_vcam_h + +#include "cglm.h" + +CGLM_INLINE +void +glm_lookat(vec3 eye, + vec3 center, + vec3 up, + mat4 dest) { + vec3 f, u, s; + + glm_vec_sub3(center, eye, f); + glm_vec_normalize_self(f); + + glm_vec_cross(f, up, s); + glm_vec_normalize_self(s); + + glm_vec_cross(s, f, u); + + dest[0][0] = s[0]; + dest[1][0] = s[1]; + dest[2][0] = s[2]; + dest[0][1] = u[0]; + dest[1][1] = u[1]; + dest[2][1] = u[2]; + dest[0][2] =-f[0]; + dest[1][2] =-f[1]; + dest[2][2] =-f[2]; + dest[3][0] =-glm_vec_dot(s, eye); + dest[3][1] =-glm_vec_dot(u, eye); + dest[3][2] = glm_vec_dot(f, eye); + dest[0][3] = 0; + dest[1][3] = 0; + dest[2][3] = 0; + dest[3][3] = 1; +} + +#endif /* glm_vcam_h */ diff --git a/include/cglm-vec.h b/include/cglm-vec.h index 38e68f3..2d79361 100644 --- a/include/cglm-vec.h +++ b/include/cglm-vec.h @@ -54,4 +54,29 @@ glm_vec_normalize(vec3 vec, vec3 dest) { dest[2] = vec[2] / norm; } +CGLM_INLINE +void +glm_vec_normalize_self(vec3 v) { + float norm; + + norm = glm_vec_norm(v); + + if (norm == 0.0f) { + v[0] = v[1] = v[2] = 0.0f; + return; + } + + v[0] = v[0] / norm; + v[1] = v[1] / norm; + v[2] = v[2] / norm; +} + +CGLM_INLINE +void +glm_vec_sub3(vec3 v1, vec3 v2, vec3 dest) { + dest[0] = v1[0] - v2[0]; + dest[1] = v1[1] - v2[1]; + dest[2] = v1[2] - v2[2]; +} + #endif /* cglm_vec_h */