00001
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
00031
00032
00033 virtual void _rotateX (float );
00034 virtual void _rotateY (float );
00035 virtual void _rotateZ (float );
00036 virtual void _rotate (float , const Vector3& );
00037 virtual void _rotate (const Matrix3&);
00038 virtual void _transform (const Matrix4&);
00039
00040 virtual Mesh* _mesh (int ) 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
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,
00178 const float origFDH[]) {
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 };
00229
00230 };
00231
00232 #endif // __FDH_14_h