nuclear@3: #ifndef VMATH_H_ nuclear@3: #define VMATH_H_ nuclear@3: nuclear@4: #include nuclear@4: nuclear@3: class Vector2 { nuclear@3: public: nuclear@3: float x, y; nuclear@3: nuclear@3: Vector2() : x(0), y(0) {} nuclear@3: Vector2(float xa, float ya) : x(xa), y(ya) {} nuclear@3: nuclear@3: float &operator [](int idx) { return (&x)[idx]; } nuclear@3: const float &operator [](int idx) const { return (&x)[idx]; } nuclear@3: }; nuclear@3: nuclear@3: class Vector3 { nuclear@3: public: nuclear@3: float x, y, z; nuclear@3: nuclear@3: Vector3() : x(0), y(0), z(0) {} nuclear@3: Vector3(float xa, float ya, float za) : x(xa), y(ya), z(za) {} nuclear@3: nuclear@3: float &operator [](int idx) { return (&x)[idx]; } nuclear@3: const float &operator [](int idx) const { return (&x)[idx]; } nuclear@3: }; nuclear@3: nuclear@4: inline Vector3 operator +(const Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: return Vector3(a.x + b.x, a.y + b.y, a.z + b.z); nuclear@4: } nuclear@4: nuclear@4: inline Vector3 operator -(const Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: return Vector3(a.x - b.x, a.y - b.y, a.z - b.z); nuclear@4: } nuclear@4: nuclear@4: inline Vector3 operator *(const Vector3 &a, float s) nuclear@4: { nuclear@4: return Vector3(a.x * s, a.y * s, a.z * s); nuclear@4: } nuclear@4: nuclear@4: inline float dot(const Vector3 &a, const Vector3 &b) nuclear@4: { nuclear@4: return a.x * b.x + a.y * b.y + a.z * b.z; nuclear@4: } nuclear@4: nuclear@4: inline float length(const Vector3 &v) nuclear@4: { nuclear@4: return sqrt(dot(v, v)); nuclear@4: } nuclear@4: nuclear@4: inline Vector3 normalize(const Vector3 &v) nuclear@4: { nuclear@4: float len = length(v); nuclear@4: if(len == 0.0) { nuclear@4: return v; nuclear@4: } nuclear@4: return Vector3(v.x / len, v.y / len, v.z / len); nuclear@4: } nuclear@4: nuclear@3: class Vector4 { nuclear@3: public: nuclear@3: float x, y, z, w; nuclear@3: nuclear@3: Vector4() : x(0), y(0), z(0), w(0) {} nuclear@3: Vector4(float xa, float ya, float za, float wa) : x(xa), y(ya), z(za), w(wa) {} nuclear@3: nuclear@3: float &operator [](int idx) { return (&x)[idx]; } nuclear@3: const float &operator [](int idx) const { return (&x)[idx]; } nuclear@3: }; nuclear@3: nuclear@4: class Ray { nuclear@4: public: nuclear@4: Vector3 origin, dir; nuclear@4: nuclear@4: Ray() : origin(0, 0, 0), dir(0, 0, 1) {} nuclear@4: Ray(const Vector3 &o, const Vector3 &d) : origin(o), dir(d) {} nuclear@4: }; nuclear@4: nuclear@3: #endif // VMATH_H_