"L. Spiro Engine"
|
00001 00017 #ifndef __LSG_STRIPADJACENCY_H__ 00018 #define __LSG_STRIPADJACENCY_H__ 00019 00020 #include "../LSGGraphicsLib.h" 00021 #include "Search/LSSTDIndexSorter.h" 00022 00023 #include "Map/LSTLMap.h" 00024 00025 namespace lsg { 00026 00035 class CStripAdjacency { 00036 public : 00037 // == Various constructors. 00038 LSE_CALLCTOR CStripAdjacency(); 00039 LSE_CALLCTOR ~CStripAdjacency(); 00040 00041 00042 // == Types. 00046 typedef struct LSG_ADJ_TRI { 00050 LSUINT32 ui32Verts[3]; 00051 00055 LSUINT32 ui32Tris[3]; 00056 } * LPLSG_ADJ_TRI, * const LPCLSG_ADJ_TRI; 00057 00061 typedef struct LSG_ADJ_EDGE { 00065 LSUINT32 ui32Ref0; 00066 00070 LSUINT32 ui32Ref1; 00071 00075 LSUINT32 ui32Face; 00076 } * LPLSG_ADJ_EDGE, * const LPCLSG_ADJ_EDGE; 00077 00078 00079 // == Functions. 00089 LSBOOL LSE_CALL InitStripAdjacency( LSUINT32 _ui32Faces = 0UL, const LSUINT32 * _pui32Faces = NULL, const LSUINT16 * _pui16Faces = NULL ); 00090 00097 LSBOOL LSE_CALL CreateDatabase(); 00098 00102 LSVOID LSE_CALL Reset(); 00103 00109 LSE_INLINE LSUINT32 LSE_CALL TotalFaces() const; 00110 00116 LSE_INLINE LSUINT32 LSE_CALL TotalEdges() const; 00117 00123 LSE_INLINE const LSG_ADJ_TRI * LSE_CALL Faces() const; 00124 00130 LSE_INLINE const LSG_ADJ_EDGE * LSE_CALL 00131 Edges() const; 00132 00141 static LSE_INLINE LSUINT32 LSE_CALL FindEdge( const LSG_ADJ_TRI &_atAdjInfo, LSUINT32 _ui32Ref0, LSUINT32 _ui32Ref1 ); 00142 00151 static LSE_INLINE LSUINT32 LSE_CALL OppositeVertex( const LSG_ADJ_TRI &_atAdjInfo, LSUINT32 _ui32Ref0, LSUINT32 _ui32Ref1 ); 00152 00153 protected : 00154 // == Members. 00158 LSG_ADJ_TRI * m_patFaces; 00159 00163 LSG_ADJ_EDGE * m_paeEdges; 00164 00168 LSUINT32 m_ui32Faces; 00169 00173 LSUINT32 m_ui32Edges; 00174 00175 00176 // == Functions. 00184 LSVOID LSE_CALL AddTriangle( LSUINT32 _ui32Vert0, LSUINT32 _ui32Vert1, LSUINT32 _ui32Vert2 ); 00185 00193 LSVOID LSE_CALL AddEdge( LSUINT32 _ui32Edge0, LSUINT32 _ui32Edge1, LSUINT32 _ui32Face ); 00194 00204 LSBOOL LSE_CALL UpdateLink( LSUINT32 _ui32Tri0, LSUINT32 _ui32Tri1, LSUINT32 _ui32Ref0, LSUINT32 _ui32Ref1 ); 00205 00206 }; 00207 00208 00209 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00210 // DEFINITIONS 00211 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00212 // == Functions. 00218 LSE_INLINE LSUINT32 LSE_CALL CStripAdjacency::TotalFaces() const { 00219 return m_ui32Faces; 00220 } 00221 00227 LSE_INLINE LSUINT32 LSE_CALL CStripAdjacency::TotalEdges() const { 00228 return m_ui32Edges; 00229 } 00230 00236 LSE_INLINE const CStripAdjacency::LSG_ADJ_TRI * LSE_CALL CStripAdjacency::Faces() const { 00237 return m_patFaces; 00238 } 00239 00245 LSE_INLINE const CStripAdjacency::LSG_ADJ_EDGE * LSE_CALL CStripAdjacency::Edges() const { 00246 return m_paeEdges; 00247 } 00248 00257 LSE_INLINE LSUINT32 LSE_CALL CStripAdjacency::FindEdge( const LSG_ADJ_TRI &_atAdjInfo, LSUINT32 _ui32Ref0, LSUINT32 _ui32Ref1 ) { 00258 LSUINT32 ui32Edge = 0xFF; 00259 if ( _atAdjInfo.ui32Verts[0] == _ui32Ref0 && _atAdjInfo.ui32Verts[1] == _ui32Ref1 ) { ui32Edge = 0; } 00260 else if ( _atAdjInfo.ui32Verts[0] == _ui32Ref1 && _atAdjInfo.ui32Verts[1] == _ui32Ref0 ) { ui32Edge = 0; } 00261 else if ( _atAdjInfo.ui32Verts[0] == _ui32Ref0 && _atAdjInfo.ui32Verts[2] == _ui32Ref1 ) { ui32Edge = 1; } 00262 else if ( _atAdjInfo.ui32Verts[0] == _ui32Ref1 && _atAdjInfo.ui32Verts[2] == _ui32Ref0 ) { ui32Edge = 1; } 00263 else if ( _atAdjInfo.ui32Verts[1] == _ui32Ref0 && _atAdjInfo.ui32Verts[2] == _ui32Ref1 ) { ui32Edge = 2; } 00264 else if ( _atAdjInfo.ui32Verts[1] == _ui32Ref1 && _atAdjInfo.ui32Verts[2] == _ui32Ref0 ) { ui32Edge = 2; } 00265 return ui32Edge; 00266 } 00267 00276 LSE_INLINE LSUINT32 LSE_CALL CStripAdjacency::OppositeVertex( const LSG_ADJ_TRI &_atAdjInfo, LSUINT32 _ui32Ref0, LSUINT32 _ui32Ref1 ) { 00277 LSUINT32 ui32Ref = ~0UL; 00278 if ( _atAdjInfo.ui32Verts[0] == _ui32Ref0 && _atAdjInfo.ui32Verts[1] == _ui32Ref1 ) { ui32Ref = _atAdjInfo.ui32Verts[2]; } 00279 else if ( _atAdjInfo.ui32Verts[0] == _ui32Ref1 && _atAdjInfo.ui32Verts[1] == _ui32Ref0 ) { ui32Ref = _atAdjInfo.ui32Verts[2]; } 00280 else if ( _atAdjInfo.ui32Verts[0] == _ui32Ref0 && _atAdjInfo.ui32Verts[2] == _ui32Ref1 ) { ui32Ref = _atAdjInfo.ui32Verts[1]; } 00281 else if ( _atAdjInfo.ui32Verts[0] == _ui32Ref1 && _atAdjInfo.ui32Verts[2] == _ui32Ref0 ) { ui32Ref = _atAdjInfo.ui32Verts[1]; } 00282 else if ( _atAdjInfo.ui32Verts[1] == _ui32Ref0 && _atAdjInfo.ui32Verts[2] == _ui32Ref1 ) { ui32Ref = _atAdjInfo.ui32Verts[0]; } 00283 else if ( _atAdjInfo.ui32Verts[1] == _ui32Ref1 && _atAdjInfo.ui32Verts[2] == _ui32Ref0 ) { ui32Ref = _atAdjInfo.ui32Verts[0]; } 00284 return ui32Ref; 00285 } 00286 00287 } // namespace lsg 00288 00289 #endif // __LSG_STRIPADJACENCY_H__