Go to the documentation of this file.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
00026 #include "csextern.h"
00027
00028 #include "csgeom/box.h"
00029
00030 #include "igeom/clip2d.h"
00031
00032 #include "csutil/scf_implementation.h"
00033
00034 class csPoly2DPool;
00035
00046 class CS_CRYSTALSPACE_EXPORT csClipper :
00047 public scfImplementation1<csClipper,iClipper2D>
00048 {
00049 protected:
00051 static csPoly2DPool *polypool;
00052
00054 uint8 mrClipping;
00055
00056 public:
00057 static csPoly2DPool *GetSharedPool ();
00058
00059 public:
00061 csClipper ();
00062
00064 virtual ~csClipper ();
00065
00067 virtual uint8 ClipInPlace (csVector2 *InPolygon, size_t &InOutCount,
00068 csBox2 &BoundingBox);
00069
00071 uint8 LastClipResult () { return mrClipping; }
00072 };
00073
00078 class CS_CRYSTALSPACE_EXPORT csBoxClipper : public csClipper
00079 {
00081 csBox2 region;
00083 csVector2 ClipBox [4];
00084
00086 inline void InitClipBox ()
00087 {
00088 ClipBox [0].Set (region.MinX (), region.MinY ());
00089 ClipBox [1].Set (region.MinX (), region.MaxY ());
00090 ClipBox [2].Set (region.MaxX (), region.MaxY ());
00091 ClipBox [3].Set (region.MaxX (), region.MinY ());
00092 }
00093
00094 public:
00096 csBoxClipper (const csBox2& b) : region (b)
00097 { InitClipBox (); }
00099 csBoxClipper (float x1, float y1, float x2, float y2) : region (x1,y1,x2,y2)
00100 { InitClipBox (); }
00101
00103 virtual uint8 Clip (const csVector2 *InPolygon, size_t InCount,
00104 csVector2 *OutPolygon, size_t &OutCount);
00105
00107 virtual uint8 Clip (const csVector2 *InPolygon, size_t InCount,
00108 csVector2 *OutPolygon, size_t &OutCount, csBox2 &BoundingBox);
00109
00111 virtual uint8 Clip (const csVector2 *InPolygon, size_t InCount,
00112 csVector2 *OutPolygon, size_t &OutCount, csVertexStatus *OutStatus);
00113
00115 virtual int ClassifyBox (const csBox2 &box);
00116
00118 virtual bool IsInside (const csVector2& v)
00119 { return region.In (v.x, v.y); }
00120
00122 virtual size_t GetVertexCount ()
00123 { return 4; }
00124
00126 virtual const csVector2 *GetClipPoly ()
00127 { return ClipBox; }
00128
00129 virtual ClipperType GetClipperType() const { return clipperBox; }
00130 };
00131
00142 class CS_CRYSTALSPACE_EXPORT csPolygonClipper : public csClipper
00143 {
00145 csVector2 *ClipData;
00147 const csVector2 *ClipPoly;
00149 csPoly2D *ClipPoly2D;
00151 size_t ClipPolyVertices;
00153 csBox2 ClipBox;
00154
00156 void Prepare ();
00157
00158 public:
00160 csPolygonClipper (csPoly2D *Clipper, bool mirror = false,
00161 bool copy = false);
00163 csPolygonClipper (const csVector2 *Clipper, size_t Count, bool mirror = false,
00164 bool copy = false);
00166 virtual ~csPolygonClipper ();
00167
00169 virtual uint8 Clip (const csVector2 *InPolygon, size_t InCount,
00170 csVector2 *OutPolygon, size_t &OutCount);
00171
00173 virtual uint8 Clip (const csVector2 *InPolygon, size_t InCount,
00174 csVector2 *OutPolygon, size_t &OutCount, csBox2 &BoundingBox);
00175
00177 virtual uint8 Clip (const csVector2 *InPolygon, size_t InCount,
00178 csVector2 *OutPolygon, size_t &OutCount, csVertexStatus *OutStatus);
00179
00181 virtual int ClassifyBox (const csBox2 &box);
00182
00184 virtual bool IsInside (const csVector2& v);
00185
00187 virtual size_t GetVertexCount () { return ClipPolyVertices; }
00188
00190 virtual const csVector2 *GetClipPoly ()
00191 { return ClipPoly; }
00192
00193 virtual ClipperType GetClipperType() const { return clipperPoly; }
00194 };
00198 #endif // __CS_POLYCLIP_H__