650540e573
- semplificata e ottimizzata creazione di superficie trimesh box standard - miglioramenti sintattici vari.
158 lines
5.0 KiB
C++
158 lines
5.0 KiB
C++
//----------------------------------------------------------------------------
|
|
// 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 ;
|
|
}
|