00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef NL_EDGE_QUAD_H
00027 #define NL_EDGE_QUAD_H
00028
00029 #include "nel/misc/types_nl.h"
00030 #include "nel/misc/aabbox.h"
00031 #include "pacs/exterior_mesh.h"
00032 #include "pacs/collision_surface_temp.h"
00033 #include <vector>
00034
00035 namespace NLMISC
00036 {
00037 class IStream;
00038 };
00039
00040 namespace NLPACS
00041 {
00042 class CGlobalRetriever;
00043
00044 using NLMISC::CVector;
00045 using NLMISC::IStream;
00046
00047
00048 struct EEdgeQuad : public NLMISC::Exception
00049 {
00050 EEdgeQuad(const std::string &reason) : Exception(reason) { }
00051 };
00052
00053
00054
00061 class CEdgeQuad
00062 {
00063 public:
00064
00066 CEdgeQuad();
00068 CEdgeQuad(const CEdgeQuad &o);
00070 ~CEdgeQuad();
00072 CEdgeQuad &operator=(const CEdgeQuad &o);
00073
00075 void clear();
00076
00077
00079 void build(const CExteriorMesh &em,
00080 const CGlobalRetriever &global,
00081 CCollisionSurfaceTemp &cst,
00082 uint32 thisInstance);
00083
00084
00091 sint selectEdges(const NLMISC::CAABBox &bbox, CCollisionSurfaceTemp &cst) const;
00092
00100 sint selectEdges(CVector start, CVector end, CCollisionSurfaceTemp &cst) const;
00101
00102
00104 const std::vector<CExteriorEdgeEntry> &getEdgeEntries() const { return _EdgeEntries; }
00106 const CExteriorEdgeEntry &getEdgeEntry(uint entry) const { return _EdgeEntries[entry]; }
00107
00108
00110 void serial(NLMISC::IStream &f);
00111
00113 void removeLinks(sint32 instanceId)
00114 {
00115 uint i;
00116 for (i=0; i<_EdgeEntries.size(); ++i)
00117 {
00118 if (_EdgeEntries[i].Exterior.RetrieverInstanceId == instanceId)
00119 {
00120 _EdgeEntries[i].Exterior.RetrieverInstanceId = -1;
00121 _EdgeEntries[i].Exterior.SurfaceId = -1;
00122 }
00123 }
00124 }
00125
00127 void removeLinks()
00128 {
00129 uint i;
00130 for (i=0; i<_EdgeEntries.size(); ++i)
00131 {
00132 _EdgeEntries[i].Exterior.RetrieverInstanceId = -1;
00133 _EdgeEntries[i].Exterior.SurfaceId = -1;
00134 }
00135 }
00136
00137
00138 private:
00139
00143 std::vector<uint8*> _Quad;
00145 std::vector<CExteriorEdgeEntry> _EdgeEntries;
00147 uint32 _Width;
00149 uint32 _Height;
00151 sint32 _X, _Y;
00153 uint8 *_QuadData;
00155 uint32 _QuadDataLen;
00156
00157
00158 static const float _QuadElementSize;
00159
00160
00161 private:
00162
00163
00164 void getGridBounds(sint32 &x0, sint32 &y0, sint32 &x1, sint32 &y1, const CVector &minP, const CVector &maxP) const;
00165
00166 };
00167
00168
00169 }
00170
00171
00172 #endif // NL_CHAIN_QUAD_H
00173
00174