nuclear@0: #ifndef GMATH_VEC_H_ nuclear@0: #define GMATH_VEC_H_ nuclear@0: nuclear@0: #include nuclear@5: #include "swizzle.h" nuclear@0: nuclear@2: namespace gph { nuclear@0: nuclear@5: #define GPH_SWIZZLE2(T, a, b) inline Vector2 a##b() const; nuclear@5: #define GPH_SWIZZLE3(T, a, b, c) inline Vector3 a##b##c() const; nuclear@5: #define GPH_SWIZZLE4(T, a, b, c, d) inline Vector4 a##b##c##d() const; nuclear@5: nuclear@5: class Vector3; nuclear@3: class Vector4; nuclear@4: class Matrix4x4; nuclear@3: nuclear@5: class Vector2 { nuclear@5: public: nuclear@5: float x, y; nuclear@5: nuclear@5: Vector2() : x(0), y(0) {} nuclear@5: Vector2(float x_, float y_) : x(x_), y(y_) {} nuclear@5: Vector2(const Vector3 &v); nuclear@5: nuclear@5: inline void normalize(); nuclear@5: inline float &operator[] (int idx); nuclear@5: inline const float &operator[] (int idx) const; nuclear@5: nuclear@5: GPH_VEC2_SWIZZLE nuclear@5: }; nuclear@5: 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@3: Vector3(const Vector4 &v); nuclear@0: nuclear@4: inline void normalize(); nuclear@4: inline float &operator[] (int idx); nuclear@4: inline const float &operator[] (int idx) const; nuclear@5: nuclear@5: GPH_VEC3_SWIZZLE nuclear@0: }; nuclear@0: nuclear@3: 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 x_, float y_, float z_, float w_) : x(x_), y(y_), z(z_), w(w_) {} nuclear@3: Vector4(const Vector3 &v); nuclear@3: nuclear@4: inline void normalize(); nuclear@4: inline float &operator[] (int idx); nuclear@4: inline const float &operator[] (int idx) const; nuclear@5: nuclear@5: GPH_VEC4_SWIZZLE nuclear@3: }; nuclear@3: nuclear@3: // ---- Vector3 functions ---- nuclear@4: inline Vector3 operator +(const Vector3 &a, const Vector3 &b); nuclear@4: inline Vector3 operator -(const Vector3 &a, const Vector3 &b); nuclear@4: inline Vector3 operator *(const Vector3 &a, const Vector3 &b); nuclear@4: inline Vector3 operator /(const Vector3 &a, const Vector3 &b); nuclear@4: inline Vector3 operator *(const Vector3 &v, float s); nuclear@4: inline Vector3 operator *(float s, const Vector3 &v); nuclear@4: inline Vector3 operator /(const Vector3 &v, float s); nuclear@4: inline Vector3 operator /(float s, const Vector3 &v); nuclear@4: inline Vector3 &operator +=(Vector3 &a, const Vector3 &b); nuclear@4: inline Vector3 &operator -=(Vector3 &a, const Vector3 &b); nuclear@4: inline Vector3 &operator *=(Vector3 &a, const Vector3 &b); nuclear@4: inline Vector3 &operator /=(Vector3 &a, const Vector3 &b); nuclear@4: inline Vector3 &operator *=(Vector3 &v, float s); nuclear@4: inline Vector3 &operator /=(Vector3 &v, float s); nuclear@3: nuclear@4: Vector3 operator *(const Vector3 &v, const Matrix4x4 &m); nuclear@4: Vector3 operator *(const Matrix4x4 &m, const Vector3 &v); nuclear@0: nuclear@4: inline bool operator ==(const Vector3 &a, const Vector3 &b); nuclear@4: inline bool operator !=(const Vector3 &a, const Vector3 &b); nuclear@0: nuclear@4: inline float dot(const Vector3 &a, const Vector3 &b); nuclear@4: inline Vector3 cross(const Vector3 &a, const Vector3 &b); nuclear@4: inline float length(const Vector3 &v); nuclear@4: inline float length_sq(const Vector3 &v); nuclear@4: inline Vector3 normalize(const Vector3 &v); nuclear@0: nuclear@4: inline Vector3 reflect(const Vector3 &v, const Vector3 &n); nuclear@4: inline Vector3 refract(const Vector3 &v, const Vector3 &n, float ior); nuclear@4: inline Vector3 refract(const Vector3 &v, const Vector3 &n, float from_ior, float to_ior); nuclear@0: nuclear@4: inline Vector3 distance(const Vector3 &a, const Vector3 &b); nuclear@4: inline Vector3 distance_sq(const Vector3 &a, const Vector3 &b); nuclear@4: inline Vector3 faceforward(const Vector3 &n, const Vector3 &vi, const Vector3 &ng); nuclear@0: nuclear@0: } nuclear@0: nuclear@0: #endif /* GMATH_VEC_H_ */