//******************************************************************** // Newton Game dynamics // copyright 2000-2004 // By Julio Jerez // VC: 6.0 // simple 4d vector class //******************************************************************** #ifndef __dVector__ #define __dVector__ //#define dFloat float #include #include // small but very effective 4 dimetional template vector class template class TemplateVector { public: TemplateVector (); TemplateVector (const T *ptr); TemplateVector (T m_x, T m_y, T m_z, T m_w); TemplateVector Scale (T s) const; T& operator[] (int i); const T& operator[] (int i) const; TemplateVector operator+ (const TemplateVector &A) const; TemplateVector operator- (const TemplateVector &A) const; TemplateVector &operator+= (const TemplateVector &A); TemplateVector &operator-= (const TemplateVector &A); // return dot product T operator% (const TemplateVector &A) const; // return cross product TemplateVector operator* (const TemplateVector &B) const; // component wise multiplication TemplateVector CompProduct (const TemplateVector &A) const; T m_x; T m_y; T m_z; T m_w; }; class dVector: public TemplateVector { public: dVector(); dVector (const TemplateVector& v); dVector (const dFloat *ptr); dVector (dFloat x, dFloat y, dFloat z, dFloat w = 1.0); }; template TemplateVector::TemplateVector() {} template TemplateVector::TemplateVector(const T *ptr) { m_x = ptr[0]; m_y = ptr[1]; m_z = ptr[2]; m_w = 1.0; } template TemplateVector::TemplateVector(T x, T y, T z, T w) { m_x = x; m_y = y; m_z = z; m_w = w; } template T& TemplateVector::operator[] (int i) { return (&m_x)[i]; } template const T& TemplateVector::operator[] (int i) const { return (&m_x)[i]; } template TemplateVector TemplateVector::Scale (T scale) const { return TemplateVector (m_x * scale, m_y * scale, m_z * scale, m_w); } template TemplateVector TemplateVector::operator+ (const TemplateVector &B) const { return TemplateVector (m_x + B.m_x, m_y + B.m_y, m_z + B.m_z, m_w); } template TemplateVector& TemplateVector::operator+= (const TemplateVector &A) { m_x += A.m_x; m_y += A.m_y; m_z += A.m_z; return *this; } template TemplateVector TemplateVector::operator- (const TemplateVector &A) const { return TemplateVector (m_x - A.m_x, m_y - A.m_y, m_z - A.m_z, m_w); } template TemplateVector& TemplateVector::operator-= (const TemplateVector &A) { m_x -= A.m_x; m_y -= A.m_y; m_z -= A.m_z; return *this; } template T TemplateVector::operator% (const TemplateVector &A) const { return m_x * A.m_x + m_y * A.m_y + m_z * A.m_z; } template TemplateVector TemplateVector::operator* (const TemplateVector &B) const { return TemplateVector (m_y * B.m_z - m_z * B.m_y, m_z * B.m_x - m_x * B.m_z, m_x * B.m_y - m_y * B.m_x, m_w); } template TemplateVector TemplateVector::CompProduct (const TemplateVector &A) const { return TemplateVector (m_x * A.m_x, m_y * A.m_y, m_z * A.m_z, A.m_w); } inline dVector::dVector() :TemplateVector() { } inline dVector::dVector (const TemplateVector& v) :TemplateVector(v) { } inline dVector::dVector (const dFloat *ptr) :TemplateVector(ptr) { } inline dVector::dVector (dFloat x, dFloat y, dFloat z, dFloat w) :TemplateVector(x, y, z, w) { } #endif