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 <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_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 class csBox3;
00039 
00040 class csReversibleTransform;
00041 
00048 class CS_CRYSTALSPACE_EXPORT csTransform
00049 {
00050 protected:
00052   csMatrix3 m_o2t;
00054   csVector3 v_o2t;
00055 
00056 public:
00057   // Needed for GCC4. Otherwise emits a flood of "virtual functions but
00058   // non-virtual destructor" warnings.
00059   virtual ~csTransform() {}
00063   csTransform () : m_o2t (), v_o2t (0, 0, 0) {}
00064 
00072   csTransform (const csMatrix3& other2this, const csVector3& origin_pos) :
00073         m_o2t (other2this), v_o2t (origin_pos) {}
00074 
00076   csString Description() const;
00077   
00081   inline void Identity ()
00082   {
00083     SetO2TTranslation (csVector3 (0));
00084     SetO2T (csMatrix3 ());
00085   }
00086 
00091   inline bool IsIdentity () const
00092   {
00093     if (ABS (v_o2t.x) >= SMALL_EPSILON) return false;
00094     if (ABS (v_o2t.y) >= SMALL_EPSILON) return false;
00095     if (ABS (v_o2t.z) >= SMALL_EPSILON) return false;
00096     if (ABS (m_o2t.m11-1) >= SMALL_EPSILON) return false;
00097     if (ABS (m_o2t.m12) >= SMALL_EPSILON) return false;
00098     if (ABS (m_o2t.m13) >= SMALL_EPSILON) return false;
00099     if (ABS (m_o2t.m21) >= SMALL_EPSILON) return false;
00100     if (ABS (m_o2t.m22-1) >= SMALL_EPSILON) return false;
00101     if (ABS (m_o2t.m23) >= SMALL_EPSILON) return false;
00102     if (ABS (m_o2t.m31) >= SMALL_EPSILON) return false;
00103     if (ABS (m_o2t.m32) >= SMALL_EPSILON) return false;
00104     if (ABS (m_o2t.m33-1) >= SMALL_EPSILON) return false;
00105     return true;
00106   }
00107 
00112   inline const csMatrix3& GetO2T () const { return m_o2t; }
00113 
00119   inline const csVector3& GetO2TTranslation () const { return v_o2t; }
00120 
00126   inline const csVector3& GetOrigin () const { return v_o2t; }
00127 
00132   virtual void SetO2T (const csMatrix3& m) { m_o2t = m; }
00133 
00139   virtual void SetO2TTranslation (const csVector3& v) { v_o2t = v; }
00140 
00145   inline void SetOrigin (const csVector3& v) { SetO2TTranslation (v); }
00146 
00152   inline void Translate (const csVector3& v) { SetO2TTranslation (v_o2t + v); }
00153 
00159   inline csVector3 Other2This (const csVector3& v) const
00160   {
00161     return m_o2t * (v - v_o2t);
00162   }
00163 
00169   inline csVector3 Other2ThisRelative (const csVector3& v) const
00170   { return m_o2t * v; }
00171 
00177   csPlane3 Other2This (const csPlane3& p) const;
00178 
00185   csPlane3 Other2ThisRelative (const csPlane3& p) const;
00186 
00194   void Other2This (const csPlane3& p, const csVector3& point,
00195         csPlane3& result) const;
00196 
00200   csSphere Other2This (const csSphere& s) const;
00201 
00205   csBox3 Other2This (const csBox3& box) const;
00206 
00211   friend CS_CRYSTALSPACE_EXPORT csVector3 operator* (const csVector3& v, 
00212     const csTransform& t);
00213 
00218   friend CS_CRYSTALSPACE_EXPORT csVector3 operator* (const csTransform& t, 
00219     const csVector3& v);
00220 
00225   friend CS_CRYSTALSPACE_EXPORT csVector3& operator*= (csVector3& v, 
00226     const csTransform& t);
00227 
00232   friend CS_CRYSTALSPACE_EXPORT csPlane3 operator* (const csPlane3& p, 
00233     const csTransform& t);
00234 
00239   friend CS_CRYSTALSPACE_EXPORT csPlane3 operator* (const csTransform& t, 
00240     const csPlane3& p);
00241 
00246   friend CS_CRYSTALSPACE_EXPORT csPlane3& operator*= (csPlane3& p, 
00247     const csTransform& t);
00248 
00253   friend CS_CRYSTALSPACE_EXPORT csSphere operator* (const csSphere& p, 
00254     const csTransform& t);
00255 
00260   friend CS_CRYSTALSPACE_EXPORT csSphere operator* (const csTransform& t, 
00261     const csSphere& p);
00262 
00267   friend CS_CRYSTALSPACE_EXPORT csSphere& operator*= (csSphere& p, 
00268     const csTransform& t);
00269 
00274   friend CS_CRYSTALSPACE_EXPORT csBox3 operator* (const csBox3& p, 
00275     const csTransform& t);
00276 
00281   friend CS_CRYSTALSPACE_EXPORT csBox3 operator* (const csTransform& t, 
00282     const csBox3& p);
00283 
00288   friend CS_CRYSTALSPACE_EXPORT csBox3& operator*= (csBox3& p, 
00289     const csTransform& t);
00290 
00295   friend CS_CRYSTALSPACE_EXPORT csMatrix3 operator* (const csMatrix3& m, 
00296     const csTransform& t);
00297 
00302   friend CS_CRYSTALSPACE_EXPORT csMatrix3 operator* (const csTransform& t, 
00303     const csMatrix3& m);
00304 
00309   friend CS_CRYSTALSPACE_EXPORT csMatrix3& operator*= (csMatrix3& m, 
00310     const csTransform& t);
00311 
00322   friend CS_CRYSTALSPACE_EXPORT csTransform operator* (const csTransform& t1,
00323                               const csReversibleTransform& t2);
00324 
00330   static csTransform GetReflect (const csPlane3& pl);
00331 
00337   csVector3 GetFront () const
00338   { 
00339     return csVector3 (m_o2t.m31, m_o2t.m32, m_o2t.m33); 
00340   }
00341   void SetFront (const csVector3& v)
00342   {
00343     m_o2t.m31 = v.x;
00344     m_o2t.m32 = v.y;
00345     m_o2t.m33 = v.z;
00346   }
00347 
00353   csVector3 GetUp () const
00354   {
00355     return csVector3 (m_o2t.m21, m_o2t.m22, m_o2t.m23); 
00356   }
00357   void SetUp (const csVector3& v)
00358   {
00359     m_o2t.m21 = v.x;
00360     m_o2t.m22 = v.y;
00361     m_o2t.m23 = v.z;
00362   }
00363 
00369   csVector3 GetRight () const 
00370   {
00371     return csVector3 (m_o2t.m11, m_o2t.m12, m_o2t.m13); 
00372   }
00373   void SetRight (const csVector3& v)
00374   {
00375     m_o2t.m11 = v.x;
00376     m_o2t.m12 = v.y;
00377     m_o2t.m13 = v.z;
00378   }
00379 };
00380 
00392 class CS_CRYSTALSPACE_EXPORT csReversibleTransform : public csTransform
00393 {
00394 protected:
00396   csMatrix3 m_t2o;
00397 
00401   csReversibleTransform (const csMatrix3& o2t, const csMatrix3& t2o,
00402     const csVector3& pos) : csTransform (o2t,pos), m_t2o (t2o) {}
00403 
00404 private:
00405   bool LookAtGeneric (const csVector3 &v, const csVector3 &upNeg,
00406       csVector3& w1, csVector3& w2, csVector3& w3);
00407 
00408 public:
00412   csReversibleTransform () : csTransform (), m_t2o () {}
00413 
00421   csReversibleTransform (const csMatrix3& o2t, const csVector3& pos) :
00422     csTransform (o2t,pos) { m_t2o = m_o2t.GetInverse (); }
00423 
00427   csReversibleTransform (const csTransform& t) :
00428     csTransform (t) { m_t2o = m_o2t.GetInverse (); }
00429 
00433   csReversibleTransform (const csReversibleTransform& t) :
00434     csTransform (t) { m_t2o = t.m_t2o; }
00435 
00440   inline const csMatrix3& GetT2O () const { return m_t2o; }
00441 
00446   inline csVector3 GetT2OTranslation () const { return -m_o2t*v_o2t; }
00447 
00451   csReversibleTransform GetInverse () const
00452   { return csReversibleTransform (m_t2o, m_o2t, -m_o2t*v_o2t); }
00453 
00458   virtual void SetO2T (const csMatrix3& m)
00459   { m_o2t = m;  m_t2o = m_o2t.GetInverse (); }
00460 
00466   virtual void SetT2O (const csMatrix3& m)
00467   { m_t2o = m;  m_o2t = m_t2o.GetInverse (); }
00468 
00474   inline csVector3 This2Other (const csVector3& v) const
00475   { return v_o2t + m_t2o * v; }
00476 
00482   inline csVector3 This2OtherRelative (const csVector3& v) const
00483   { return m_t2o * v; }
00484 
00491   csPlane3 This2Other (const csPlane3& p) const;
00492 
00499   csPlane3 This2OtherRelative (const csPlane3& p) const;
00500 
00509   void This2Other (const csPlane3& p, const csVector3& point,
00510         csPlane3& result) const;
00511 
00515   csSphere This2Other (const csSphere& s) const;
00516 
00520   csBox3 This2Other (const csBox3& box) const;
00521 
00527   void RotateOther (const csVector3& v, float angle);
00528 
00534   void RotateThis (const csVector3& v, float angle);
00535 
00543   void RotateOther (const csMatrix3& m) { SetT2O (m * m_t2o); }
00544 
00552   void RotateThis (const csMatrix3& m) { SetT2O (m_t2o * m); }
00553 
00568   bool LookAt (const csVector3& v, const csVector3& up);
00569 
00575   bool LookAtZUpY (const csVector3& v, const csVector3& up);
00581   bool LookAtZUpX (const csVector3& v, const csVector3& up);
00587   bool LookAtYUpZ (const csVector3& v, const csVector3& up);
00593   bool LookAtYUpX (const csVector3& v, const csVector3& up);
00599   bool LookAtXUpZ (const csVector3& v, const csVector3& up);
00605   bool LookAtXUpY (const csVector3& v, const csVector3& up);
00606 
00611   friend CS_CRYSTALSPACE_EXPORT csVector3 operator/ (const csVector3& v,
00612         const csReversibleTransform& t);
00613 
00618   friend CS_CRYSTALSPACE_EXPORT csVector3& operator/= (csVector3& v, 
00619     const csReversibleTransform& t);
00620 
00625   friend CS_CRYSTALSPACE_EXPORT csPlane3 operator/ (const csPlane3& p, 
00626     const csReversibleTransform& t);
00627 
00632   friend CS_CRYSTALSPACE_EXPORT csPlane3& operator/= (csPlane3& p, 
00633     const csReversibleTransform& t);
00634 
00639   friend CS_CRYSTALSPACE_EXPORT csSphere operator/ (const csSphere& p, 
00640     const csReversibleTransform& t);
00641 
00646   friend CS_CRYSTALSPACE_EXPORT csBox3 operator/ (const csBox3& p, 
00647     const csReversibleTransform& t);
00648 
00660   friend csReversibleTransform& operator*= (csReversibleTransform& t1,
00661                                           const csReversibleTransform& t2)
00662   {
00663     t1.v_o2t = t2.m_t2o*t1.v_o2t;
00664     t1.v_o2t += t2.v_o2t;
00665     t1.m_o2t *= t2.m_o2t;
00666     t1.m_t2o = t2.m_t2o * t1.m_t2o;
00667     return t1;
00668   }
00669 
00681   friend csReversibleTransform operator* (const csReversibleTransform& t1,
00682                                         const csReversibleTransform& t2)
00683   {
00684     return csReversibleTransform (t1.m_o2t*t2.m_o2t, t2.m_t2o*t1.m_t2o,
00685                              t2.v_o2t + t2.m_t2o*t1.v_o2t);
00686   }
00687 
00688 #if !defined(SWIG) /* Otherwise Swig 1.3.22 thinks this is multiply declared */
00689 
00700   friend CS_CRYSTALSPACE_EXPORT csTransform operator* (const csTransform& t1,
00701                               const csReversibleTransform& t2);
00702 #endif
00703 
00715   friend CS_CRYSTALSPACE_EXPORT csReversibleTransform& operator/= (
00716     csReversibleTransform& t1, const csReversibleTransform& t2);
00717 
00729   friend CS_CRYSTALSPACE_EXPORT csReversibleTransform operator/ (
00730     const csReversibleTransform& t1, const csReversibleTransform& t2);
00731 };
00732 
00739 class csOrthoTransform : public csReversibleTransform
00740 {
00741 public:
00745   csOrthoTransform () : csReversibleTransform () {}
00746 
00750   csOrthoTransform (const csMatrix3& o2t, const csVector3& pos) :
00751     csReversibleTransform (o2t, o2t.GetTranspose (), pos) { }
00752 
00756   csOrthoTransform (const csTransform& t) :
00757     csReversibleTransform (t.GetO2T (), t.GetO2T ().GetTranspose (),
00758         t.GetO2TTranslation ())
00759   { }
00760 
00765   virtual void SetO2T (const csMatrix3& m)
00766   { m_o2t = m;  m_t2o = m_o2t.GetTranspose (); }
00767 
00773   virtual void SetT2O (const csMatrix3& m)
00774   { m_t2o = m;  m_o2t = m_t2o.GetTranspose (); }
00775 };
00776 
00779 #endif // __CS_TRANSFORM_H__
00780 

Generated for Crystal Space 2.0 by doxygen 1.7.6.1