00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _MbTriangleCellsSet_H
00024 #define _MbTriangleCellsSet_H
00025
00026 #ifdef _WIN32
00027 #pragma warning(push)
00028 #pragma warning(disable:4250)
00029 #pragma warning(disable:4251)
00030 #endif
00031
00032 #include <MeshVizXLM/mesh/topology/MiSurfaceTopologyExplicitI.h>
00033 #include <topology/MbTopologyI.h>
00034 #include <cell/MbTriangleCell.h>
00035
00036 #include <Inventor/STL/algorithm>
00037
00038
00044 class MbTriangleCellsSet : virtual public MiSurfaceTopologyExplicitI, public MbTopologyI
00045 {
00046 public:
00047
00051 MbTriangleCellsSet();
00052
00056 virtual const MbTriangleCell* getCell(size_t cellId) const;
00057
00061 virtual size_t getNumCells() const;
00062
00066 virtual size_t getBeginNodeId() const
00067 {
00068 return m_beginNodeId;
00069 }
00070
00074 virtual size_t getEndNodeId() const
00075 {
00076 return m_endNodeId;
00077 }
00078
00083 template <typename _NodeIdIter>
00084 void assign(_NodeIdIter beginId, _NodeIdIter endId);
00085
00086 private:
00087 std::vector<MbTriangleCell> m_cells;
00088 size_t m_beginNodeId;
00089 size_t m_endNodeId;
00090
00091 };
00092
00093
00094
00095 inline
00096 MbTriangleCellsSet::MbTriangleCellsSet()
00097 : m_beginNodeId(0), m_endNodeId(0)
00098 {
00099 }
00100
00101
00102 inline const MbTriangleCell*
00103 MbTriangleCellsSet::getCell(size_t cellId) const
00104 {
00105 if (hasDeadCells() && isDead(cellId)) throw "Error accessing dead cells";
00106 return &(m_cells[cellId]);
00107 }
00108
00109
00110 inline size_t
00111 MbTriangleCellsSet::getNumCells() const
00112 {
00113 return m_cells.size();
00114 }
00115
00116
00117 template <typename _NodeIdIter>
00118 inline void
00119 MbTriangleCellsSet::assign(_NodeIdIter beginId, _NodeIdIter endId)
00120 {
00121 size_t numIds = std::distance(beginId,endId);
00122 size_t numCells = (numIds - numIds%3)/3;
00123 m_beginNodeId = std::numeric_limits<size_t>::max();
00124
00125 m_cells.clear();
00126 m_cells.reserve(numCells);
00127 _NodeIdIter it = beginId;
00128 size_t node[3];
00129 for (size_t i=0; i<numCells; ++i)
00130 {
00131 for (size_t n=0; n<3; n++)
00132 {
00133 node[n] = *it++;
00134 if(node[n]+1 > m_endNodeId) m_endNodeId = node[n]+1;
00135 if(node[n] < m_beginNodeId) m_beginNodeId = node[n];
00136 }
00137 m_cells.push_back(MbTriangleCell(node[0],node[1],node[2]));
00138 }
00139 m_timeStamp = MxTimeStamp::getTimeStamp();
00140 }
00141
00142 #ifdef _WIN32
00143 #pragma warning(pop)
00144 #endif
00145
00146 #endif
00147
00148