// NeL - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include "stdpacs.h" #include "exterior_mesh.h" #include "local_retriever.h" #include "collision_desc.h" using namespace std; using namespace NLMISC; namespace NLPACS { // Functions for vertices comparison. // total order relation static inline bool isStrictlyLess(const CVector &a, const CVector &b) { if (a.x < b.x) return true; if (a.x > b.x) return false; if (a.y < b.y) return true; if (a.y > b.y) return false; if (a.z < b.y) return true; return false; } static inline bool isStrictlyGreater(const CVector &a, const CVector &b) { if (a.x > b.x) return true; if (a.x < b.x) return false; if (a.y > b.y) return true; if (a.y < b.y) return false; if (a.z > b.y) return true; return false; } CExteriorMesh::CExteriorMesh() { } void CExteriorMesh::setEdges(const vector &edges) { _Edges = edges; _OrderedEdges.clear(); uint i; for (i=0; i+1<_Edges.size(); ) { _OrderedEdges.resize(_OrderedEdges.size()+1); COrderedEdges &edges = _OrderedEdges.back(); edges.Start = i; if (isStrictlyLess(_Edges[i].Start, _Edges[i+1].Start)) { edges.Forward = true; do { ++i; } while (i+1<_Edges.size() && _Edges[i].Link != -2 && isStrictlyLess(_Edges[i].Start, _Edges[i+1].Start)); } else { edges.Forward = false; do { ++i; } while (i+1<_Edges.size() && _Edges[i].Link != -2 && isStrictlyGreater(_Edges[i].Start, _Edges[i+1].Start)); } edges.End = i; if (_Edges[i].Link == -2) ++i; } } void CExteriorMesh::serial(NLMISC::IStream &f) { /* Version 0: - base version. */ (void)f.serialVersion(0); f.serialCont(_Edges); f.serialCont(_OrderedEdges); f.serialCont(_Links); f.serial(_BBox); } };