EgtGeomKernel 2.2f4 :

- aggiunta gestione secondo colore in operazioni booleane tra superfici trimesh.
This commit is contained in:
Dario Sassi
2020-06-14 09:47:41 +00:00
parent 381b8a19e9
commit 05f981a0e4
6 changed files with 90 additions and 22 deletions
+45 -9
View File
@@ -38,7 +38,7 @@ GEOOBJ_REGISTER( SRF_TRIMESH, NGE_S_TRM, SurfTriMesh) ;
SurfTriMesh::SurfTriMesh( void)
: m_nStatus( TO_VERIFY), m_dLinTol( STM_STD_LIN_TOL), m_dBoundaryAng( STM_STD_BOUNDARY_ANG),
m_dSmoothAng( STM_STD_SMOOTH_ANG), m_bOriented( false), m_bClosed( false), m_bFaceted( false),
m_nTimeStamp( 0), m_nTempProp( 0), m_pHGrd3d( nullptr), m_nParts( -1)
m_nTimeStamp( 0), m_nTempProp( 0), m_nMaxTFlag( 0), m_nParts( -1), m_pHGrd3d( nullptr)
{
m_dCosBndAng = cos( m_dBoundaryAng * DEGTORAD) ;
m_dCosSmAng = cos( m_dSmoothAng * DEGTORAD) ;
@@ -76,6 +76,8 @@ SurfTriMesh::Init( int nNumVert, int nNumTria, int nNumFacet)
// completo inizializzazione
m_nStatus = OK ;
m_bClosed = false ;
m_nMaxTFlag = 0 ;
m_nParts = -1 ;
return true ;
}
@@ -127,7 +129,7 @@ SurfTriMesh::SetVertex( int nInd, const StmVert& vV)
//----------------------------------------------------------------------------
int
SurfTriMesh::AddTriangle( const int nIdVert[3])
SurfTriMesh::AddTriangle( const int nIdVert[3], int nTFlag)
{
// verifico che i tre indici siano diversi
if ( nIdVert[0] == nIdVert[1] ||
@@ -160,8 +162,10 @@ SurfTriMesh::AddTriangle( const int nIdVert[3])
m_OGrMgr.Reset() ;
ResetHashGrids3d() ;
// inserisco il triangolo
try { m_vTria.emplace_back( nIdVert) ;}
try { m_vTria.emplace_back( nIdVert, nTFlag) ;}
catch(...) { return SVT_NULL ;}
// aggiorno massimo TFlag
m_nMaxTFlag = max( m_nMaxTFlag, nTFlag) ;
// ne determino l'indice
return int( m_vTria.size() - 1) ;
}
@@ -193,6 +197,8 @@ SurfTriMesh::SetTriangle( int nInd, const StmTria& tT)
}
// inserisco il triangolo
m_vTria[nInd] = tT ;
// aggiorno massimo TFlag
m_nMaxTFlag = max( m_nMaxTFlag, tT.nTFlag) ;
return true ;
}
@@ -368,14 +374,28 @@ SurfTriMesh::GetVertexCount( void) const
int
SurfTriMesh::GetTriangleCount( void) const
{
// calcolo il numero dei triangoli cancellati
int nErased = 0 ;
// calcolo il numero dei triangoli validi
int nCount = 0 ;
for ( int nId = 0 ; nId < GetTriangleSize() ; ++ nId) {
if ( m_vTria[nId].nIdVert[0] == SVT_DEL)
++ nErased ;
if ( m_vTria[nId].nIdVert[0] != SVT_DEL)
++ nCount ;
}
return ( GetTriangleSize() - nErased) ;
return nCount ;
}
//----------------------------------------------------------------------------
int
SurfTriMesh::GetTriangleCount( int nTFlag) const
{
// calcolo il numero dei triangoli con flag indicato e non cancellati
int nCount = 0 ;
for ( int nId = 0 ; nId < GetTriangleSize() ; ++ nId) {
if ( m_vTria[nId].nIdVert[0] != SVT_DEL && m_vTria[nId].nTFlag == nTFlag)
++ nCount ;
}
return nCount ;
}
//----------------------------------------------------------------------------
@@ -466,6 +486,7 @@ SurfTriMesh::GetTriangle( int nId, Triangle3d& Tria) const
m_vVert[m_vTria[nId].nIdVert[1]].ptP,
m_vVert[m_vTria[nId].nIdVert[2]].ptP,
m_vTria[nId].vtN) ;
Tria.SetGrade( m_vTria[nId].nTFlag) ;
return true ;
}
@@ -492,6 +513,7 @@ SurfTriMesh::GetNextTriangle( int nId, Triangle3d& Tria) const
m_vVert[m_vTria[nId].nIdVert[1]].ptP,
m_vVert[m_vTria[nId].nIdVert[2]].ptP,
m_vTria[nId].vtN) ;
Tria.SetGrade( m_vTria[nId].nTFlag) ;
// ritorno indice triangolo corrente
return nId ;
}
@@ -508,6 +530,7 @@ SurfTriMesh::GetTriangle( int nId, Triangle3dEx& Tria) const
m_vVert[m_vTria[nId].nIdVert[1]].ptP,
m_vVert[m_vTria[nId].nIdVert[2]].ptP,
m_vTria[nId].vtN) ;
Tria.SetGrade( m_vTria[nId].nTFlag) ;
GetTriangleBoundaryEdges( nId, const_cast<TriFlags3d&>( Tria.GetTriFlags())) ;
GetTriangleSmoothNormals( nId, const_cast<TriNormals3d&>( Tria.GetTriNormals())) ;
return true ;
@@ -536,6 +559,7 @@ SurfTriMesh::GetNextTriangle( int nId, Triangle3dEx& Tria) const
m_vVert[m_vTria[nId].nIdVert[1]].ptP,
m_vVert[m_vTria[nId].nIdVert[2]].ptP,
m_vTria[nId].vtN) ;
Tria.SetGrade( m_vTria[nId].nTFlag) ;
GetTriangleBoundaryEdges( nId, const_cast<TriFlags3d&>( Tria.GetTriFlags())) ;
GetTriangleSmoothNormals( nId, const_cast<TriNormals3d&>( Tria.GetTriNormals())) ;
// ritorno indice triangolo corrente
@@ -987,6 +1011,7 @@ SurfTriMesh::CopyFrom( const SurfTriMesh& stmSrc)
m_vFacet = stmSrc.m_vFacet ;
m_nTimeStamp = stmSrc.m_nTimeStamp ;
m_nTempProp = stmSrc.m_nTempProp ;
m_nMaxTFlag = stmSrc.m_nMaxTFlag ;
m_nParts = stmSrc.m_nParts ;
return true ;
}
@@ -1114,6 +1139,7 @@ SurfTriMesh::Load( NgeReader& ngeIn)
{
// imposto ricalcolo della grafica, della connessione e di hashgrids3d
m_OGrMgr.Reset() ;
m_nMaxTFlag = 0 ;
m_nParts = -1 ;
ResetHashGrids3d() ;
// leggo la prossima linea ( 2 parametri : dLinTol e dSmoothAng)
@@ -3601,7 +3627,7 @@ SurfTriMesh::ClonePart( int nPart) const
int nNewInd[3] = { pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[0]].ptP),
pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[1]].ptP),
pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[2]].ptP)} ;
if ( pSurfTM->AddTriangle( nNewInd) == SVT_NULL)
if ( pSurfTM->AddTriangle( nNewInd, m_vTria[i].nTFlag) == SVT_NULL)
return nullptr ;
}
}
@@ -3612,3 +3638,13 @@ SurfTriMesh::ClonePart( int nPart) const
// Restituisco la nuova superficie
return Release( pSurfTM) ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::ResetTFlags( void)
{
for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i)
m_vTria[i].nTFlag = 0 ;
m_nMaxTFlag = 0 ;
return true ;
}