00001 #pragma once 00002 00003 #include "common.h" 00004 #include <math.h> 00005 00007 00011 class Vector4 00012 { 00013 public: 00014 Vector4() 00015 { 00016 m_vfElements[0] = 0.0f; 00017 m_vfElements[1] = 0.0f; 00018 m_vfElements[2] = 0.0f; 00019 m_vfElements[3] = 0.0f; 00020 }; 00021 00022 Vector4(const float fX, const float fY, const float fZ, const float fA) 00023 { 00024 m_vfElements[0] = fX; 00025 m_vfElements[1] = fY; 00026 m_vfElements[2] = fZ; 00027 m_vfElements[3] = fA; 00028 }; 00029 00030 Vector4::Vector4(const float vfValues[]) 00031 { 00032 m_vfElements[0] = vfValues[0]; 00033 m_vfElements[1] = vfValues[1]; 00034 m_vfElements[2] = vfValues[2]; 00035 m_vfElements[3] = vfValues[3]; 00036 }; 00037 00038 ~Vector4() 00039 { 00040 }; 00041 00042 void Set(const float fX, const float fY, const float fZ, const float fA) 00043 { 00044 m_vfElements[0] = fX; 00045 m_vfElements[1] = fY; 00046 m_vfElements[2] = fZ; 00047 m_vfElements[3] = fA; 00048 }; 00049 00050 void SetX(const float fX) 00051 { 00052 m_vfElements[0] = fX; 00053 }; 00054 00055 void SetY(const float fY) 00056 { 00057 m_vfElements[1] = fY; 00058 }; 00059 00060 void SetZ(const float fZ) 00061 { 00062 m_vfElements[2] = fZ; 00063 }; 00064 00065 void SetW(const float fW) 00066 { 00067 m_vfElements[3] = fW; 00068 }; 00069 00070 const float * Get() const 00071 { 00072 return m_vfElements; 00073 }; 00074 00075 const float Get(const unsigned int uIndex) const 00076 { 00077 return m_vfElements[uIndex]; 00078 }; 00079 00080 const float GetX() const 00081 { 00082 return m_vfElements[0]; 00083 }; 00084 00085 const float GetY() const 00086 { 00087 return m_vfElements[1]; 00088 }; 00089 00090 const float GetZ() const 00091 { 00092 return m_vfElements[2]; 00093 }; 00094 00095 const float GetW() const 00096 { 00097 return m_vfElements[3]; 00098 }; 00099 00100 const float GetMagnitude() const 00101 { 00102 return sqrtf(GetX()*GetX() + GetY()*GetY() + GetZ()*GetZ()); 00103 }; 00104 00105 const float GetSquaredMagnitude() const 00106 { 00107 return (GetX()*GetX() + GetY()*GetY() + GetZ()*GetZ()); 00108 }; 00109 00110 const float GetDot(const Vector &vecOther) const 00111 { 00112 return (GetX() * vecOther.GetX() + GetY()*vecOther.GetY() + GetZ()*vecOther.GetZ()); 00113 }; 00114 00115 const Vector4 GetCross(const Vector &vecOther) const 00116 { 00117 return Vector4(GetY()*vecOther.GetZ() - GetZ()*vecOther.GetY(), GetZ()*vecOther.GetX() - GetX() * vecOther.GetZ(), GetX()*vecOther.GetY() - GetY()*vecOther.GetX(),1.0f); 00118 }; 00119 00120 const Vector4 GetNormalized() const 00121 { 00122 Vector4 vecNew = *this; 00123 float fMagnitude = vecNew.GetMagnitude(); 00124 00125 if (fMagnitude > 0.0f) 00126 { 00127 vecNew.SetX(vecNew.GetX()/ fMagnitude); 00128 vecNew.SetY(vecNew.GetY()/ fMagnitude); 00129 vecNew.SetZ(vecNew.GetZ()/ fMagnitude); 00130 } 00131 return vecNew; 00132 }; 00133 00134 const Vector4 GetInverse() const 00135 { 00136 return Vector4(1.0f/GetX(),1.0f/GetY(),1.0f/GetZ(),1.0f); 00137 }; 00138 00139 void normalize() 00140 { 00141 (*this) = GetNormalized(); 00142 }; 00143 00144 void invert() 00145 { 00146 (*this) = GetInverse(); 00147 }; 00148 00149 const bool operator==(const Vector & vecOther) const 00150 { 00151 return (GetX() == vecOther.GetX()) && (GetY() == vecOther.GetY()) && (GetZ() == vecOther.GetZ()); 00152 }; 00153 00154 const bool operator!=(const Vector & vecOther) const 00155 { 00156 return !(*this == vecOther); 00157 }; 00158 00159 float & operator[](const unsigned int uIndex) 00160 { 00161 return m_vfElements[uIndex]; 00162 }; 00163 00164 const float operator[](const unsigned int uIndex) const 00165 { 00166 return m_vfElements[uIndex]; 00167 }; 00168 00169 const Vector4 & operator+=(const Vector4 & vecOther) 00170 { 00171 SetX(GetX()+vecOther.GetX()); 00172 SetY(GetY()+vecOther.GetY()); 00173 SetZ(GetZ()+vecOther.GetZ()); 00174 SetW(GetW()+vecOther.GetW()); 00175 return *this; 00176 }; 00177 00178 const Vector4 & operator-=(const Vector4 & vecOther) 00179 { 00180 SetX(GetX()-vecOther.GetX()); 00181 SetY(GetY()-vecOther.GetY()); 00182 SetZ(GetZ()-vecOther.GetZ()); 00183 SetW(GetW()-vecOther.GetW()); 00184 return *this; 00185 }; 00186 00187 const Vector4 & operator*=(const Vector4 & vecOther) 00188 { 00189 SetX(GetX()*vecOther.GetX()); 00190 SetY(GetY()*vecOther.GetY()); 00191 SetZ(GetZ()*vecOther.GetZ()); 00192 SetW(GetW()*vecOther.GetW()); 00193 return *this; 00194 }; 00195 00196 const Vector4 & operator*=(const float & fOther) 00197 { 00198 SetX(GetX()*fOther); 00199 SetY(GetY()*fOther); 00200 SetZ(GetZ()*fOther); 00201 SetW(GetW()*fOther); 00202 return *this; 00203 }; 00204 00205 const Vector4 & operator/=(const Vector4 & vecOther) 00206 { 00207 SetX(GetX()/vecOther.GetX()); 00208 SetY(GetY()/vecOther.GetY()); 00209 SetZ(GetZ()/vecOther.GetZ()); 00210 SetW(GetW()/vecOther.GetW()); 00211 return *this; 00212 }; 00213 00214 const Vector4 & operator/=(const float & fOther) 00215 { 00216 SetX(GetX()/fOther); 00217 SetY(GetY()/fOther); 00218 SetZ(GetZ()/fOther); 00219 SetW(GetW()/fOther); 00220 return *this; 00221 }; 00222 00223 const Vector4 operator+(const Vector4 & vecOther) const 00224 { 00225 Vector4 vecNew = *this; 00226 vecNew += vecOther; 00227 return vecNew; 00228 }; 00229 00230 const Vector4 operator-(const Vector4 & vecOther) const 00231 { 00232 Vector4 vecNew = *this; 00233 vecNew -= vecOther; 00234 return vecNew; 00235 }; 00236 00237 const Vector4 operator*(const Vector4 & vecOther) const 00238 { 00239 Vector4 vecNew = *this; 00240 vecNew *= vecOther; 00241 return vecNew; 00242 }; 00243 00244 const Vector4 operator*(const float & fOther) const 00245 { 00246 Vector4 vecNew = *this; 00247 vecNew *= fOther; 00248 return vecNew; 00249 }; 00250 00251 const Vector4 operator/(const Vector4 & vecOther) const 00252 { 00253 Vector4 vecNew = *this; 00254 vecNew /= vecOther; 00255 return vecNew; 00256 }; 00257 00258 const Vector4 operator/(const float & fOther) const 00259 { 00260 Vector4 vecNew = *this; 00261 vecNew /= fOther; 00262 return vecNew; 00263 }; 00264 00265 const Vector4 operator-() const 00266 { 00267 return Vector4(-GetX(),-GetY(),-GetZ(),-GetW()); 00268 }; 00269 00270 private: 00271 float m_vfElements[4]; 00272 }; 00273 00274 inline std::ostream & operator<< (std::ostream & os, const Vector4 & vecVector) 00275 { 00276 os << "(" << vecVector.GetX() << ";" << vecVector.GetY() << ";" << vecVector.GetZ() << ")"; 00277 return os; 00278 } 00279 00280 inline std::istream & operator>> (std::istream & is, Vector4 & vecVector) 00281 { 00282 00283 float fX,fY,fZ; 00284 if (is >> eat("(") >> fX >> eat(";") >> fY >> eat(";") >> fZ >> eat(")")) 00285 vecVector.Set(fX,fY,fZ,1.0f); 00286 00287 return is; 00288 }