graphics

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit cd82c62716831100266a005836323ce0838b52b8
parent 1a45b6bbc6dbfefbbf4128122ecba7799f051521
Author: Brian Swetland <swetland@frotz.net>
Date:   Wed,  4 Sep 2013 03:43:14 -0700

matrix: more stuff

Diffstat:
Mcommon/matrix.cc | 38++++++++++++++++++++++++--------------
Mcommon/matrix.h | 23+++++++++++++++++++++--
2 files changed, 45 insertions(+), 16 deletions(-)

diff --git a/common/matrix.cc b/common/matrix.cc @@ -98,19 +98,6 @@ void __mat4_set_rotate_z(float m[16], float rad) { m[15] = 1.0; } -#if 0 -/* D3D RH Style */ -void __mat4_set_perspective(float m[16], float fov, float a, float zn, float zf) { - memset(m, 0, sizeof(float[16])); - float ys = 1.0 / tanf(fov / 2.0); - float xs = ys / a; - m[0] = xs; - m[5] = ys; - m[10] = zf / (zn - zf); - m[11] = -1.0; - m[14] = (zn * zf) / (zn - zf); -} -#else void __mat4_set_perspective(float m[16], float fov, float a, float zn, float zf) { memset(m, 0, sizeof(float[16])); float fn = 1.0f / (zf - zn); @@ -121,7 +108,6 @@ void __mat4_set_perspective(float m[16], float fov, float a, float zn, float zf) m[11] = -1.0f; m[14] = -2.0f * (zn * zf) * fn; } -#endif void __mat4_set_ortho(float m[16], float l, float r, float b, float t, float n, float f) { memset(m, 0, sizeof(float[16])); @@ -134,3 +120,27 @@ void __mat4_set_ortho(float m[16], float l, float r, float b, float t, float n, m[15] = 1.0; } +/* per gluLookAt docs */ +mat4& mat4::lookAt(const vec3& eye, const vec3& center, const vec3& up) { + vec3 f = (center - eye).normalize(); + vec3 upn = up; + vec3 s = cross(f, upn); + vec3 u = cross(s, f); + m[0] = s[0]; + m[1] = u[0]; + m[2] = -f[0]; + m[3] = 0.0f; + m[4] = s[1]; + m[5] = u[1]; + m[6] = -f[1]; + m[7] = 0.0f; + m[8] = s[2]; + m[9] = u[2]; + m[10] = -f[2]; + m[11] = 0.0f; + m[12] = 0.0f; + m[13] = 0.0f; + m[14] = 0.0f; + m[15] = 1.0f; + return *this; +} diff --git a/common/matrix.h b/common/matrix.h @@ -96,6 +96,11 @@ public: float dot(const vec4& v) { return x*v.x + y*v.y + z*v.z + w*v.w; } + vec4& normalize(void) { + float n = 1.0f / length(); + x *= n; y *= n; z *= n; w *= n; + return *this; + } }; inline vec4 operator*(const vec4& v, const float n) { @@ -158,6 +163,11 @@ public: float dot(const vec4& v) { return x*v.x + y*v.y + z*v.z; } + vec3& normalize(void) { + float n = 1.0f / length(); + x *= n; y *= n; z *= n; + return *this; + } }; inline vec3 operator*(const vec3& v, const float n) { @@ -172,7 +182,9 @@ inline vec3 operator+(const vec3& a, const vec3& b) { inline vec3 operator-(const vec3& a, const vec3& b) { return vec3(a.x - b.x, a.y - b.y, a.z - b.z); } - +inline vec3 cross(const vec3& p, const vec3& q) { + return vec3(p.y*q.z-p.z*q.y, p.z*q.x-p.x*q.z, p.x*q.y-p.y*q.x); +} class mat4 { float m[16]; @@ -244,7 +256,14 @@ public: __mat4_set_perspective(m, fov, aspect, znear, zfar); return *this; }; - + mat4& lookAt(const vec3& eye, const vec3& center, const vec3& up); + mat4& camera(const vec3& eye, const vec3& center, const vec3& up) { + lookAt(eye, center, up); + m[12] = -eye.x; + m[13] = -eye.y; + m[14] = -eye.z; + return *this; + } friend vec4 operator*(const mat4& a, const vec4& b); mat4& mul(mat4& left, mat4& right) {