00001 #ifndef _REPERE_H_
00002 #define _REPERE_H_
00003
00004 #include <kernel/jafarMacro.hpp>
00005 #include <geom/t3dEuler.hpp>
00006 #include <jmath/jblas.hpp>
00007
00008
00009
00010 namespace jafar {
00011 namespace geom {
00016 class Repere3D {
00017 private:
00021 inline Repere3D() : m_ref(0) , m_t3d_uptodate(false), range03(0,3) {
00022 JFR_DEBUG("Construct the global reference");
00023 initIdentityRepere3D();
00024 };
00025 void initIdentityRepere3D();
00026 public:
00030 Repere3D(const Repere3D* ref, jblas::vec3 origin,jblas::vec3 i, jblas::vec3 j, jblas::vec3 k);
00035 inline Repere3D(const Repere3D* ref) : m_ref(ref), m_t3d_uptodate(false), range03(0,3)
00036 {
00037 if(m_ref==0) m_ref = global();
00038 initIdentityRepere3D();
00039 };
00040 public:
00041 static inline Repere3D* copyRepere3D(Repere3D* r)
00042 {
00043 return new Repere3D(r->ref(), r->origin(), r->i(),r->j(),r->k());
00044 }
00045 static inline const Repere3D* global()
00046 { return (s_globalRef == 0) ? (s_globalRef = new Repere3D()) : s_globalRef ; }
00051 inline const Repere3D* ref() const { return m_ref; }
00055 void changeRef(const Repere3D*);
00059 inline void setRef(const Repere3D* ref) { m_ref = ref; }
00063 inline bool isGlobal() const { return (m_ref == 0); }
00067 inline jblas::vec4 i() const { return m_i; }
00068 inline jblas::vec4 globalI() const {
00069 if(isGlobal() or ref()->isGlobal()) return i();
00070 return ref()->localToGlobal(i());
00071 }
00075 inline jblas::vec4 j() const { return m_j; }
00076 inline jblas::vec4 globalJ() const {
00077 if(isGlobal() or ref()->isGlobal()) return j();
00078 return ref()->localToGlobal(j());
00079 }
00083 inline jblas::vec4 k() const { return m_k; }
00084 inline jblas::vec4 globalK() const {
00085 if(isGlobal() or ref()->isGlobal()) return k();
00086 return ref()->localToGlobal(k());
00087 }
00091 inline jblas::vec4 origin() const { return m_origin; }
00092
00093 inline jblas::vec4 globalOrigin() const {
00094 if(isGlobal() or ref()->isGlobal()) return origin();
00095 return ref()->localToGlobal(origin());
00096 }
00097
00098 void compose( const geom::T3DEuler& );
00099
00103 jblas::vec toEuler() const;
00104 void fromEuler(const jblas::vec&);
00105 public:
00106 inline jblas::vec4 localToGlobal(jblas::vec4 v) const {
00107 if(isGlobal()) return v;
00108 jblas::mat44 localToGlobalMat = localToGlobal().getM();
00109 return ublas::prod(localToGlobalMat, v);
00110 }
00111 inline jblas::vec4 globalToLocal(jblas::vec4 v) const {
00112 if(isGlobal()) return v;
00113 jblas::mat44 globalToLocalMat = globalToLocal().getM();
00114 return ublas::prod(globalToLocalMat, v);
00115 }
00116 geom::T3DEuler localToParent() const;
00117 void localToParent(geom::T3DEuler&) const;
00118 geom::T3DEuler parentToLocal() const;
00119 void parentToLocal(geom::T3DEuler&) const;
00120 geom::T3DEuler localToGlobal() const;
00121 void localToGlobal(geom::T3DEuler&) const;
00122 geom::T3DEuler globalToLocal() const;
00123 void globalToLocal(geom::T3DEuler&) const;
00124 public:
00128 template<typename _T>
00129 inline void setI(const _T& ni) {
00130 m_t3d_uptodate = false;
00131 ublas::vector_range<jblas::vec4>(m_i, range03) = ublas::vector_range<const _T>(ni, range03);;
00132 }
00136 template<typename _T>
00137 inline void setJ(const _T& nj) {
00138 m_t3d_uptodate = false;
00139 ublas::vector_range<jblas::vec4>(m_j, range03) = ublas::vector_range<const _T>(nj, range03);
00140 }
00144 template<typename _T>
00145 inline void setK(const _T& nk) {
00146 m_t3d_uptodate = false;
00147 ublas::vector_range<jblas::vec4>(m_k, range03) = ublas::vector_range<const _T>(nk, range03);
00148 }
00152 template<typename _T>
00153 inline void setOrigin(const _T& no) {
00154 m_t3d_uptodate = false;
00155 ublas::vector_range<jblas::vec4>(m_origin, range03) = ublas::vector_range<const _T>(no, range03);
00156 }
00157 private:
00158 static Repere3D* s_globalRef;
00159 const Repere3D* m_ref;
00160 jblas::vec4 m_i,m_j,m_k, m_origin;
00161 mutable bool m_t3d_uptodate;
00162 mutable geom::T3DEuler m_thisToRef;
00163 ublas::range range03;
00164 };
00165
00166 }
00167 }
00168
00169 #endif