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
+31 -9
View File
@@ -2040,15 +2040,16 @@ SurfTriMesh::RemoveTJunctions(void)
PNTVECTOR vPt ;
INTVECTOR vTr ;
if ( Triangulate().Make( Polygon, vPt, vTr)) {
// Rimuovo il triangolo originale
// Rimuovo il triangolo originale e salvo il suo flag
int nTFlag = m_vTria[nT].nTFlag ;
RemoveTriangle( nT) ;
// Inserisco i nuovi triangoli che lo sostituiscono
// Inserisco i nuovi triangoli che lo sostituiscono e asegno loro lo stesso flag
for ( int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) {
int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2]} ;
int nNewId[3] = { AddVertex( vPt[nNewTriaVertId[0]]),
AddVertex( vPt[nNewTriaVertId[1]]),
AddVertex( vPt[nNewTriaVertId[2]])} ;
AddTriangle( nNewId) ;
AddTriangle( nNewId, nTFlag) ;
}
}
}
@@ -2171,13 +2172,22 @@ SurfTriMesh::ScanForTripleTriangles( bool& bModified)
nAdjTriaContactEdge[(nAdjTria - 1) / 2] = nAdjEdge ;
}
}
// Elimino i triangoli
// Elimino i triangoli e salvo i loro Flag
int vnTFlag[3] ;
for ( int nTria = 0 ; nTria < 3 ; ++ nTria) {
vnTFlag[nTria] = m_vTria[vTriaIndex[nTria]].nTFlag ;
RemoveTriangle( vTriaIndex[nTria]) ;
}
// Aggiungo il novo triangolo
// Aggiungo il nuovo triangolo con il flag
int nNewTFlag ;
if ( vnTFlag[0] == vnTFlag[1])
nNewTFlag = vnTFlag[1] ;
else if ( vnTFlag[0] == vnTFlag[2] || vnTFlag[1] == vnTFlag[2])
nNewTFlag = vnTFlag[2] ;
else
nNewTFlag = 0 ;
int nNewVert[3] = { vVertAndAdjTria[0], vVertAndAdjTria[2], vVertAndAdjTria[4] } ;
int nNewTriaId = AddTriangle( nNewVert) ;
int nNewTriaId = AddTriangle( nNewVert, nNewTFlag) ;
if ( nNewTriaId != SVT_NULL) {
// Sistemo le adiacenze
m_vTria[nNewTriaId].nIdAdjac[0] = vVertAndAdjTria[1] ;
@@ -2256,6 +2266,7 @@ SurfTriMesh::FlipTriangles( int nTA, int nTB)
bool
SurfTriMesh::Add( const ISurfTriMesh& Other)
{
m_OGrMgr.Clear() ;
SurfTriMesh SurfB ;
SurfB.CopyFrom( &Other) ;
IntersectTriMeshTriangle( SurfB) ;
@@ -2266,6 +2277,7 @@ SurfTriMesh::Add( const ISurfTriMesh& Other)
if ( m_vTria[nTA].nTempPart == 1 || m_vTria[nTA].nTempPart == - 2)
RemoveTriangle( nTA) ;
}
int nPrevMaxTFlag = m_nMaxTFlag ;
int nTriaNumB = SurfB.GetTriangleSize() ;
for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) {
if ( SurfB.m_vTria[nTB].nTempPart == - 1) {
@@ -2273,7 +2285,9 @@ SurfTriMesh::Add( const ISurfTriMesh& Other)
for ( int nV = 0 ; nV < 3 ; ++ nV) {
nNewVert[nV] = AddVertex( SurfB.m_vVert[SurfB.m_vTria[nTB].nIdVert[nV]].ptP) ;
}
AddTriangle( nNewVert) ;
if ( nPrevMaxTFlag == m_nMaxTFlag)
++ m_nMaxTFlag ;
AddTriangle( nNewVert, m_nMaxTFlag) ;
}
}
if ( ! AdjustVertices() || ! DoCompacting())
@@ -2289,6 +2303,7 @@ SurfTriMesh::Add( const ISurfTriMesh& Other)
bool
SurfTriMesh::Intersect( const ISurfTriMesh& Other)
{
m_OGrMgr.Clear() ;
SurfTriMesh SurfB ;
SurfB.CopyFrom( &Other) ;
IntersectTriMeshTriangle( SurfB) ;
@@ -2299,6 +2314,7 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other)
if ( m_vTria[nTA].nTempPart == - 1 || m_vTria[nTA].nTempPart == - 2)
RemoveTriangle( nTA) ;
}
int nPrevMaxTFlag = m_nMaxTFlag ;
int nTriaNumB = SurfB.GetTriangleSize() ;
for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) {
if ( SurfB.m_vTria[nTB].nTempPart == 1) {
@@ -2306,7 +2322,9 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other)
for ( int nV = 0 ; nV < 3 ; ++ nV) {
nNewVert[nV] = AddVertex( SurfB.m_vVert[SurfB.m_vTria[nTB].nIdVert[nV]].ptP) ;
}
AddTriangle( nNewVert) ;
if ( nPrevMaxTFlag == m_nMaxTFlag)
++ m_nMaxTFlag ;
AddTriangle( nNewVert, m_nMaxTFlag) ;
}
}
if ( ! AdjustVertices() || ! DoCompacting())
@@ -2322,6 +2340,7 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other)
bool
SurfTriMesh::Subtract( const ISurfTriMesh& Other)
{
m_OGrMgr.Clear() ;
SurfTriMesh SurfB ;
SurfB.CopyFrom( &Other) ;
IntersectTriMeshTriangle( SurfB) ;
@@ -2332,6 +2351,7 @@ SurfTriMesh::Subtract( const ISurfTriMesh& Other)
if ( m_vTria[nTA].nTempPart == 1 || m_vTria[nTA].nTempPart == 2)
RemoveTriangle( nTA) ;
}
int nPrevMaxTFlag = m_nMaxTFlag ;
int nTriaNumB = SurfB.GetTriangleSize() ;
for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) {
if ( SurfB.m_vTria[nTB].nTempPart == 1) {
@@ -2340,7 +2360,9 @@ SurfTriMesh::Subtract( const ISurfTriMesh& Other)
nNewVert[nV] = AddVertex( SurfB.m_vVert[SurfB.m_vTria[nTB].nIdVert[nV]].ptP) ;
}
swap( nNewVert[1], nNewVert[2]) ;
AddTriangle( nNewVert) ;
if ( nPrevMaxTFlag == m_nMaxTFlag)
++ m_nMaxTFlag ;
AddTriangle( nNewVert, m_nMaxTFlag) ;
}
}
if ( ! AdjustVertices() || ! DoCompacting())