nuclear@0: #ifndef VMATH_H_ nuclear@0: #define VMATH_H_ nuclear@0: nuclear@0: #include nuclear@0: #include "vmathmat.h" nuclear@0: nuclear@0: class Vector3 { nuclear@0: public: nuclear@0: float x, y, z; nuclear@0: nuclear@0: Vector3() : x(0), y(0), z(0) {} nuclear@0: Vector3(float xx, float yy, float zz) : x(xx), y(yy), z(zz) {} nuclear@0: nuclear@0: float length_sq() const { return x * x + y * y + z * z; } nuclear@0: float length() const { return sqrt(x * x + y * y + z * z); } nuclear@0: nuclear@0: void normalize() nuclear@0: { nuclear@0: float len = length(); nuclear@0: if(len != 0.0) { nuclear@0: x /= len; nuclear@0: y /= len; nuclear@0: z /= len; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: float &operator [](int idx) { return idx == 2 ? z : (idx == 1 ? y : x); } nuclear@0: const float &operator [](int idx) const { return idx == 2 ? z : (idx == 1 ? y : x); } nuclear@0: }; nuclear@0: nuclear@0: inline Vector3 normalize(const Vector3 &v) nuclear@0: { nuclear@0: float len = v.length(); nuclear@0: if(len != 0.0) { nuclear@0: return Vector3(v.x / len, v.y / len, v.z / len); nuclear@0: } nuclear@0: return v; nuclear@0: } nuclear@0: nuclear@0: inline Vector3 operator +(const Vector3 &a, const Vector3 &b) nuclear@0: { nuclear@0: return Vector3(a.x + b.x, a.y + b.y, a.z + b.z); nuclear@0: } nuclear@0: nuclear@0: inline Vector3 operator -(const Vector3 &a, const Vector3 &b) nuclear@0: { nuclear@0: return Vector3(a.x - b.x, a.y - b.y, a.z - b.z); nuclear@0: } nuclear@0: nuclear@0: inline Vector3 operator *(const Vector3 &v, float s) nuclear@0: { nuclear@0: return Vector3(v.x * s, v.y * s, v.z * s); nuclear@0: } nuclear@0: nuclear@0: inline Vector3 operator /(const Vector3 &v, float s) nuclear@0: { nuclear@0: return Vector3(v.x / s, v.y / s, v.z / s); nuclear@0: } nuclear@0: nuclear@0: inline float dot(const Vector3 &a, const Vector3 &b) nuclear@0: { nuclear@0: return a.x * b.x + a.y * b.y + a.z * b.z; nuclear@0: } nuclear@0: nuclear@0: inline Vector3 cross(const Vector3 &a, const Vector3 &b) nuclear@0: { nuclear@0: return Vector3(a.y * b.z - a.z * b.y, nuclear@0: a.z * b.z - a.x * b.z, nuclear@0: a.x * b.y - a.y * b.x); nuclear@0: } nuclear@0: nuclear@0: inline Vector3 transform(const Matrix4x4 &m, const Vector3 &v) nuclear@0: { nuclear@0: float x = m.m[0][0] * v.x + m.m[0][1] * v.y + m.m[0][2] * v.z + m.m[0][3]; nuclear@0: float y = m.m[1][0] * v.x + m.m[1][1] * v.y + m.m[1][2] * v.z + m.m[1][3]; nuclear@0: float z = m.m[2][0] * v.x + m.m[2][1] * v.y + m.m[2][2] * v.z + m.m[2][3]; nuclear@0: return Vector3(x, y, z); nuclear@0: } nuclear@0: nuclear@0: // ---- Vector4 ---- nuclear@0: nuclear@0: class Vector4 { nuclear@0: public: nuclear@0: float x, y, z, w; nuclear@0: nuclear@0: Vector4() : x(0), y(0), z(0), w(1.0) {} nuclear@0: Vector4(const Vector3 &v) : x(v.x), y(v.y), z(v.z), w(1.0) {} nuclear@0: Vector4(float xx, float yy, float zz, float ww) : x(xx), y(yy), z(zz), w(ww) {} nuclear@0: nuclear@0: float length_sq() const { return x * x + y * y + z * z + w * w; } nuclear@0: float length() const { return sqrt(x * x + y * y + z * z + w * w); } nuclear@0: nuclear@0: void normalize() nuclear@0: { nuclear@0: float len = length(); nuclear@0: if(len != 0.0) { nuclear@0: x /= len; nuclear@0: y /= len; nuclear@0: z /= len; nuclear@0: w /= len; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: float &operator [](int idx) nuclear@0: { nuclear@0: return idx == 3 ? w : (idx == 2 ? z : (idx == 1 ? y : x)); nuclear@0: } nuclear@0: const float &operator [](int idx) const nuclear@0: { nuclear@0: return idx == 3 ? w : (idx == 2 ? z : (idx == 1 ? y : x)); nuclear@0: } nuclear@0: }; nuclear@0: nuclear@0: inline Vector4 operator +(const Vector4 &a, const Vector4 &b) nuclear@0: { nuclear@0: return Vector4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); nuclear@0: } nuclear@0: nuclear@0: inline Vector4 operator -(const Vector4 &a, const Vector4 &b) nuclear@0: { nuclear@0: return Vector4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); nuclear@0: } nuclear@0: nuclear@0: inline Vector4 operator *(const Vector4 &v, float s) nuclear@0: { nuclear@0: return Vector4(v.x * s, v.y * s, v.z * s, v.w * s); nuclear@0: } nuclear@0: nuclear@0: inline Vector4 operator /(const Vector4 &v, float s) nuclear@0: { nuclear@0: return Vector4(v.x / s, v.y / s, v.z / s, v.w / s); nuclear@0: } nuclear@0: nuclear@0: inline float dot(const Vector4 &a, const Vector4 &b) nuclear@0: { nuclear@0: return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w; nuclear@0: } nuclear@0: nuclear@0: inline Vector4 transform(const Matrix4x4 &m, const Vector4 &v) nuclear@0: { nuclear@0: float x = m.m[0][0] * v.x + m.m[0][1] * v.y + m.m[0][2] * v.z + m.m[0][3] * v.w; nuclear@0: float y = m.m[1][0] * v.x + m.m[1][1] * v.y + m.m[1][2] * v.z + m.m[1][3] * v.w; nuclear@0: float z = m.m[2][0] * v.x + m.m[2][1] * v.y + m.m[2][2] * v.z + m.m[2][3] * v.w; nuclear@0: float w = m.m[3][0] * v.x + m.m[3][1] * v.y + m.m[3][2] * v.z + m.m[3][3] * v.w; nuclear@0: return Vector4(x, y, z, w); nuclear@0: } nuclear@0: nuclear@0: #endif // VMATH_H_