CrystalSpace

Public API Reference

csgeom/transfrm.h

Go to the documentation of this file.
00001 /*
00002     Copyright (C) 1998-2001 by Jorrit Tyberghein
00003     Largely rewritten by Ivan Avramovic <[email protected]>
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_TRANSFORM_H__
00021 #define __CS_TRANSFORM_H__
00022 
00030 #include "csextern.h"
00031 
00032 
00033 #include "csgeom/matrix3.h"
00034 #include "csgeom/vector3.h"
00035 
00036 class csPlane3;
00037 class csSphere;
00038 
00039 class csReversibleTransform;
00040 
00047 class CS_CRYSTALSPACE_EXPORT csTransform
00048 {
00049 protected:
00051   csMatrix3 m_o2t;
00053   csVector3 v_o2t;
00054 
00055 public:
00056   // Needed for GCC4. Otherwise emits a flood of "virtual functions but
00057   // non-virtual destructor" warnings.
00058   virtual ~csTransform() {}
00062   csTransform () : m_o2t (), v_o2t (0, 0, 0) {}
00063 
00071   csTransform (const csMatrix3& other2this, const csVector3& origin_pos) :
00072         m_o2t (other2this), v_o2t (origin_pos) {}
00073 
00077   inline void Identity ()
00078   {
00079     SetO2TTranslation (csVector3 (0));
00080     SetO2T (csMatrix3 ());
00081   }
00082 
00087   inline bool IsIdentity () const
00088   {
00089     if (ABS (v_o2t.x) >= SMALL_EPSILON) return false;
00090     if (ABS (v_o2t.y) >= SMALL_EPSILON) return false;
00091     if (ABS (v_o2t.z) >= SMALL_EPSILON) return false;
00092     if (ABS (m_o2t.m11-1) >= SMALL_EPSILON) return false;
00093     if (ABS (m_o2t.m12) >= SMALL_EPSILON) return false;
00094     if (ABS (m_o2t.m13) >= SMALL_EPSILON) return false;
00095     if (ABS (m_o2t.m21) >= SMALL_EPSILON) return false;
00096     if (ABS (m_o2t.m22-1) >= SMALL_EPSILON) return false;
00097     if (ABS (m_o2t.m23) >= SMALL_EPSILON) return false;
00098     if (ABS (m_o2t.m31) >= SMALL_EPSILON) return false;
00099     if (ABS (m_o2t.m32) >= SMALL_EPSILON) return false;
00100     if (ABS (m_o2t.m33-1) >= SMALL_EPSILON) return false;
00101     return true;
00102   }
00103 
00108   inline const csMatrix3& GetO2T () const { return m_o2t; }
00109 
00115   inline const csVector3& GetO2TTranslation () const { return v_o2t; }
00116 
00122   inline const csVector3& GetOrigin () const { return v_o2t; }
00123 
00128   virtual void SetO2T (const csMatrix3& m) { m_o2t = m; }
00129 
00135   virtual void SetO2TTranslation (const csVector3& v) { v_o2t = v; }
00136 
00141   inline void SetOrigin (const csVector3& v) { SetO2TTranslation (v); }
00142 
00148   inline void Translate (const csVector3& v) { SetO2TTranslation (v_o2t + v); }
00149 
00155   inline csVector3 Other2This (const csVector3& v) const
00156   {
00157     return m_o2t * (v - v_o2t);
00158   }
00159 
00165   inline csVector3 Other2ThisRelative (const csVector3& v) const
00166   { return m_o2t * v; }
00167 
00173   csPlane3 Other2This (const csPlane3& p) const;
00174 
00181   csPlane3 Other2ThisRelative (const csPlane3& p) const;
00182 
00190   void Other2This (const csPlane3& p, const csVector3& point,
00191         csPlane3& result) const;
00192 
00196   csSphere Other2This (const csSphere& s) const;
00197 
00202   friend CS_CRYSTALSPACE_EXPORT csVector3 operator* (const csVector3& v, 
00203     const csTransform& t);
00204 
00209   friend CS_CRYSTALSPACE_EXPORT csVector3 operator* (const csTransform& t, 
00210     const csVector3& v);
00211 
00216   friend CS_CRYSTALSPACE_EXPORT csVector3& operator*= (csVector3& v, 
00217     const csTransform& t);
00218 
00223   friend CS_CRYSTALSPACE_EXPORT csPlane3 operator* (const csPlane3& p, 
00224     const csTransform& t);
00225 
00230   friend CS_CRYSTALSPACE_EXPORT csPlane3 operator* (const csTransform& t, 
00231     const csPlane3& p);
00232 
00237   friend CS_CRYSTALSPACE_EXPORT csPlane3& operator*= (csPlane3& p, 
00238     const csTransform& t);
00239 
00244   friend CS_CRYSTALSPACE_EXPORT csSphere operator* (const csSphere& p, 
00245     const csTransform& t);
00246 
00251   friend CS_CRYSTALSPACE_EXPORT csSphere operator* (const csTransform& t, 
00252     const csSphere& p);
00253 
00258   friend CS_CRYSTALSPACE_EXPORT csSphere& operator*= (csSphere& p, 
00259     const csTransform& t);
00260 
00265   friend CS_CRYSTALSPACE_EXPORT csMatrix3 operator* (const csMatrix3& m, 
00266     const csTransform& t);
00267 
00272   friend CS_CRYSTALSPACE_EXPORT csMatrix3 operator* (const csTransform& t, 
00273     const csMatrix3& m);
00274 
00279   friend CS_CRYSTALSPACE_EXPORT csMatrix3& operator*= (csMatrix3& m, 
00280     const csTransform& t);
00281 
00292   friend CS_CRYSTALSPACE_EXPORT csTransform operator* (const csTransform& t1,
00293                               const csReversibleTransform& t2);
00294 
00300   static csTransform GetReflect (const csPlane3& pl);
00301 
00307   csVector3 GetFront () const
00308   { 
00309     return csVector3 (m_o2t.m31, m_o2t.m32, m_o2t.m33); 
00310   }
00311 
00317   csVector3 GetUp () const
00318   {
00319     return csVector3 (m_o2t.m21, m_o2t.m22, m_o2t.m23); 
00320   }
00321 
00327   csVector3 GetRight () const 
00328   {
00329     return csVector3 (m_o2t.m11, m_o2t.m12, m_o2t.m13); 
00330   }
00331 };
00332 
00344 class CS_CRYSTALSPACE_EXPORT csReversibleTransform : public csTransform
00345 {
00346 protected:
00348   csMatrix3 m_t2o;
00349 
00353   csReversibleTransform (const csMatrix3& o2t, const csMatrix3& t2o,
00354     const csVector3& pos) : csTransform (o2t,pos), m_t2o (t2o) {}
00355 
00356 public:
00360   csReversibleTransform () : csTransform (), m_t2o () {}
00361 
00369   csReversibleTransform (const csMatrix3& o2t, const csVector3& pos) :
00370     csTransform (o2t,pos) { m_t2o = m_o2t.GetInverse (); }
00371 
00375   csReversibleTransform (const csTransform& t) :
00376     csTransform (t) { m_t2o = m_o2t.GetInverse (); }
00377 
00381   csReversibleTransform (const csReversibleTransform& t) :
00382     csTransform (t) { m_t2o = t.m_t2o; }
00383 
00388   inline const csMatrix3& GetT2O () const { return m_t2o; }
00389 
00394   inline csVector3 GetT2OTranslation () const { return -m_o2t*v_o2t; }
00395 
00399   csReversibleTransform GetInverse () const
00400   { return csReversibleTransform (m_t2o, m_o2t, -m_o2t*v_o2t); }
00401 
00406   virtual void SetO2T (const csMatrix3& m)
00407   { m_o2t = m;  m_t2o = m_o2t.GetInverse (); }
00408 
00414   virtual void SetT2O (const csMatrix3& m)
00415   { m_t2o = m;  m_o2t = m_t2o.GetInverse (); }
00416 
00422   inline csVector3 This2Other (const csVector3& v) const
00423   { return v_o2t + m_t2o * v; }
00424 
00430   inline csVector3 This2OtherRelative (const csVector3& v) const
00431   { return m_t2o * v; }
00432 
00439   csPlane3 This2Other (const csPlane3& p) const;
00440 
00447   csPlane3 This2OtherRelative (const csPlane3& p) const;
00448 
00457   void This2Other (const csPlane3& p, const csVector3& point,
00458         csPlane3& result) const;
00459 
00463   csSphere This2Other (const csSphere& s) const;
00464 
00470   void RotateOther (const csVector3& v, float angle);
00471 
00477   void RotateThis (const csVector3& v, float angle);
00478 
00486   void RotateOther (const csMatrix3& m) { SetT2O (m * m_t2o); }
00487 
00495   void RotateThis (const csMatrix3& m) { SetT2O (m_t2o * m); }
00496 
00505   void LookAt (const csVector3& v, const csVector3& up);
00506 
00511   friend CS_CRYSTALSPACE_EXPORT csVector3 operator/ (const csVector3& v,
00512         const csReversibleTransform& t);
00513 
00518   friend CS_CRYSTALSPACE_EXPORT csVector3& operator/= (csVector3& v, 
00519     const csReversibleTransform& t);
00520 
00525   friend CS_CRYSTALSPACE_EXPORT csPlane3 operator/ (const csPlane3& p, 
00526     const csReversibleTransform& t);
00527 
00532   friend CS_CRYSTALSPACE_EXPORT csPlane3& operator/= (csPlane3& p, 
00533     const csReversibleTransform& t);
00534 
00539   friend CS_CRYSTALSPACE_EXPORT csSphere operator/ (const csSphere& p, 
00540     const csReversibleTransform& t);
00541 
00553   friend csReversibleTransform& operator*= (csReversibleTransform& t1,
00554                                           const csReversibleTransform& t2)
00555   {
00556     t1.v_o2t = t2.m_t2o*t1.v_o2t;
00557     t1.v_o2t += t2.v_o2t;
00558     t1.m_o2t *= t2.m_o2t;
00559     t1.m_t2o *= t1.m_t2o;
00560     return t1;
00561   }
00562 
00574   friend csReversibleTransform operator* (const csReversibleTransform& t1,
00575                                         const csReversibleTransform& t2)
00576   {
00577     return csReversibleTransform (t1.m_o2t*t2.m_o2t, t2.m_t2o*t1.m_t2o,
00578                              t2.v_o2t + t2.m_t2o*t1.v_o2t);
00579   }
00580 
00581 #if !defined(SWIG) /* Otherwise Swig 1.3.22 thinks this is multiply declared */
00582 
00593   friend CS_CRYSTALSPACE_EXPORT csTransform operator* (const csTransform& t1,
00594                               const csReversibleTransform& t2);
00595 #endif
00596 
00608   friend CS_CRYSTALSPACE_EXPORT csReversibleTransform& operator/= (
00609     csReversibleTransform& t1, const csReversibleTransform& t2);
00610 
00622   friend CS_CRYSTALSPACE_EXPORT csReversibleTransform operator/ (
00623     const csReversibleTransform& t1, const csReversibleTransform& t2);
00624 };
00625 
00632 class csOrthoTransform : public csReversibleTransform
00633 {
00634 public:
00638   csOrthoTransform () : csReversibleTransform () {}
00639 
00643   csOrthoTransform (const csMatrix3& o2t, const csVector3& pos) :
00644     csReversibleTransform (o2t, o2t.GetTranspose (), pos) { }
00645 
00649   csOrthoTransform (const csTransform& t) :
00650     csReversibleTransform (t.GetO2T (), t.GetO2T ().GetTranspose (),
00651         t.GetO2TTranslation ())
00652   { }
00653 
00658   virtual void SetO2T (const csMatrix3& m)
00659   { m_o2t = m;  m_t2o = m_o2t.GetTranspose (); }
00660 
00666   virtual void SetT2O (const csMatrix3& m)
00667   { m_t2o = m;  m_o2t = m_t2o.GetTranspose (); }
00668 };
00669 
00672 #endif // __CS_TRANSFORM_H__
00673 

Generated for Crystal Space by doxygen 1.4.7