//---------------------------------------------------------------------------- // EgalTech 2014-2023 //---------------------------------------------------------------------------- // File : StmFromTriangleSoup.cpp Data : 07.05.23 Versione : 2.5e2 // Contenuto : Implementazione della classe StmFromTriangleSoup, per creare // una superficie trimesh da un insieme di triangoli // (può essere disordinato come STL o può essere una superficie). // // Modifiche : 19.05.14 DS Creazione modulo. // // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "/EgtDev/Include/EGkStmFromTriangleSoup.h" //---------------------------------------------------------------------------- StmFromTriangleSoup::StmFromTriangleSoup( void) : m_pSTM( nullptr) { } //---------------------------------------------------------------------------- StmFromTriangleSoup::~StmFromTriangleSoup( void) { if ( m_pSTM != nullptr) delete m_pSTM ; m_pSTM = nullptr ; } //---------------------------------------------------------------------------- bool StmFromTriangleSoup::Start( int nBuckets) { // creo la superficie trimesh m_pSTM = CreateSurfTriMesh() ; if ( m_pSTM == nullptr) return false ; // la inizializzo if ( ! m_pSTM->Init( 3, 1)) return false ; // inizializzo la griglia return m_VertGrid.Init( nBuckets) ; } //---------------------------------------------------------------------------- bool StmFromTriangleSoup::AddTriangle( const Triangle3d& Tria) { // verifico inizializzazione if ( m_pSTM == nullptr) return false ; // ciclo sui tre vertici int nIdV[3] ; for ( int i = 0 ; i < 3 ; ++ i) { // verifico se vertice già presente int nId ; if ( ! m_VertGrid.Find( Tria.GetP( i), 2 * EPS_SMALL, nId)) { // aggiungo il vertice if ( ( nIdV[i] = m_pSTM->AddVertex( Tria.GetP( i))) == SVT_NULL) return false ; m_VertGrid.InsertPoint( Tria.GetP( i), nIdV[i]) ; } else nIdV[i] = nId ; } // se i vertici sono tutti diversi tra loro, inserisco il triangolo if ( nIdV[0] != nIdV[1] && nIdV[0] != nIdV[2] && nIdV[1] != nIdV[2]) { if ( m_pSTM->AddTriangle( nIdV, Tria.GetGrade()) == SVT_NULL) return false ; } return true ; } //---------------------------------------------------------------------------- bool StmFromTriangleSoup::AddTriangle( const Point3d& ptP0, const Point3d& ptP1, const Point3d& ptP2, double dU0, double dV0, double dU1, double dV1, double dU2, double dV2) { // verifico inizializzazione if ( m_pSTM == nullptr) return false ; // ciclo sui tre vertici int nIdV[3] ; if ( ( nIdV[0] = AddVertex( ptP0, dU0, dV0)) == SVT_NULL) return false ; if ( ( nIdV[1] = AddVertex( ptP1, dU1, dV1)) == SVT_NULL) return false ; if ( ( nIdV[2] = AddVertex( ptP2, dU2, dV2)) == SVT_NULL) return false ; // se i vertici sono tutti diversi tra loro, inserisco il triangolo if ( nIdV[0] != nIdV[1] && nIdV[0] != nIdV[2] && nIdV[1] != nIdV[2]) { if ( m_pSTM->AddTriangle( nIdV) == SVT_NULL) return false ; } return true ; } //---------------------------------------------------------------------------- int StmFromTriangleSoup::AddVertex( const Point3d& ptP, double dU, double dV) { // verifico se già presente int nId ; if ( m_VertGrid.Find( ptP, 2 * EPS_SMALL, nId)) return nId ; // aggiungo il vertice if ( ( nId = m_pSTM->AddVertex( ptP, dU, dV)) == SVT_NULL) return SVT_NULL ; m_VertGrid.InsertPoint( ptP, nId) ; return nId ; } //---------------------------------------------------------------------------- bool StmFromTriangleSoup::AddSurfTriMesh( const ISurfTriMesh& stmSource) { // verifico inizializzazione if ( m_pSTM == nullptr) return false ; // verifico superficie sorgente if ( &stmSource == nullptr || ! stmSource.IsValid()) return false ; // recupero tutti i triangoli della superficie bool bOk = true ; Triangle3d Tria ; int nT = stmSource.GetFirstTriangle( Tria) ; while ( nT != SVT_NULL) { // inserisco il triangolo nella zuppa bOk = AddTriangle( Tria) && bOk ; // passo al triangolo successivo nT = stmSource.GetNextTriangle( nT, Tria) ; } return bOk ; } //---------------------------------------------------------------------------- bool StmFromTriangleSoup::End( void) { // verifico inizializzazione if ( m_pSTM == nullptr) return false ; // sistemazioni finali della superficie return m_pSTM->AdjustTopology() ; } //---------------------------------------------------------------------------- ISurfTriMesh* StmFromTriangleSoup::GetSurf( void) { ISurfTriMesh* pRet = m_pSTM ; m_pSTM = nullptr ; return pRet ; }