commit cd82c62716831100266a005836323ce0838b52b8
parent 1a45b6bbc6dbfefbbf4128122ecba7799f051521
Author: Brian Swetland <swetland@frotz.net>
Date: Wed, 4 Sep 2013 03:43:14 -0700
matrix: more stuff
Diffstat:
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) {