00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __GD_TrimRegion_h__
00021 #define __GD_TrimRegion_h__
00022
00023 #include "GD_API.h"
00024 #include <UT/UT_Math.h>
00025 #include <UT/UT_LinkList.h>
00026
00027 class UT_BoundingRect;
00028 class UT_IStream;
00029 class GB_PrimitiveGroup;
00030 class GD_Detail;
00031 class GD_Face;
00032 class GD_Primitive;
00033 class GD_TrimLoop;
00034
00035 class GD_API GD_TrimFace : public UT_LinkNode
00036 {
00037 public:
00038 GD_TrimFace(GD_Face &face, float ustart, float ustop) : myFace(face)
00039 {
00040 myUstart = ustart;
00041 myUstop = ustop;
00042 }
00043 virtual ~GD_TrimFace();
00044
00045 const GD_Face &face (void) const { return myFace; }
00046 float uStop (void) const { return myUstop; }
00047 float uStart(void) const { return myUstart; }
00048
00049 int operator==(const GD_TrimFace &tface) const
00050 {
00051 return (&myFace == &tface.myFace ) &&
00052 UTisEqual( myUstart, tface.myUstart) &&
00053 UTisEqual( myUstop, tface.myUstop );
00054 }
00055
00056 void reverse();
00057 GD_TrimLoop *buildLoop(void) const;
00058
00059 int save(ostream &os, int binary) const;
00060
00061 private:
00062 GD_Face &myFace;
00063 float myUstart;
00064 float myUstop;
00065 };
00066
00067
00068 class GD_API GD_TrimRegionFlags
00069 {
00070 public:
00071 GD_TrimRegionFlags() { dirty = 1; opencasual = 0; domainclipped=0; }
00072 unsigned opencasual:1,
00073 dirty:1,
00074 domainclipped:1;
00075 };
00076
00077
00078 class GD_API GD_TrimRegion : public UT_LinkList
00079 {
00080 public:
00081 GD_TrimRegion(int opencasual = 0);
00082 virtual ~GD_TrimRegion();
00083
00084
00085 virtual void reverse(void);
00086
00087
00088 int isDirty(void) const { return myFlags.dirty; }
00089 int isOpenCasual()const { return myFlags.opencasual; }
00090 int isValid(void) const { return myLoop &&
00091 !myFlags.dirty; }
00092
00093 int getNum (void) const { return myNum; }
00094
00095
00096
00097 const GD_TrimLoop *getLoop(void) const { return myLoop; }
00098 GD_TrimLoop *getLoop(const UT_BoundingRect &brect,
00099 float tolerance = 1e-4F,
00100 int doDomainClip = 1);
00101
00102
00103
00104 int contains(const GD_Primitive &prim ) const;
00105 int contains(const GB_PrimitiveGroup &group,
00106 int count_how_many = 0 ) const;
00107
00108
00109 int remove(const GD_Primitive &prim );
00110 int remove(const GB_PrimitiveGroup &group);
00111
00112
00113 void merge(GB_PrimitiveGroup *group) const;
00114
00115
00116 int copy(GD_Detail &gdp, const GD_TrimRegion &src,
00117 int primoffset);
00118
00119
00120 bool load(GD_Detail &gdp, UT_IStream &is);
00121 int save( ostream &os, int binary) const;
00122
00123
00124 protected:
00125 void setNum(int num) { myNum = num; }
00126 void initialize(void);
00127
00128 private:
00129 int myNum;
00130 GD_TrimRegionFlags myFlags;
00131 GD_TrimLoop *myLoop;
00132
00133 friend class GD_Detail;
00134 };
00135
00136 #endif