00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __CS_POLYCLIP_H__
00023 #define __CS_POLYCLIP_H__
00024
00025 #include "csgeom/math2d.h"
00026 #include "csgeom/polypool.h"
00027 #include "igeom/clip2d.h"
00028
00032 class csClipper : public iClipper2D
00033 {
00034 protected:
00036 static csPoly2DPool *polypool;
00037
00039 uint8 mrClipping;
00040
00041 public:
00042 static csPoly2DPool *GetSharedPool ();
00043
00044 public:
00046 csClipper ();
00047
00049 virtual ~csClipper () { }
00050
00052 virtual uint8 ClipInPlace (csVector2 *InPolygon, int &InOutCount, csBox2 &BoundingBox);
00053
00055 uint8 LastClipResult () { return mrClipping; }
00056
00057 SCF_DECLARE_IBASE;
00058 };
00059
00064 class csBoxClipper : public csClipper
00065 {
00067 csBox2 region;
00069 csVector2 ClipBox [4];
00070
00072 inline void InitClipBox ()
00073 {
00074 ClipBox [0].Set (region.MinX (), region.MinY ());
00075 ClipBox [1].Set (region.MinX (), region.MaxY ());
00076 ClipBox [2].Set (region.MaxX (), region.MaxY ());
00077 ClipBox [3].Set (region.MaxX (), region.MinY ());
00078 }
00079
00080 public:
00082 csBoxClipper (const csBox2& b) : region (b)
00083 { InitClipBox (); }
00085 csBoxClipper (float x1, float y1, float x2, float y2) : region (x1,y1,x2,y2)
00086 { InitClipBox (); }
00087
00089 virtual uint8 Clip (csVector2 *InPolygon, int InCount,
00090 csVector2 *OutPolygon, int &OutCount);
00091
00093 virtual uint8 Clip (csVector2 *InPolygon, int InCount,
00094 csVector2 *OutPolygon, int &OutCount, csBox2 &BoundingBox);
00095
00097 virtual uint8 Clip (csVector2 *InPolygon, int InCount,
00098 csVector2 *OutPolygon, int &OutCount, csVertexStatus *OutStatus);
00099
00101 virtual int ClassifyBox (const csBox2 &box);
00102
00104 virtual bool IsInside (const csVector2& v)
00105 { return region.In (v.x, v.y); }
00106
00108 virtual int GetVertexCount ()
00109 { return 4; }
00110
00112 virtual csVector2 *GetClipPoly ()
00113 { return ClipBox; }
00114 };
00115
00126 class csPolygonClipper : public csClipper
00127 {
00129 csVector2 *ClipData;
00131 csVector2 *ClipPoly;
00133 csPoly2D *ClipPoly2D;
00135 int ClipPolyVertices;
00137 csBox2 ClipBox;
00138
00140 void Prepare ();
00141
00142 public:
00144 csPolygonClipper (csPoly2D *Clipper, bool mirror = false,
00145 bool copy = false);
00147 csPolygonClipper (csVector2 *Clipper, int Count, bool mirror = false,
00148 bool copy = false);
00150 virtual ~csPolygonClipper ();
00151
00153 virtual uint8 Clip (csVector2 *InPolygon, int InCount,
00154 csVector2 *OutPolygon, int &OutCount);
00155
00157 virtual uint8 Clip (csVector2 *InPolygon, int InCount,
00158 csVector2 *OutPolygon, int &OutCount, csBox2 &BoundingBox);
00159
00161 virtual uint8 Clip (csVector2 *InPolygon, int InCount,
00162 csVector2 *OutPolygon, int &OutCount, csVertexStatus *OutStatus);
00163
00165 virtual int ClassifyBox (const csBox2 &box);
00166
00168 virtual bool IsInside (const csVector2& v);
00169
00171 virtual int GetVertexCount () { return ClipPolyVertices; }
00172
00174 virtual csVector2 *GetClipPoly ()
00175 { return ClipPoly; }
00176 };
00177
00178 #endif // __CS_POLYCLIP_H__