00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __CS_CRYSBALL_H__
00020 #define __CS_CRYSBALL_H__
00021
00022 #include "csutil/tree.h"
00023 #include "csutil/array.h"
00024 #include "csgeom/vector3.h"
00025 #include "csgeom/math3d.h"
00026 #include "csgeom/transfrm.h"
00027 #include "igeom/polymesh.h"
00028
00052 class csCrystalBall
00053 {
00054 class csCrystalBallVec : public csVector3
00055 {
00056 protected:
00057 int idx;
00058 public:
00059 csCrystalBallVec (int polyidx) { idx = polyidx; }
00060 inline int GetIndex () { return idx; }
00061 };
00062
00063 class csTriNode : public csTreeNode
00064 {
00065 public:
00066 enum
00067 {
00068 INSIDE = 0,
00069 OUTSIDE = 1
00070 };
00071
00072 int from, len;
00073 int divider;
00074 csTriNode (csTriNode *theParent=0, int from=-1, int len=0) : csTreeNode (theParent)
00075 {this->from = from; this->len = len;}
00076
00077
00078 int Add (csCrystalBallVec *normal, int tri1, int tri2, int tri3,
00079 csArray<csCrystalBallVec*> *vP, csArray<csVector3*> *vTP);
00080
00081
00082 void Adjust (int nPos);
00083
00084
00085 int Classify (const csVector3 &n, int i1, int i2, int i3,
00086 const csArray<csVector3*> *vTP) const;
00087
00088
00089
00090
00091
00092 int SignMatches (const csVector3 *n1, const csVector3 *n2,
00093 const csVector3 *td, int useSign);
00094
00095
00096 bool SignMatches (const csVector3 *tn, int useSign);
00097
00098
00099
00100 void Transform (const csMatrix3 &m, csDirtyAccessArray<int> &indexVector,
00101 int useSign, long cookie,
00102 const csArray<csCrystalBallVec*> *vP,
00103 const csArray<csVector3*> *vTP,
00104 const csVector3 &v1, const csVector3 &v2,
00105 const csVector3 &v3);
00106 };
00107
00108 protected:
00109
00110 csArray<csCrystalBallVec*> vPoints;
00111
00112
00113 csArray<csVector3*> vTrianglePoints;
00114
00115 csTriNode tri[8];
00116
00117 public:
00118 csCrystalBall ();
00119 ~csCrystalBall ();
00120
00121
00122 void Build (iPolygonMesh *polyset);
00123
00124
00125 void InsertPolygon (iPolygonMesh *polyset, int idx);
00126
00127
00128
00129 void Transform (const csTransform &t, csDirtyAccessArray<int> &indexVector, int useSign, long cookie);
00130 };
00131
00132 #endif // __CS_CRYSBALL_H__