commit 1a45b6bbc6dbfefbbf4128122ecba7799f051521
parent 5c03707bbd5464e29fa8d9804ad5f2b585938f9d
Author: Brian Swetland <swetland@frotz.net>
Date: Wed, 4 Sep 2013 00:20:32 -0700
matrix: tidy things a bit, add vec[34].{length,dot}()
Diffstat:
M | common/matrix.h | | | 88 | +++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------- |
1 file changed, 57 insertions(+), 31 deletions(-)
diff --git a/common/matrix.h b/common/matrix.h
@@ -16,6 +16,7 @@
#ifndef _MATRIX_MATH_H_
#define _MATRIX_MATH_H_
+#include <math.h>
#include <string.h>
#define D2R(d) (((d) * M_PI) / 180.0)
@@ -39,34 +40,40 @@ void __mat4_set_ortho(float m[16], float left, float right,
class mat4;
class vec4 {
- float v[4];
+ union {
+ float v[4];
+ struct {
+ float x, y, z, w;
+ };
+ };
public:
vec4() { };
- vec4(const vec4 &x) {
- v[0] = x[0]; v[1] = x[1]; v[2] = x[2]; v[3] = x[3];
+ vec4(const vec4 &v) {
+ x = v.x; y = v.y; z = v.z; w = v.z;
};
vec4(const float *raw) {
memcpy(v, raw, sizeof(float[4]));
}
vec4(float a, float b, float c, float d) {
- v[0] = a; v[1] = b; v[2] = c; v[3] = d;
+ x = a; y = b; z = c; w = d;
};
- vec4(float x, float y, float z) {
- v[0] = x; v[1] = y; v[2] = z; v[3] = 1.0;
+ vec4(float a, float b, float c) {
+ x = a; y = b; z = c; w = 1.0f;
};
-
- void set(float a, float b, float c, float d) {
- v[0] = a; v[1] = b; v[2] = c; v[3] = d;
+ vec4& set(float a, float b, float c, float d) {
+ x = a; y = b; z = c; w = d;
+ return *this;
}
- void set(float a, float b, float c) {
- v[0] = a; v[1] = b; v[2] = c; v[3] = 1.0;
+ vec4& set(float a, float b, float c) {
+ x = a; y = b; z = c; w = 1.0f;
+ return *this;
}
/* raw accessor suitable for glSomething4fv() */
operator const float*() { return v; };
vec4& operator*=(float n) {
- v[0]*=n; v[1]*=n; v[2]*=n; v[3]*=n;
+ x *= n; y *= n; z *= n; w *= n;
return *this;
}
@@ -82,43 +89,55 @@ public:
friend vec4 operator-(const vec4& a, const vec4& b);
friend vec4 operator*(const mat4& a, const vec4& b);
+
+ float length(void) {
+ return sqrtf(x*x + y*y + z*z + w*w);
+ }
+ float dot(const vec4& v) {
+ return x*v.x + y*v.y + z*v.z + w*v.w;
+ }
};
-inline vec4 operator*(const vec4& a, const float n) {
- return vec4(a.v[0]*n,a.v[1]*n,a.v[2]*n,a.v[3]*n);
+inline vec4 operator*(const vec4& v, const float n) {
+ return vec4(v.x * n, v.y * n, v.z * n, v.w * n);
}
-inline vec4 operator/(const vec4& a, const float n) {
- return vec4(a.v[0]/n,a.v[1]/n,a.v[2]/n,a.v[3]/n);
+inline vec4 operator/(const vec4& v, const float n) {
+ return vec4(v.x / n, v.y / n, v.z / n, v.w / n);
}
inline vec4 operator+(const vec4& a, const vec4& b) {
- return vec4(a[0]+b[0],a[1]+b[1],a[2]+b[2],a[3]+b[3]);
+ return vec4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
}
inline vec4 operator-(const vec4& a, const vec4& b) {
- return vec4(a[0]-b[0],a[1]-b[1],a[2]-b[2],a[3]-b[3]);
+ return vec4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w);
}
class vec3 {
- float v[3];
+ union {
+ float v[3];
+ struct {
+ float x, y, z;
+ };
+ };
public:
vec3() { };
- vec3(const vec3 &x) {
- v[0] = x[0]; v[1] = x[1]; v[2] = x[2];
+ vec3(const vec3 &v) {
+ x = v.x; y = v.y; z = v.z;
};
vec3(const float *raw) {
- memcpy(v, raw, sizeof(float[4]));
+ memcpy(v, raw, sizeof(float[3]));
}
vec3(float a, float b, float c) {
- v[0] = a; v[1] = b; v[2] = c;
+ x = a; y = b; z = c;
};
void set(float a, float b, float c) {
- v[0] = a; v[1] = b; v[2] = c;
+ x = a; y = b; z = c;
}
/* raw accessor suitable for glSomething4fv() */
operator const float*() { return v; };
vec3& operator*=(float n) {
- v[0]*=n; v[1]*=n; v[2]*=n;
+ x *= n; y *= n; z *= n;
return *this;
}
@@ -132,19 +151,26 @@ public:
friend vec3 operator/(const vec3& a, const float b);
friend vec3 operator+(const vec3& a, const vec3& b);
friend vec3 operator-(const vec3& a, const vec3& b);
+
+ float length(void) {
+ return sqrtf(x*x + y*y + z*z);
+ }
+ float dot(const vec4& v) {
+ return x*v.x + y*v.y + z*v.z;
+ }
};
-inline vec3 operator*(const vec3& a, const float n) {
- return vec3(a.v[0]*n,a.v[1]*n,a.v[2]*n);
+inline vec3 operator*(const vec3& v, const float n) {
+ return vec3(v.x * n, v.y * n, v.z * n);
}
-inline vec3 operator/(const vec3& a, const float n) {
- return vec3(a.v[0]/n,a.v[1]/n,a.v[2]/n);
+inline vec3 operator/(const vec3& v, const float n) {
+ return vec3(v.x / n, v.y / n, v.z / n);
}
inline vec3 operator+(const vec3& a, const vec3& b) {
- return vec3(a[0]+b[0],a[1]+b[1],a[2]+b[2]);
+ return vec3(a.x + b.x, a.y + b.y, a.z + b.z);
}
inline vec3 operator-(const vec3& a, const vec3& b) {
- return vec3(a[0]-b[0],a[1]-b[1],a[2]-b[2]);
+ return vec3(a.x - b.x, a.y - b.y, a.z - b.z);
}