FDH14.h

Go to the documentation of this file.
00001 /* $Id: FDH14.h,v 1.5 2002/12/05 19:30:18 cvs Exp $ */
00002 
00003 #ifndef __FDH_14_H
00004 #define __FDH_14_H
00005 
00006 #include <esg/geometry/FDH.h>
00007 
00008 namespace esg {
00009 
00014 class OGSCENE_EXPORT FDH14 : public FDH {
00015         friend class FDH14Tree;
00016         friend class FDH14DistRot;
00017   
00018 private:
00019         static const double   SCALE; 
00020   
00021 public:
00022         static const unsigned DIRS;          
00023         static const unsigned SIZE;          
00024         static const float    FDHMat[14][3]; 
00025 
00026 
00027         class RotInfo; 
00028 
00029 protected:
00030         // Geometric transformations
00031         // ATTENTION: There is not real rotation but FDH recreated
00032         //            from rotated FDH
00033         virtual void _rotateX   (float /* angle */);
00034         virtual void _rotateY   (float /* angle */);
00035         virtual void _rotateZ   (float /* angle */);
00036         virtual void _rotate    (float /* angle */, const Vector3& /* axis */);
00037         virtual void _rotate    (const Matrix3&);
00038         virtual void _transform (const Matrix4&);
00039 
00040         virtual Mesh* _mesh                 (int /* not used */) const;
00041         virtual void  _duplicate_attributes (const Geometry&);
00042 
00043         FDH14 () : FDH(DIRS, FDHMat) {}
00044   
00045 public:
00051         FDH14 (SceneGraphObject& object)
00052             : FDH(DIRS, FDHMat, object) {}
00053 
00059         FDH14 (List<SceneGraphObject>& list)
00060             : FDH(DIRS, FDHMat, list) {}
00061 
00068         FDH14(const Geometry& geom1, const Geometry& geom2)
00069             : FDH(DIRS, FDHMat, geom1, geom2) {}
00070 
00076         FDH14 (const Geometry& geom)
00077             : FDH(DIRS, FDHMat, geom) {}
00078 
00084         FDH14 (const float values[])
00085             : FDH(DIRS, FDHMat, values) {}
00086 
00087         virtual void rayIntersection (PointEnv*      pPE,
00088                                       int            mask,
00089                                       const Vector3& origin,
00090                                       const Vector3& direction,
00091                                       float          maxDist = MAXFLOAT);
00092 
00093         virtual Interval extent (const Vector3& direction) const;
00094 
00095         virtual Geometry* clone (const Matrix4* pTrMat) const;
00096 };
00097 
00098 
00099 
00100 
00102 //                         subclass FDH14::RotInfo                           //
00104 
00109 class FDH14::RotInfo { 
00110         friend class FDH14;
00111 
00112 private:
00113         static const double   ROT_EPS;   
00114         static const double   ROT_SCALE; 
00115   
00116 public:
00120         struct FDH_Precomp { 
00121                 int   p[4];
00122                 float v1[3], v2[3];
00123                 float tau; 
00124         };
00125   
00126 protected:
00127         static const int _SgnCtrl[8][4];  
00128 
00129         FDH_Precomp* r;         
00130         float        mat[4][4]; 
00131         int          rotation;  
00132   
00133 protected:
00134         inline void  fdh_precomp (FDH_Precomp *r, const float c[]);
00135 
00136 
00137   //---------------------------------------------------
00138 public:
00142         RotInfo ();
00143 
00149         RotInfo (const float trMat[4][4]);
00150 
00156         RotInfo (const Matrix4f& trMat);
00157 
00163         RotInfo (const Vector3& direction);
00164         
00168         virtual ~RotInfo() { if (r) delete [] r; }
00169 
00177         static float fast_lp (const FDH_Precomp& r, // Precomp. values for FDH
00178                               const float        origFDH[]) { // Original FDH
00179             return (((origFDH[r.p[2]] + origFDH[r.p[3]]) * ROT_SCALE
00180                      -(origFDH[r.p[0]] + origFDH[r.p[1]]) < -ROT_EPS)
00181                     ?
00182                     origFDH[r.p[1]] * r.v2[0] +
00183                     origFDH[r.p[2]] * r.v2[1] +
00184                     origFDH[r.p[3]] * r.v2[2] + r.tau
00185                     :
00186                     origFDH[r.p[0]] * r.v1[0] +
00187                     origFDH[r.p[1]] * r.v1[1] +
00188                     origFDH[r.p[2]] * r.v1[2] + r.tau);
00189         }
00190 
00196         void recompute (const float trMat[4][4]);
00197 
00203         void recompute (const Matrix4f& trMat);
00204 
00210         void recompute (const Vector3& direction);
00211 
00217         FDH_Precomp get (int index) const { return r[index]; }
00218 
00222         RotInfo* clone (void) const;
00223 
00227         Matrix4 getMat (void) const;
00228 }; //RotInfo
00229 
00230 }; // namespace
00231 
00232 #endif // __FDH_14_h

Generated on Wed Jun 28 12:24:28 2006 for esg by  doxygen 1.4.6