00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of OGRE 00004 (Object-oriented Graphics Rendering Engine) 00005 For the latest info, see http://www.ogre3d.org/ 00006 00007 Copyright (c) 2000-2005 The OGRE Team 00008 Also see acknowledgements in Readme.html 00009 00010 This program is free software; you can redistribute it and/or modify it under 00011 the terms of the GNU Lesser General Public License as published by the Free Software 00012 Foundation; either version 2 of the License, or (at your option) any later 00013 version. 00014 00015 This program is distributed in the hope that it will be useful, but WITHOUT 00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License along with 00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple 00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to 00022 http://www.gnu.org/copyleft/lesser.txt. 00023 ----------------------------------------------------------------------------- 00024 */ 00025 #ifndef __Vector4_H__ 00026 #define __Vector4_H__ 00027 00028 #include "OgrePrerequisites.h" 00029 #include "OgreVector3.h" 00030 00031 namespace Ogre 00032 { 00033 00036 class _OgreExport Vector4 00037 { 00038 public: 00039 union { 00040 struct { 00041 Real x, y, z, w; 00042 }; 00043 Real val[4]; 00044 }; 00045 00046 public: 00047 inline Vector4() 00048 { 00049 } 00050 00051 inline Vector4( Real fX, Real fY, Real fZ, Real fW ) 00052 : x( fX ), y( fY ), z( fZ ), w( fW) 00053 { 00054 } 00055 00056 inline Vector4( Real afCoordinate[4] ) 00057 : x( afCoordinate[0] ), 00058 y( afCoordinate[1] ), 00059 z( afCoordinate[2] ), 00060 w (afCoordinate[3] ) 00061 { 00062 } 00063 00064 inline Vector4( int afCoordinate[4] ) 00065 { 00066 x = (Real)afCoordinate[0]; 00067 y = (Real)afCoordinate[1]; 00068 z = (Real)afCoordinate[2]; 00069 w = (Real)afCoordinate[3]; 00070 } 00071 00072 inline Vector4( const Real* const r ) 00073 : x( r[0] ), y( r[1] ), z( r[2] ), w( r[3] ) 00074 { 00075 } 00076 00077 inline Vector4( const Vector4& rkVector ) 00078 : x( rkVector.x ), y( rkVector.y ), z( rkVector.z ), w (rkVector.w) 00079 { 00080 } 00081 00082 inline Real operator [] ( size_t i ) const 00083 { 00084 assert( i < 4 ); 00085 00086 return *(&x+i); 00087 } 00088 00089 inline Real& operator [] ( size_t i ) 00090 { 00091 assert( i < 4 ); 00092 00093 return *(&x+i); 00094 } 00095 00100 inline Vector4& operator = ( const Vector4& rkVector ) 00101 { 00102 x = rkVector.x; 00103 y = rkVector.y; 00104 z = rkVector.z; 00105 w = rkVector.w; 00106 00107 return *this; 00108 } 00109 00110 inline bool operator == ( const Vector4& rkVector ) const 00111 { 00112 return ( x == rkVector.x && 00113 y == rkVector.y && 00114 z == rkVector.z && 00115 w == rkVector.w ); 00116 } 00117 00118 inline bool operator != ( const Vector4& rkVector ) const 00119 { 00120 return ( x != rkVector.x || 00121 y != rkVector.y || 00122 z != rkVector.z || 00123 w != rkVector.w ); 00124 } 00125 00126 inline Vector4& operator = (const Vector3& rhs) 00127 { 00128 x = rhs.x; 00129 y = rhs.y; 00130 z = rhs.z; 00131 w = 1.0f; 00132 return *this; 00133 } 00134 00135 // arithmetic operations 00136 inline Vector4 operator + ( const Vector4& rkVector ) const 00137 { 00138 Vector4 kSum; 00139 00140 kSum.x = x + rkVector.x; 00141 kSum.y = y + rkVector.y; 00142 kSum.z = z + rkVector.z; 00143 kSum.w = w + rkVector.w; 00144 00145 return kSum; 00146 } 00147 00148 inline Vector4 operator - ( const Vector4& rkVector ) const 00149 { 00150 Vector4 kDiff; 00151 00152 kDiff.x = x - rkVector.x; 00153 kDiff.y = y - rkVector.y; 00154 kDiff.z = z - rkVector.z; 00155 kDiff.w = w - rkVector.w; 00156 00157 return kDiff; 00158 } 00159 00160 inline Vector4 operator * ( Real fScalar ) const 00161 { 00162 Vector4 kProd; 00163 00164 kProd.x = fScalar*x; 00165 kProd.y = fScalar*y; 00166 kProd.z = fScalar*z; 00167 kProd.w = fScalar*w; 00168 00169 return kProd; 00170 } 00171 00172 inline Vector4 operator * ( const Vector4& rhs) const 00173 { 00174 Vector4 kProd; 00175 00176 kProd.x = rhs.x * x; 00177 kProd.y = rhs.y * y; 00178 kProd.z = rhs.z * z; 00179 kProd.w = rhs.w * w; 00180 00181 return kProd; 00182 } 00183 00184 inline Vector4 operator / ( Real fScalar ) const 00185 { 00186 assert( fScalar != 0.0 ); 00187 00188 Vector4 kDiv; 00189 00190 Real fInv = 1.0 / fScalar; 00191 kDiv.x = x * fInv; 00192 kDiv.y = y * fInv; 00193 kDiv.z = z * fInv; 00194 kDiv.w = w * fInv; 00195 00196 return kDiv; 00197 } 00198 00199 inline Vector4 operator / ( const Vector4& rhs) const 00200 { 00201 Vector4 kDiv; 00202 00203 kDiv.x = x / rhs.x; 00204 kDiv.y = y / rhs.y; 00205 kDiv.z = z / rhs.z; 00206 kDiv.w = w / rhs.w; 00207 00208 return kDiv; 00209 } 00210 00211 00212 inline Vector4 operator - () const 00213 { 00214 Vector4 kNeg; 00215 00216 kNeg.x = -x; 00217 kNeg.y = -y; 00218 kNeg.z = -z; 00219 kNeg.w = -w; 00220 00221 return kNeg; 00222 } 00223 00224 inline friend Vector4 operator * ( Real fScalar, const Vector4& rkVector ) 00225 { 00226 Vector4 kProd; 00227 00228 kProd.x = fScalar * rkVector.x; 00229 kProd.y = fScalar * rkVector.y; 00230 kProd.z = fScalar * rkVector.z; 00231 kProd.w = fScalar * rkVector.w; 00232 00233 return kProd; 00234 } 00235 00236 // arithmetic updates 00237 inline Vector4& operator += ( const Vector4& rkVector ) 00238 { 00239 x += rkVector.x; 00240 y += rkVector.y; 00241 z += rkVector.z; 00242 w += rkVector.w; 00243 00244 return *this; 00245 } 00246 00247 inline Vector4& operator -= ( const Vector4& rkVector ) 00248 { 00249 x -= rkVector.x; 00250 y -= rkVector.y; 00251 z -= rkVector.z; 00252 w -= rkVector.w; 00253 00254 return *this; 00255 } 00256 00257 inline Vector4& operator *= ( Real fScalar ) 00258 { 00259 x *= fScalar; 00260 y *= fScalar; 00261 z *= fScalar; 00262 w *= fScalar; 00263 return *this; 00264 } 00265 00266 inline Vector4& operator *= ( const Vector4& rkVector ) 00267 { 00268 x *= rkVector.x; 00269 y *= rkVector.y; 00270 z *= rkVector.z; 00271 w *= rkVector.w; 00272 00273 return *this; 00274 } 00275 00276 inline Vector4& operator /= ( Real fScalar ) 00277 { 00278 assert( fScalar != 0.0 ); 00279 00280 Real fInv = 1.0 / fScalar; 00281 00282 x *= fInv; 00283 y *= fInv; 00284 z *= fInv; 00285 w *= fInv; 00286 00287 return *this; 00288 } 00289 00290 inline Vector4& operator /= ( const Vector4& rkVector ) 00291 { 00292 x /= rkVector.x; 00293 y /= rkVector.y; 00294 z /= rkVector.z; 00295 w /= rkVector.w; 00296 00297 return *this; 00298 } 00299 00307 inline Real dotProduct(const Vector4& vec) const 00308 { 00309 return x * vec.x + y * vec.y + z * vec.z + w * vec.w; 00310 } 00313 inline _OgreExport friend std::ostream& operator << 00314 ( std::ostream& o, const Vector4& v ) 00315 { 00316 o << "Vector4(" << v.x << ", " << v.y << ", " << v.z << ", " << v.w << ")"; 00317 return o; 00318 } 00319 }; 00320 00321 } 00322 #endif
Copyright © 2000-2005 by The OGRE Team
This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.
Last modified Sun Feb 12 12:59:54 2006