00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __GD_TrimPiece_h_
00023 #define __GD_TrimPiece_h_
00024
00025 #include "GD_API.h"
00026 #include <UT/UT_BoundingRect.h>
00027 #include <UT/UT_RefArray.h>
00028 #include <UT/UT_Vector3Array.h>
00029 #include <UT/UT_Matrix.h>
00030 #include "GD_PrimType.h"
00031
00032 class GD_Face;
00033 class GD_Detail;
00034
00035 class gdTrimIntersection;
00036
00037
00038 class GD_API GD_TrimHitInfo
00039 {
00040 public:
00041 int operator==(const GD_TrimHitInfo &x) const
00042 {
00043 return (t==x.t && u==x.u && d2==x.d2);
00044 }
00045 float t, u;
00046 float d2;
00047 int boundary;
00048 gdTrimIntersection *isect;
00049 };
00050
00051
00052
00053 class GD_API GD_TrimPiece
00054 {
00055 public:
00056 GD_TrimPiece();
00057
00058 virtual ~GD_TrimPiece();
00059
00060 void init(int order, float ustart, float ulength,
00061 int rational = 1);
00062
00063
00064 virtual GD_TrimPiece *copy() = 0;
00065
00066
00067
00068 virtual void reverse();
00069
00070
00071 virtual GD_TrimPiece *cut(float u1, float u2) const = 0;
00072
00073
00074
00075 float length() const;
00076
00077
00078
00079 virtual int intersect(GD_TrimPiece &curve,
00080 UT_RefArray<GD_TrimHitInfo> &hitlist,
00081 float tol = 0.0001F) = 0;
00082
00083
00084 virtual int intersectIsoparm(float val, int isoparm,
00085 UT_RefArray<GD_TrimHitInfo> &hitlist,
00086 float tol = 1E-4F, int depth = 4) = 0;
00087
00088 virtual GD_Face *createFace(GD_Detail *gdp) = 0;
00089
00090
00091 virtual int getPrimitiveId() const = 0;
00092
00093 virtual int evaluate(float u, UT_Vector2 &pos) const;
00094 virtual int evaluate(float u, UT_Vector2 &pos,
00095 UT_Vector2 &der) const;
00096
00097 virtual int evaluateUnit(float u, UT_Vector2 &pos) const=0;
00098 virtual int evaluateUnit(float u, UT_Vector2 &pos,
00099 UT_Vector2 &der, UT_Vector2 &der2)
00100 const = 0;
00101
00102
00103
00104 int checkStraight(void);
00105
00106 virtual void buildBBox();
00107
00108 void print() const;
00109
00110
00111 public:
00112 GD_TrimPiece *myNext;
00113 float myUStart, myULength;
00114 UT_Vector3Array myCV;
00115 UT_BoundingRect myBBox;
00116 int myRational;
00117
00118 int myImplicitFlag;
00119 UT_Matrix myXCoeff, myYCoeff, myWCoeff;
00120 };
00121
00122 class GD_API GD_TrimPieceRBezCurve : public GD_TrimPiece
00123 {
00124 public:
00125 GD_TrimPieceRBezCurve();
00126
00127 virtual ~GD_TrimPieceRBezCurve();
00128
00129 void buildCoeff(UT_Matrix &A, int index1, int index2);
00130
00131
00132 virtual GD_TrimPiece *copy();
00133
00134
00135 virtual GD_TrimPiece *cut(float u1, float u2) const;
00136
00137
00138
00139 virtual int intersect(GD_TrimPiece &curve,
00140 UT_RefArray<GD_TrimHitInfo> &hitlist,
00141 float tol = 0.0001F);
00142
00143 int intersect(GD_TrimPieceRBezCurve &curve,
00144 UT_RefArray<GD_TrimHitInfo> &hitlist,
00145 int depth,
00146 float tol = 0.0001F);
00147
00148 int intersectQR(GD_TrimPieceRBezCurve &curve,
00149 UT_RefArray<GD_TrimHitInfo> &hitlist,
00150 float tol = 0.0001F);
00151
00152
00153 virtual int intersectIsoparm(float val, int isoparm,
00154 UT_RefArray<GD_TrimHitInfo> &hitlist,
00155 float tol = 1E-4F, int depth = 4);
00156
00157
00158 virtual int evaluateUnit(float u, UT_Vector2 &pos) const;
00159 virtual int evaluateUnit(float u, UT_Vector2 &pos,
00160 UT_Vector2 &der, UT_Vector2 &der2)
00161 const;
00162
00163 virtual GD_Face *createFace(GD_Detail *gdp);
00164
00165
00166 virtual int getPrimitiveId() const
00167 { return GDPRIMBEZCURVE; }
00168
00169 void splitInHalf(GD_TrimPieceRBezCurve *left,
00170 GD_TrimPieceRBezCurve *right,
00171 float tol = 1E-4F) const;
00172
00173 int splitAt(GD_TrimPieceRBezCurve *left,
00174 GD_TrimPieceRBezCurve *right,
00175 float ucut, float tol = 1E-4F) const;
00176
00177 };
00178
00179
00180 class GD_API GD_TrimPiecePoly : public GD_TrimPiece
00181 {
00182 public:
00183 GD_TrimPiecePoly();
00184
00185 virtual ~GD_TrimPiecePoly();
00186
00187
00188 virtual GD_TrimPiece *copy();
00189
00190
00191 virtual GD_TrimPiece *cut(float u1, float u2) const;
00192
00193
00194
00195 virtual int intersect(GD_TrimPiece &curve,
00196 UT_RefArray<GD_TrimHitInfo> &hitlist,
00197 float tol = 0.0001F);
00198
00199
00200 virtual int intersectIsoparm(float val, int isoparm,
00201 UT_RefArray<GD_TrimHitInfo> &hitlist,
00202 float tol = 1E-4F, int depth = 4);
00203
00204
00205 virtual int evaluateUnit(float u, UT_Vector2 &pos) const;
00206 virtual int evaluateUnit(float u, UT_Vector2 &pos,
00207 UT_Vector2 &der, UT_Vector2 &der2)
00208 const;
00209
00210 virtual GD_Face *createFace(GD_Detail *gdp);
00211
00212
00213 virtual int getPrimitiveId() const
00214 { return GDPRIMPOLY; }
00215
00216 void buildCurve(int idx);
00217 void appendPoint(float x, float y);
00218 public:
00219 GD_TrimPieceRBezCurve myCurve;
00220 };
00221
00222 #endif