00001 // RC 4/24/2002 \HRandy95\Include\Vector4.h 00002 00003 #define __VECTOR4_H 00004 00005 #ifndef __VECTOR_H 00006 #include "Vector.h" 00007 #endif 00008 #ifndef __EXPORTS_H 00009 #include "Exports.h" 00010 #endif 00011 00012 #ifdef _SIMD 00013 #include "smlmath.h" 00014 #endif 00015 00016 class Matrix44; 00017 00018 class Vector4 00019 { 00020 protected: 00021 union { 00022 #ifdef _SIMD 00023 struct { SMLVec4f m_smlvec4f; }; 00024 #endif 00025 struct { float n[4]; }; 00026 }; 00027 00028 public: 00029 Vector4( void ) {} 00030 Vector4( float x, float y, float z, float w ); 00031 Vector4( float fill ); 00032 Vector4( const Vector4 &v ); 00033 Vector4( const Vector &other3 ); 00034 00035 friend class Matrix44; 00036 00037 float operator[]( int i ) const; 00038 float &operator[]( int i ); 00039 void Set( float x, float y, float z, float w ); 00040 void Set( float fill ) 00041 { 00042 n[0] = n[1] = n[2] = n[3] = fill; 00043 } 00044 Vector4 & operator = ( const Vector4 &v ); 00045 Vector4 & operator /= ( float scalar ); 00046 Vector4 & operator -= ( const Vector4 &other ); 00047 Vector4 & operator += ( const Vector4 &other ); 00048 Vector4 & operator *= ( float scale ); 00049 int operator == ( const Vector4 &a ) const; 00050 int operator != ( const Vector4 &a ) const { return !(*this == a); } 00051 00052 Vector4 operator + ( const Vector4 &a ) const { return Vector4(*this) += a; } 00053 Vector4 operator - ( const Vector4 &a ) const { return Vector4(*this) -= a; } 00054 00055 float operator | ( const Vector4 &b ) const; // Dot Product 00056 float operator | ( const Vector &b ) const; // Dot Product 00057 Vector4 operator * ( const Vector4 &b ) const // Member by member multiply 00058 { 00059 Vector4 result; // GOOD CANDIDATE FOR SIMD, NOT IN SML 00060 result[0] = n[0] * b[0]; 00061 result[1] = n[1] * b[1]; 00062 result[2] = n[2] * b[2]; 00063 result[3] = n[3] * b[3]; 00064 return result; 00065 } 00066 Vector4 operator * ( float scalar ) const 00067 { 00068 return Vector4(*this) *= scalar; 00069 } 00070 friend MATRIXEXPORT Vector4 operator * ( float scalar, const Vector4 &v ) 00071 { 00072 return v * scalar; 00073 } 00074 friend void Swap( Vector4 &a, Vector4 &b ) 00075 { 00076 Vector4 temp( a ); 00077 a = b; 00078 b = temp; 00079 } 00080 }; 00081 00082 #ifdef _SIMD 00083 00084 inline Vector4::Vector4( float x, float y, float z, float w ) : m_smlvec4f( x, y, z, w ) 00085 { 00086 } 00087 00088 inline Vector4::Vector4( float f ) : m_smlvec4f( f, f, f, f ) 00089 { 00090 } 00091 00092 inline Vector4::Vector4( const Vector4 &v ) : m_smlvec4f( v.m_smlvec4f ) 00093 { 00094 } 00095 00096 inline Vector4::Vector4( const Vector &other3 ) : m_smlvec4f( other3[0],other3[1],other3[2],1.0f ) 00097 { 00098 } 00099 00100 inline float Vector4::operator[]( int i ) const 00101 { 00102 return m_smlvec4f.data()[i]; 00103 } 00104 00105 inline float &Vector4::operator[]( int i ) 00106 { 00107 return m_smlvec4f.data()[i]; 00108 } 00109 00110 inline void Vector4::Set( float x, float y, float z, float w ) 00111 { 00112 m_smlvec4f.Set( x, y, z, w ); 00113 } 00114 00115 inline Vector4 & Vector4::operator = ( const Vector4 &v ) 00116 { 00117 m_smlvec4f = v.m_smlvec4f; return *this; 00118 } 00119 00120 inline Vector4 & Vector4::operator /= ( float scalar ) 00121 { 00122 m_smlvec4f /= scalar; return *this; 00123 } 00124 00125 inline Vector4 & Vector4::operator -= ( const Vector4 &other ) 00126 { 00127 m_smlvec4f -= other.m_smlvec4f; return *this; 00128 } 00129 00130 inline Vector4 & Vector4::operator += ( const Vector4 &other ) 00131 { 00132 m_smlvec4f += other.m_smlvec4f; 00133 return *this; 00134 } 00135 00136 inline Vector4 & Vector4::operator *= ( float scale ) 00137 { 00138 m_smlvec4f *= scale; 00139 return *this; 00140 } 00141 00142 inline int Vector4::operator == ( const Vector4 &a ) const 00143 { 00144 return m_smlvec4f == a.m_smlvec4f; 00145 } 00146 00147 inline float Vector4::operator | ( const Vector4 &b ) const // Dot Product 00148 { 00149 return m_smlvec4f.Dot( b.m_smlvec4f ); 00150 } 00151 00152 #else // NOT SIMD 00153 00154 inline Vector4::Vector4( float x, float y, float z, float w ) 00155 { 00156 Set(x,y,z,w); 00157 } 00158 00159 inline Vector4::Vector4( float fill ) 00160 { 00161 Set(fill); 00162 } 00163 00164 inline Vector4::Vector4( const Vector4 &other ) 00165 { 00166 *this = other; 00167 } 00168 00169 inline Vector4::Vector4( const Vector &other3 ) 00170 { 00171 n[0] = other3[0]; 00172 n[1] = other3[1]; 00173 n[2] = other3[2]; 00174 n[3] = 1.0f; 00175 } 00176 00177 inline float Vector4::operator[]( int i ) const 00178 { 00179 return n[i]; 00180 } 00181 00182 inline float &Vector4::operator[]( int i ) 00183 { 00184 return n[i]; 00185 } 00186 00187 inline void Vector4::Set( float x, float y, float z, float w ) 00188 { 00189 n[0] = x; 00190 n[1] = y; 00191 n[2] = z; 00192 n[3] = w; 00193 } 00194 00195 inline Vector4 & Vector4::operator = ( const Vector4 &other ) 00196 { 00197 n[0] = other[0]; 00198 n[1] = other[1]; 00199 n[2] = other[2]; 00200 n[3] = other[3]; 00201 return *this; 00202 } 00203 00204 inline Vector4 & Vector4::operator /= ( float scalar ) 00205 { 00206 n[0] /= scalar; 00207 n[1] /= scalar; 00208 n[2] /= scalar; 00209 n[3] /= scalar; 00210 return *this; 00211 } 00212 00213 inline Vector4 & Vector4::operator -= ( const Vector4 &other ) 00214 { 00215 n[0] -= other[0]; 00216 n[1] -= other[1]; 00217 n[2] -= other[2]; 00218 n[3] -= other[3]; 00219 return *this; 00220 } 00221 00222 inline Vector4 & Vector4::operator += ( const Vector4 &other ) 00223 { 00224 n[0] += other[0]; 00225 n[1] += other[1]; 00226 n[2] += other[2]; 00227 n[3] += other[3]; 00228 return *this; 00229 } 00230 00231 inline Vector4 & Vector4::operator *= ( float scale ) 00232 { 00233 n[0]*=scale; 00234 n[1]*=scale; 00235 n[2]*=scale; 00236 n[3]*=scale; 00237 return *this; 00238 } 00239 00240 inline int Vector4::operator == ( const Vector4 &a ) const 00241 { 00242 return n[0]==a[0] && n[1]==a[1] && n[2]==a[2] && n[3]==a[3]; 00243 } 00244 00245 inline float Vector4::operator | ( const Vector4 &b ) const // Dot Product 00246 { 00247 return n[0]*b[0] + n[1]*b[1] + n[2]*b[2] + n[3]*b[3]; 00248 } 00249 00250 inline float Vector4::operator | ( const Vector &b ) const // Dot Product 00251 { 00252 return n[0]*b[0] + n[1]*b[1] + n[2]*b[2] + n[3]; 00253 } 00254 00255 #endif // NOT SIMD
Generated on Thu Oct 27 11:46:46 2005 with
1.4.5 written by Dimitri van Heesch,
© 1997-2001