00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef Vector3_INCLUDE_ONCE
00033 #define Vector3_INCLUDE_ONCE
00034
00035 #include <vlCore/Vector2.hpp>
00036
00037 namespace vl
00038 {
00043 template<typename T_Scalar>
00044 class Vector3
00045 {
00046 public:
00047 typedef T_Scalar scalar_type;
00048 static const int scalar_count = 3;
00049 Vector3(const Vector3& other) { *this = other; }
00050 Vector3() { x() = y() = z() = 0; }
00051
00052 template<class T>
00053 explicit Vector3(const T& other)
00054 {
00055 x() = (T_Scalar)other.x();
00056 y() = (T_Scalar)other.y();
00057 z() = (T_Scalar)other.z();
00058 }
00059
00060 explicit Vector3(T_Scalar x, T_Scalar y, T_Scalar z)
00061 {
00062 mScalar[0] = x;
00063 mScalar[1] = y;
00064 mScalar[2] = z;
00065 }
00066
00067 explicit Vector3(const Vector2<T_Scalar>& v, T_Scalar z)
00068 {
00069 mScalar[0] = v.x();
00070 mScalar[1] = v.y();
00071 mScalar[2] = z;
00072 }
00073
00074 T_Scalar* ptr() { return mScalar; }
00075 const T_Scalar* ptr() const { return mScalar; }
00076
00077 const T_Scalar& x() const { return mScalar[0]; }
00078 const T_Scalar& y() const { return mScalar[1]; }
00079 const T_Scalar& z() const { return mScalar[2]; }
00080
00081 T_Scalar& x() { return mScalar[0]; }
00082 T_Scalar& y() { return mScalar[1]; }
00083 T_Scalar& z() { return mScalar[2]; }
00084
00085 const T_Scalar& r() const { return mScalar[0]; }
00086 const T_Scalar& g() const { return mScalar[1]; }
00087 const T_Scalar& b() const { return mScalar[2]; }
00088
00089 T_Scalar& r() { return mScalar[0]; }
00090 T_Scalar& g() { return mScalar[1]; }
00091 T_Scalar& b() { return mScalar[2]; }
00092
00093 const T_Scalar& s() const { return mScalar[0]; }
00094 const T_Scalar& t() const { return mScalar[1]; }
00095 const T_Scalar& p() const { return mScalar[2]; }
00096
00097 T_Scalar& s() { return mScalar[0]; }
00098 T_Scalar& t() { return mScalar[1]; }
00099 T_Scalar& p() { return mScalar[2]; }
00100
00101 Vector2<T_Scalar> xy() const { return Vector2<T_Scalar>(x(),y()); }
00102 Vector2<T_Scalar> st() const { return Vector2<T_Scalar>(x(),y()); }
00103
00104 Vector3 operator+(const Vector3& other) const
00105 {
00106 return Vector3(x()+other.x(), y()+other.y(), z()+other.z());
00107 }
00108 Vector3 operator-(const Vector3& other) const
00109 {
00110 return Vector3(x()-other.x(), y()-other.y(), z()-other.z());
00111 }
00112 Vector3 operator*(const Vector3& other) const
00113 {
00114 return Vector3(x()*other.x(), y()*other.y(), z()*other.z());
00115 }
00116 Vector3 operator/(const Vector3& other) const
00117 {
00118 return Vector3(x()/other.x(), y()/other.y(), z()/other.z());
00119 }
00120 Vector3 operator+(T_Scalar val) const
00121 {
00122 return Vector3(x()+val, y()+val, z()+val);
00123 }
00124 Vector3 operator-(T_Scalar val) const
00125 {
00126 return Vector3(x()-val, y()-val, z()-val);
00127 }
00128 Vector3 operator*(T_Scalar val) const
00129 {
00130 return Vector3(x()*val, y()*val, z()*val);
00131 }
00132 Vector3 operator/(T_Scalar val) const
00133 {
00134 return Vector3(x()/val, y()/val, z()/val);
00135 }
00136 Vector3 operator-() const
00137 {
00138 return Vector3(-x(), -y(), -z());
00139 }
00140 Vector3& operator+=(const Vector3& other)
00141 {
00142 *this = *this + other;
00143 return *this;
00144 }
00145 Vector3& operator-=(const Vector3& other)
00146 {
00147 *this = *this - other;
00148 return *this;
00149 }
00150 Vector3& operator*=(const Vector3& other)
00151 {
00152 *this = *this * other;
00153 return *this;
00154 }
00155 Vector3& operator/=(const Vector3& other)
00156 {
00157 *this = *this / other;
00158 return *this;
00159 }
00160 Vector3& operator+=(T_Scalar val)
00161 {
00162 *this = *this + val;
00163 return *this;
00164 }
00165 Vector3& operator-=(T_Scalar val)
00166 {
00167 *this = *this - val;
00168 return *this;
00169 }
00170 Vector3& operator*=(T_Scalar val)
00171 {
00172 *this = *this * val;
00173 return *this;
00174 }
00175 Vector3& operator/=(T_Scalar val)
00176 {
00177 *this = *this / val;
00178 return *this;
00179 }
00180 Vector3& operator=(const Vector3& other)
00181 {
00182 x() = other.x();
00183 y() = other.y();
00184 z() = other.z();
00185 return *this;
00186 }
00187 Vector3& operator=(T_Scalar val)
00188 {
00189 x() = y() = z() = val;
00190 return *this;
00191 }
00192 bool operator==(const Vector3& other) const
00193 {
00194 return x() == other.x() && y() == other.y() && z() == other.z();
00195 }
00196 bool operator!=(const Vector3& other) const
00197 {
00198 return !operator==(other);
00199 }
00200 bool operator<(const Vector3& other) const
00201 {
00202 if (x() != other.x())
00203 return x() < other.x();
00204 else
00205 if (y() != other.y())
00206 return y() < other.y();
00207 else
00208 return z() < other.z();
00209 }
00210 T_Scalar& operator[](unsigned i) { return mScalar[i]; }
00211 const T_Scalar& operator[](unsigned i) const { return mScalar[i]; }
00212 T_Scalar length() const { return ::sqrt(x()*x()+y()*y()+z()*z()); }
00213 T_Scalar lengthSquared() const { return x()*x()+y()*y()+z()*z(); }
00214 bool isNull() const { return !x() && !y() && !z(); }
00215 const Vector3& normalize(T_Scalar *len=NULL)
00216 {
00217 T_Scalar l = length();
00218 if (len)
00219 *len = l;
00220 if (l)
00221 *this *= (T_Scalar)(1.0/l);
00222 return *this;
00223 }
00224
00225 protected:
00226 T_Scalar mScalar[scalar_count];
00227 };
00228
00229 template<typename T>
00230 inline const Vector3<T> operator*(T val, const Vector3<T>& v)
00231 {
00232 return v * val;
00233 }
00234
00236 typedef Vector3<int> ivec3;
00238 typedef Vector3<unsigned int> uvec3;
00240 typedef Vector3<float> fvec3;
00242 typedef Vector3<double> dvec3;
00244 typedef Vector3<char> bvec3;
00246 typedef Vector3<unsigned char> ubvec3;
00248 typedef Vector3<short> svec3;
00250 typedef Vector3<unsigned short> usvec3;
00251
00252 #if VL_PIPELINE_PRECISION == 2
00253
00254 typedef dvec3 vec3;
00255 #else
00256
00257 typedef fvec3 vec3;
00258 #endif
00259
00260 inline float dot(const fvec3& v1, const fvec3& v2) { return v1.x()*v2.x() + v1.y()*v2.y() + v1.z()*v2.z(); }
00261 inline double dot(const dvec3& v1, const dvec3& v2) { return v1.x()*v2.x() + v1.y()*v2.y() + v1.z()*v2.z(); }
00262 inline float dot(const ivec3& v1, const ivec3& v2) { return (float)(v1.x()*v2.x() + v1.y()*v2.y() + v1.z()*v2.z()); }
00263 inline float dot(const uvec3& v1, const uvec3& v2) { return (float)(v1.x()*v2.x() + v1.y()*v2.y() + v1.z()*v2.z()); }
00264
00265 inline fvec3 cross(const fvec3& v1, const fvec3& v2)
00266 {
00267 fvec3 t;
00268 t.x() = v1.y()*v2.z() - v1.z()*v2.y();
00269 t.y() = v1.z()*v2.x() - v1.x()*v2.z();
00270 t.z() = v1.x()*v2.y() - v1.y()*v2.x();
00271 return t;
00272 }
00273
00274 inline dvec3 cross(const dvec3& v1, const dvec3& v2)
00275 {
00276 dvec3 t;
00277 t.x() = v1.y()*v2.z() - v1.z()*v2.y();
00278 t.y() = v1.z()*v2.x() - v1.x()*v2.z();
00279 t.z() = v1.x()*v2.y() - v1.y()*v2.x();
00280 return t;
00281 }
00282
00283 inline fvec3 min(const fvec3& a, const fvec3& b)
00284 {
00285 return fvec3( a.x() < b.x() ? a.x() : b.x(),
00286 a.y() < b.y() ? a.y() : b.y(),
00287 a.z() < b.z() ? a.z() : b.z() );
00288 }
00289 inline fvec3 min(const fvec3& a, float b)
00290 {
00291 return fvec3( a.x() < b ? a.x() : b,
00292 a.y() < b ? a.y() : b,
00293 a.z() < b ? a.z() : b );
00294 }
00295 inline dvec3 min(const dvec3& a, const dvec3& b)
00296 {
00297 return dvec3( a.x() < b.x() ? a.x() : b.x(),
00298 a.y() < b.y() ? a.y() : b.y(),
00299 a.z() < b.z() ? a.z() : b.z() );
00300 }
00301 inline dvec3 min(const dvec3& a, double b)
00302 {
00303 return dvec3( a.x() < b ? a.x() : b,
00304 a.y() < b ? a.y() : b,
00305 a.z() < b ? a.z() : b );
00306 }
00307 inline ivec3 min(const ivec3& a, const ivec3& b)
00308 {
00309 return ivec3( a.x() < b.x() ? a.x() : b.x(),
00310 a.y() < b.y() ? a.y() : b.y(),
00311 a.z() < b.z() ? a.z() : b.z() );
00312 }
00313 inline ivec3 min(const ivec3& a, int b)
00314 {
00315 return ivec3( a.x() < b ? a.x() : b,
00316 a.y() < b ? a.y() : b,
00317 a.z() < b ? a.z() : b );
00318 }
00319 inline uvec3 min(const uvec3& a, const uvec3& b)
00320 {
00321 return uvec3( a.x() < b.x() ? a.x() : b.x(),
00322 a.y() < b.y() ? a.y() : b.y(),
00323 a.z() < b.z() ? a.z() : b.z() );
00324 }
00325 inline uvec3 min(const uvec3& a, unsigned int b)
00326 {
00327 return uvec3( a.x() < b ? a.x() : b,
00328 a.y() < b ? a.y() : b,
00329 a.z() < b ? a.z() : b );
00330 }
00331 inline fvec3 max(const fvec3& a, const fvec3& b)
00332 {
00333 return fvec3( a.x() > b.x() ? a.x() : b.x(),
00334 a.y() > b.y() ? a.y() : b.y(),
00335 a.z() > b.z() ? a.z() : b.z() );
00336 }
00337 inline fvec3 max(const fvec3& a, float b)
00338 {
00339 return fvec3( a.x() > b ? a.x() : b,
00340 a.y() > b ? a.y() : b,
00341 a.z() > b ? a.z() : b );
00342 }
00343 inline dvec3 max(const dvec3& a, const dvec3& b)
00344 {
00345 return dvec3( a.x() > b.x() ? a.x() : b.x(),
00346 a.y() > b.y() ? a.y() : b.y(),
00347 a.z() > b.z() ? a.z() : b.z() );
00348 }
00349 inline dvec3 max(const dvec3& a, double b)
00350 {
00351 return dvec3( a.x() > b ? a.x() : b,
00352 a.y() > b ? a.y() : b,
00353 a.z() > b ? a.z() : b );
00354 }
00355 inline ivec3 max(const ivec3& a, const ivec3& b)
00356 {
00357 return ivec3( a.x() > b.x() ? a.x() : b.x(),
00358 a.y() > b.y() ? a.y() : b.y(),
00359 a.z() > b.z() ? a.z() : b.z() );
00360 }
00361 inline ivec3 max(const ivec3& a, int b)
00362 {
00363 return ivec3( a.x() > b ? a.x() : b,
00364 a.y() > b ? a.y() : b,
00365 a.z() > b ? a.z() : b );
00366 }
00367 inline uvec3 max(const uvec3& a, const uvec3& b)
00368 {
00369 return uvec3( a.x() > b.x() ? a.x() : b.x(),
00370 a.y() > b.y() ? a.y() : b.y(),
00371 a.z() > b.z() ? a.z() : b.z() );
00372 }
00373 inline uvec3 max(const uvec3& a, unsigned int b)
00374 {
00375 return uvec3( a.x() > b ? a.x() : b,
00376 a.y() > b ? a.y() : b,
00377 a.z() > b ? a.z() : b );
00378 }
00379 inline fvec3 clamp(const fvec3& x, float minval, float maxval) { return min(max(x,minval),maxval); }
00380 inline fvec3 clamp(const fvec3& x, const fvec3& minval, const fvec3& maxval) { return min(max(x,minval),maxval); }
00381 inline ivec3 clamp(const ivec3& x, const ivec3& minval, const ivec3& maxval) { return min(max(x,minval),maxval); }
00382 inline dvec3 clamp(const dvec3& x, double minval, double maxval) { return min(max(x,minval),maxval); }
00383 inline dvec3 clamp(const dvec3& x, const dvec3& minval, const dvec3& maxval) { return min(max(x,minval),maxval); }
00384 inline ivec3 clamp(const ivec3& x, int minval, int maxval) { return min(max(x,minval),maxval); }
00385 inline uvec3 clamp(const uvec3& x, unsigned int minval, unsigned int maxval) { return min(max(x,minval),maxval); }
00386 inline uvec3 clamp(const uvec3& x, const uvec3& minval, const uvec3& maxval) { return min(max(x,minval),maxval); }
00387 }
00388
00389 #endif