csgeom/vector3.h Source File (Crystal Space 2.0 Public API Reference)

| ## Public API Reference

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

csgeom/vector3.h
Go to the documentation of this file.

    00001 /*
    00002     Copyright (C) 1998,1999,2000 by Jorrit Tyberghein
    00003     Largely rewritten by Ivan Avramovic <ivan@avramovic.com>
    00004
    00005     This library is free software; you can redistribute it and/or
    00006     modify it under the terms of the GNU Library General Public
    00007     License as published by the Free Software Foundation; either
    00008     version 2 of the License, or (at your option) any later version.
    00009
    00010     This library is distributed in the hope that it will be useful,
    00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
    00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    00013     Library General Public License for more details.
    00014
    00015     You should have received a copy of the GNU Library General Public
    00016     License along with this library; if not, write to the Free
    00017     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
    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); //X biggest
    00333     else if (fabsf (y) > fabsf (z))
    00334       return csVector3 (0, y / fabsf (y), 0); //Y biggest
    00335     else
    00336       return csVector3 (0, 0, z / fabsf (z)); //Z biggest
    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__