nuclear@0: #ifndef GMATH_VEC_H_ nuclear@0: #define GMATH_VEC_H_ nuclear@0: nuclear@0: #include nuclear@0: nuclear@2: namespace gph { nuclear@0: nuclear@2: class Vector3 { nuclear@0: public: nuclear@0: float x, y, z; nuclear@0: nuclear@2: Vector3() : x(0), y(0), z(0) {} nuclear@2: Vector3(float x_, float y_, float z_) : x(x_), y(y_), z(z_) {} nuclear@0: nuclear@2: inline void normalize(); nuclear@0: }; nuclear@0: nuclear@2: inline Vector3 operator +(const Vector3 &a, const Vector3 &b) nuclear@0: { nuclear@2: return Vector3(a.x + b.x, a.y + b.y, a.z + b.z); nuclear@0: } nuclear@0: nuclear@2: inline Vector3 operator -(const Vector3 &a, const Vector3 &b) nuclear@0: { nuclear@2: return Vector3(a.x - b.x, a.y - b.y, a.z - b.z); nuclear@0: } nuclear@0: nuclear@2: inline Vector3 operator *(const Vector3 &a, const Vector3 &b) nuclear@0: { nuclear@2: return Vector3(a.x * b.x, a.y * b.y, a.z * b.z); nuclear@0: } nuclear@0: nuclear@2: inline Vector3 operator /(const Vector3 &a, const Vector3 &b) nuclear@0: { nuclear@2: return Vector3(a.x / b.x, a.y / b.y, a.z / b.z); nuclear@0: } nuclear@0: nuclear@2: inline Vector3 operator *(const Vector3 &v, float s) nuclear@0: { nuclear@2: return Vector3(v.x * s, v.y * s, v.z * s); nuclear@0: } nuclear@0: nuclear@2: inline Vector3 operator *(float s, const Vector3 &v) nuclear@0: { nuclear@2: return Vector3(s * v.x, s * v.y, s * v.z); nuclear@0: } nuclear@0: nuclear@2: inline Vector3 operator /(const Vector3 &v, float s) nuclear@0: { nuclear@2: return Vector3(v.x / s, v.y / s, v.z / s); nuclear@0: } nuclear@0: nuclear@2: inline Vector3 operator /(float s, const Vector3 &v) nuclear@0: { nuclear@2: return Vector3(s / v.x, s / v.y, s / v.z); nuclear@0: } nuclear@0: nuclear@2: inline Vector3 &operator +=(Vector3 &a, const Vector3 &b) nuclear@0: { nuclear@0: a.x += b.x; nuclear@0: a.y += b.y; nuclear@0: a.z += b.z; nuclear@2: return a; nuclear@0: } nuclear@0: nuclear@2: inline Vector3 &operator -=(Vector3 &a, const Vector3 &b) nuclear@0: { nuclear@0: a.x -= b.x; nuclear@0: a.y -= b.y; nuclear@0: a.z -= b.z; nuclear@2: return a; nuclear@0: } nuclear@0: nuclear@2: inline Vector3 &operator *=(Vector3 &a, const Vector3 &b) nuclear@0: { nuclear@0: a.x *= b.x; nuclear@0: a.y *= b.y; nuclear@0: a.z *= b.z; nuclear@2: return a; nuclear@0: } nuclear@0: nuclear@2: inline Vector3 &operator /=(Vector3 &a, const Vector3 &b) nuclear@0: { nuclear@0: a.x /= b.x; nuclear@0: a.y /= b.y; nuclear@0: a.z /= b.z; nuclear@2: return a; nuclear@0: } nuclear@0: nuclear@2: inline Vector3 &operator *=(Vector3 &v, float s) nuclear@0: { nuclear@0: v.x *= s; nuclear@0: v.y *= s; nuclear@0: v.z *= s; nuclear@2: return v; nuclear@0: } nuclear@0: nuclear@2: inline Vector3 &operator /=(Vector3 &v, float s) nuclear@0: { nuclear@0: v.x /= s; nuclear@0: v.y /= s; nuclear@0: v.z /= s; nuclear@2: return v; nuclear@0: } nuclear@0: nuclear@2: 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@2: inline Vector3 cross(const Vector3 &a, const Vector3 &b) nuclear@0: { nuclear@2: return Vector3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x); nuclear@0: } nuclear@0: nuclear@2: inline float length(const Vector3 &v) nuclear@0: { nuclear@0: return (float)sqrt(v.x * v.x + v.y * v.y + v.z * v.z); nuclear@0: } nuclear@0: nuclear@2: inline float length_sq(const Vector3 &v) nuclear@0: { nuclear@0: return v.x * v.x + v.y * v.y + v.z * v.z; nuclear@0: } nuclear@0: nuclear@2: inline Vector3 normalize(const Vector3 &v) nuclear@0: { nuclear@0: float len = length(v); nuclear@0: if(len == 0.0f) { nuclear@0: return v; nuclear@0: } nuclear@0: nuclear@2: return Vector3(v.x / len, v.y / len, v.z / len); nuclear@0: } nuclear@0: nuclear@2: inline void Vector3::normalize() nuclear@2: { nuclear@2: float len = length(*this); nuclear@2: if(len != 0.0f) { nuclear@2: x /= len; nuclear@2: y /= len; nuclear@2: z /= len; nuclear@2: } nuclear@2: } nuclear@2: nuclear@2: nuclear@0: } nuclear@0: nuclear@0: #endif /* GMATH_VEC_H_ */