"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSGraphicsLib/Src/TriangleStrips/LSGStripAdjacency.h

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__
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator