|
polyclip.h00001 /* 00002 Crystal Space polygon clipping routines 00003 Copyright (C) 1998 by Jorrit Tyberghein 00004 Contributed by Ivan Avramovic <ivan@avramovic.com> and 00005 Andrew Zabolotny <bit@eltech.ru> 00006 00007 This library is free software; you can redistribute it and/or 00008 modify it under the terms of the GNU Library General Public 00009 License as published by the Free Software Foundation; either 00010 version 2 of the License, or (at your option) any later version. 00011 00012 This library is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 Library General Public License for more details. 00016 00017 You should have received a copy of the GNU Library General Public 00018 License along with this library; if not, write to the Free 00019 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 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__ Generated for Crystal Space by doxygen 1.2.5 written by Dimitri van Heesch, ©1997-2000 |