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 }