00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef NL_CHAIN_QUAD_H
00027 #define NL_CHAIN_QUAD_H
00028
00029 #include "nel/misc/types_nl.h"
00030 #include "nel/misc/aabbox.h"
00031 #include "pacs/chain.h"
00032 #include "pacs/collision_surface_temp.h"
00033 #include <vector>
00034
00035
00036 class NLMISC::IStream;
00037
00038
00039 namespace NLPACS
00040 {
00041
00042 using NLMISC::CVector;
00043 using NLMISC::IStream;
00044
00045
00046 struct EChainQuad : public NLMISC::Exception
00047 {
00048 EChainQuad(const std::string &reason) : Exception(reason) { }
00049 };
00050
00051
00052
00059 class CChainQuad
00060 {
00061 public:
00062
00064 CChainQuad();
00066 CChainQuad(const CChainQuad &o);
00068 ~CChainQuad();
00070 CChainQuad &operator=(const CChainQuad &o);
00071
00072
00074 void build(const std::vector<COrderedChain> &ochains);
00075
00076
00083 sint selectEdges(const NLMISC::CAABBox &bbox, CCollisionSurfaceTemp &cst) const;
00084
00092 sint selectEdges(CVector start, CVector end, CCollisionSurfaceTemp &cst) const;
00093
00094
00096 void serial(NLMISC::IStream &f);
00097
00098
00099
00100 private:
00101
00105 std::vector<uint8*> _Quad;
00107 uint32 _Width;
00109 uint32 _Height;
00111 sint32 _X, _Y;
00113 uint8 *_QuadData;
00115 uint32 _QuadDataLen;
00116
00117
00118 static const float _QuadElementSize;
00119
00120
00121 private:
00122 void addEdgeToQuadNode(std::list<CEdgeChainEntry> &quadNode, sint ochainId, sint edgeId);
00123
00124
00125 void getGridBounds(sint32 &x0, sint32 &y0, sint32 &x1, sint32 &y1, const CVector &minP, const CVector &maxP) const;
00126
00127 };
00128
00129
00130 }
00131
00132
00133 #endif // NL_CHAIN_QUAD_H
00134
00135