00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __CS_VECTOR3_H__
00021 #define __CS_VECTOR3_H__
00022
00030 #include "csextern.h"
00031 #include "csgeom/math3d_d.h"
00032 #include "csqsqrt.h"
00033
00034 class csString;
00035
00040 enum
00041 {
00043 CS_AXIS_NONE = -1,
00045 CS_AXIS_X = 0,
00047 CS_AXIS_Y = 1,
00049 CS_AXIS_Z = 2,
00051 CS_AXIS_W = 3
00052 };
00053
00057 class CS_CRYSTALSPACE_EXPORT csVector3
00058 {
00059 public:
00060
00061 #if !defined(__STRICT_ANSI__) && !defined(SWIG)
00062 union
00063 {
00064 struct
00065 {
00066 #endif
00067
00068 float x;
00070 float y;
00072 float z;
00073 #if !defined(__STRICT_ANSI__) && !defined(SWIG)
00074 };
00076 float m[3];
00077 };
00078 #endif
00079
00085 csVector3 ()
00086 {}
00087
00093 csVector3 (float m)
00094 : x(m), y(m), z(m)
00095 {}
00096
00098 csVector3 (float ix, float iy, float iz = 0)
00099 : x(ix), y(iy), z(iz)
00100 {}
00101
00103 csVector3 (const csVector3& v)
00104 : x(v.x), y(v.y), z(v.z)
00105 {}
00106
00108 csVector3 (const csDVector3&);
00109
00111 csString Description() const;
00112
00114 inline friend csVector3 operator+(const csVector3& v1, const csVector3& v2)
00115 { return csVector3(v1.x+v2.x, v1.y+v2.y, v1.z+v2.z); }
00116
00118 inline friend csDVector3 operator+(const csDVector3& v1, const csVector3& v2)
00119 { return csDVector3(v1.x+v2.x, v1.y+v2.y, v1.z+v2.z); }
00120
00122 inline friend csDVector3 operator+(const csVector3& v1, const csDVector3& v2)
00123 { return csDVector3(v1.x+v2.x, v1.y+v2.y, v1.z+v2.z); }
00124
00126 inline friend csVector3 operator-(const csVector3& v1, const csVector3& v2)
00127 { return csVector3(v1.x-v2.x, v1.y-v2.y, v1.z-v2.z); }
00128
00130 inline friend csDVector3 operator-(const csVector3& v1, const csDVector3& v2)
00131 { return csDVector3(v1.x-v2.x, v1.y-v2.y, v1.z-v2.z); }
00132
00134 inline friend csDVector3 operator-(const csDVector3& v1, const csVector3& v2)
00135 { return csDVector3(v1.x-v2.x, v1.y-v2.y, v1.z-v2.z); }
00136
00138 inline friend float operator*(const csVector3& v1, const csVector3& v2)
00139 { return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z; }
00140
00142 inline friend csVector3 operator%(const csVector3& v1, const csVector3& v2)
00143 {
00144 return csVector3 (v1.y*v2.z-v1.z*v2.y,
00145 v1.z*v2.x-v1.x*v2.z,
00146 v1.x*v2.y-v1.y*v2.x);
00147 }
00148
00150 void Cross (const csVector3 & px, const csVector3 & py)
00151 {
00152 x = px.y*py.z - px.z*py.y;
00153 y = px.z*py.x - px.x*py.z;
00154 z = px.x*py.y - px.y*py.x;
00155 }
00156
00158 inline friend csVector3 operator* (const csVector3& v, float f)
00159 { return csVector3 (v.x*f, v.y*f, v.z*f); }
00160
00162 inline friend csVector3 operator* (float f, const csVector3& v)
00163 { return csVector3 (v.x*f, v.y*f, v.z*f); }
00164
00166 inline friend csDVector3 operator* (const csVector3& v, double f)
00167 { return csDVector3 (v) * f; }
00168
00170 inline friend csDVector3 operator* (double f, const csVector3& v)
00171 { return csDVector3 (v) * f; }
00172
00174 inline friend csVector3 operator* (const csVector3& v, int f)
00175 { return v * (float)f; }
00176
00178 inline friend csVector3 operator* (int f, const csVector3& v)
00179 { return v * (float)f; }
00180
00182 inline friend csVector3 operator/ (const csVector3& v, float f)
00183 { f = 1.0f/f; return csVector3 (v.x*f, v.y*f, v.z*f); }
00184
00186 inline friend csDVector3 operator/ (const csVector3& v, double f)
00187 { return csDVector3 (v) / f; }
00188
00190 inline friend csVector3 operator/ (const csVector3& v, int f)
00191 { return v / (float)f; }
00192
00194 inline friend bool operator== (const csVector3& v1, const csVector3& v2)
00195 { return v1.x==v2.x && v1.y==v2.y && v1.z==v2.z; }
00196
00198 inline friend bool operator!= (const csVector3& v1, const csVector3& v2)
00199 { return v1.x!=v2.x || v1.y!=v2.y || v1.z!=v2.z; }
00200
00202 inline friend csVector3 operator>> (const csVector3& v1, const csVector3& v2)
00203 { return v2*(v1*v2)/(v2*v2); }
00204
00206 inline friend csVector3 operator<< (const csVector3& v1, const csVector3& v2)
00207 { return v1*(v1*v2)/(v1*v1); }
00208
00210 inline friend bool operator< (const csVector3& v, float f)
00211 { return ABS(v.x)<f && ABS(v.y)<f && ABS(v.z)<f; }
00212
00214 inline friend bool operator> (float f, const csVector3& v)
00215 { return f>ABS(v.x) && f>ABS(v.y) && f>ABS(v.z); }
00216
00218 #if defined( __STRICT_ANSI__) || defined(SWIG)
00219 inline float operator[] (size_t n) const { return !n?x:n&1?y:z; }
00220 #else
00221 inline float operator[] (size_t n) const { return m[n]; }
00222 #endif
00223
00225 #if defined( __STRICT_ANSI__) || defined(SWIG)
00226 inline float & operator[] (size_t n) { return !n?x:n&1?y:z; }
00227 #else
00228 inline float & operator[] (size_t n) { return m[n]; }
00229 #endif
00230
00232 inline csVector3& operator+= (const csVector3& v)
00233 {
00234 x += v.x;
00235 y += v.y;
00236 z += v.z;
00237
00238 return *this;
00239 }
00240
00242 inline csVector3& operator-= (const csVector3& v)
00243 {
00244 x -= v.x;
00245 y -= v.y;
00246 z -= v.z;
00247
00248 return *this;
00249 }
00250
00252 inline csVector3& operator*= (float f)
00253 { x *= f; y *= f; z *= f; return *this; }
00254
00256 inline csVector3& operator/= (float f)
00257 { f = 1.0f / f; x *= f; y *= f; z *= f; return *this; }
00258
00260 inline csVector3 operator+ () const { return *this; }
00261
00263 inline csVector3 operator- () const { return csVector3(-x,-y,-z); }
00264
00266 inline void Set (float sx, float sy, float sz) { x = sx; y = sy; z = sz; }
00267
00269 inline void Set (csVector3 const& v) { x = v.x; y = v.y; z = v.z; }
00270
00272 inline void Set (float const* v) { x = v[0]; y = v[1]; z = v[2]; }
00273
00275 inline void Set (float v) { x = y = z = v; }
00276
00278 inline void Get (float* v) const { v[0] = x; v[1] = y; v[2] = z; }
00279
00281 inline float Norm () const
00282 { return csQsqrt(SquaredNorm()); }
00283
00285 inline float InverseNorm () const
00286 { return csQisqrt(SquaredNorm()); }
00287
00289 inline float SquaredNorm () const
00290 { return x * x + y * y + z * z; }
00291
00297 inline csVector3 Unit () const
00298 { return (*this)*(this->InverseNorm()); }
00299
00301 inline static float Norm (const csVector3& v)
00302 { return v.Norm(); }
00303
00305 inline static csVector3 Unit (const csVector3& v)
00306 { return v.Unit(); }
00307
00309 inline void Normalize ()
00310 {
00311 float sqlen = SquaredNorm();
00312 if (sqlen < SMALL_EPSILON) return ;
00313
00314 float invlen = csQisqrt (sqlen);
00315 *this *= invlen;
00316 }
00317
00319 inline bool IsZero (float precision = SMALL_EPSILON) const
00320 {
00321 return (fabsf(x) < precision) && (fabsf(y) < precision)
00322 && (fabsf(z) < precision);
00323 }
00324
00326 inline csVector3 UnitAxisClamped () const
00327 {
00328 if (IsZero ())
00329 return csVector3 (0, 0, 0);
00330
00331 if (fabsf (x) > fabsf (y) && fabsf (x) > fabsf (z))
00332 return csVector3 (x / fabsf (x), 0, 0);
00333 else if (fabsf (y) > fabsf (z))
00334 return csVector3 (0, y / fabsf (y), 0);
00335 else
00336 return csVector3 (0, 0, z / fabsf (z));
00337 }
00338
00340 inline int DominantAxis () const
00341 {
00342 if (fabsf (x) > fabsf (y) && fabsf (x) > fabsf (z))
00343 return CS_AXIS_X;
00344 else if (fabsf (y) > fabsf (z))
00345 return CS_AXIS_Y;
00346 else
00347 return CS_AXIS_Z;
00348 }
00349 };
00350
00353 #endif // __CS_VECTOR3_H__