00001
00002
00003
00004 #ifndef SIMPLEX_FRAME_H_IS_INCLUDED
00005 #define SIMPLEX_FRAME_H_IS_INCLUDED
00006
00007 #include "map3d/coord_frame.H"
00008 #include "bvert.H"
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 class SimplexFrame : public SimplexData, public CoordFrame {
00021 public:
00022
00023
00024
00025 SimplexFrame(uint key, Bsimplex* s, CWvec& t, mlib::CWvec& n) :
00026 SimplexData(key, s),
00027 _dirty(1) { set_(t,n); }
00028
00029
00030
00031 DEFINE_RTTI_METHODS3("SimplexFrame", SimplexFrame*, SimplexData, CSimplexData*);
00032
00033
00034
00035
00036 virtual void set(CWvec& t, mlib::CWvec& n) {
00037 set_(t,n);
00038 changed();
00039 }
00040 virtual void apply_xform(CWtransf& xf) {
00041
00042 set_(xf*_t, xf*_n);
00043 changed();
00044 }
00045
00046
00047
00048
00049
00050 virtual Wvec t() { update(); return _t; }
00051 virtual Wvec n() { update(); return _n; }
00052 virtual Wtransf xf() { update(); return _xf; }
00053 virtual Wtransf inv() { update(); return _inverse; }
00054
00055 virtual void changed() {
00056 _dirty = true;
00057 CoordFrame::changed();
00058 }
00059
00060
00061
00062 virtual void notify_simplex_changed() { changed(); }
00063 virtual void notify_simplex_xformed(CWtransf& ) {
00064
00065
00066 }
00067 virtual void notify_simplex_deleted() {
00068 _observers.notify_frame_deleted(this);
00069 SimplexData::notify_simplex_deleted();
00070 }
00071
00072
00073 void set(uint id, Bsimplex* s) { SimplexData::set(id, s); }
00074 void set(Cstr_ptr& str, Bsimplex* s) { SimplexData::set(str, s); }
00075
00076
00077
00078
00079 protected:
00080 Wvec _t;
00081 Wvec _n;
00082 Wtransf _xf;
00083 Wtransf _inverse;
00084 bool _dirty;
00085
00086
00087
00088
00089 void set_(CWvec& t, mlib::CWvec& n) {
00090
00091
00092
00093 _t = t.normalized();
00094 _n = n.orthogonalized(_t).normalized();
00095 }
00096
00097 virtual void recompute() {
00098
00099
00100
00101 _dirty = 0;
00102 _xf = Wtransf(o(), t(), b(), n());
00103 _inverse = _xf.inverse();
00104 }
00105
00106 void update() const {
00107 if (_dirty)
00108 ((SimplexFrame*)this)->recompute();
00109 }
00110 };
00111 typedef const SimplexFrame CSimplexFrame;
00112
00113 #endif // SIMPLEX_FRAME_H_IS_INCLUDED
00114
00115