EgtGraphics 2.6c2 :

- aggiunta possibilità di visualizzare curve di entità solo in shading
- utilizzata questa possibilità per spigoli vivi di TriMesh e Zmap.
This commit is contained in:
Dario Sassi
2024-03-10 10:22:18 +01:00
parent 49dac32893
commit 7930a229f9
9 changed files with 122 additions and 55 deletions
+64 -15
View File
@@ -231,12 +231,20 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj)
nCount += 2 * pZmap->GetBlockCount() ;
if ( ( m_nShowZmap & ZSM_LINES) != 0 || ( m_nShowZmap & ZSM_NORMALS) != 0)
nCount += 1 ;
if ( pZmap->GetShowEdges())
nCount += 1 ;
}
}
else if (( nGeoType & GEO_SURF) != 0) {
const ISurfTriMesh* pSTM = GetSurfTriMeshAux( pGeoObj) ;
if ( pSTM != nullptr && pSTM->GetMaxTFlag() > 0)
nCount = 2 ;
if ( pSTM != nullptr) {
if ( pSTM->GetMaxTFlag() > 0)
nCount = 2 ;
else
nCount = 1 ;
if ( pSTM->GetShowEdges())
nCount += 1 ;
}
}
// nuova modalità grafica solo per superfici e testi con molti triangoli o solidi Zmap
const int N_MIN_TRIA_NEWWAY = 100 ;
@@ -366,7 +374,11 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj)
if ( pSTM == nullptr)
return false ;
// superficie con visualizzazione standard
if ( pSTM->GetMaxTFlag() == 0) {
bool bTwoColors = ( pSTM->GetMaxTFlag() > 0) ;
if ( ! bTwoColors) {
// Imposto indice blocco corrente
if ( pGraphics->SetCurrent( 0))
pGraphics->Clear() ;
// recupero il materiale
Material mMat ;
if ( ! iIter.GetCalcMaterial( mMat))
@@ -425,9 +437,8 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj)
// Ciclo sui colori
for ( int j = 0 ; j < STM_COL ; ++ j) {
// Imposto indice blocco corrente
pGraphics->SetCurrent( j) ;
// lo pulisco
pGraphics->Clear() ;
if ( pGraphics->SetCurrent( j))
pGraphics->Clear() ;
// se non ci sono triangoli, passo oltre
if ( nTri[j] == 0)
continue ;
@@ -454,6 +465,28 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj)
pGraphics->EndTriangles() ;
}
}
// eventuali spigoli vivi
if ( pSTM->GetShowEdges()) {
if ( pGraphics->SetCurrent( bTwoColors ? 2 : 1))
pGraphics->Clear() ;
int nEdgCnt = pSTM->GetEdgeCount() ;
if ( nEdgCnt > 0) {
pGraphics->AddColor( DGRAY) ;
pGraphics->AddMaterial( DGRAY, DGRAY, DGRAY, 10) ;
pGraphics->AddBackMaterial( DGRAY) ;
PNTVECTOR vPnt ; vPnt.reserve( 2 * nEdgCnt) ;
for ( int i = 0 ; i < nEdgCnt ; ++i) {
Point3d ptP1, ptP2 ;
double dAng ;
if ( pSTM->GetEdge( i, ptP1, ptP2, dAng) &&
abs( dAng) > pSTM->GetSmoothAngle()) {
vPnt.emplace_back( ptP1) ;
vPnt.emplace_back( ptP2) ;
}
}
pGraphics->AddLines( vPnt, false, true) ;
}
}
}
// se Zmap
else if ( nGeoType == VOL_ZMAP) {
@@ -509,10 +542,9 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj)
}
// Ciclo sui colori
for ( int j = 0 ; j < ZMAP_COL ; ++ j) {
// Imposto indice blocco corrente
pGraphics->SetCurrent( ZMAP_COL * i + j) ;
// lo pulisco
pGraphics->Clear() ;
// Imposto indice blocco corrente e lo pulisco
if ( pGraphics->SetCurrent( ZMAP_COL * i + j))
pGraphics->Clear() ;
// se non ci sono triangoli, passo oltre
if ( nTri[j] == 0)
continue ;
@@ -538,11 +570,11 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj)
}
}
// visualizzazione spilloni e normali (sempre nell'ultimo blocco)
if ( ( m_nShowZmap & ZSM_LINES) != 0 || ( m_nShowZmap & ZSM_NORMALS) != 0) {
// imposto indice blocco corrente
pGraphics->SetCurrent( ZMAP_COL * nCount) ;
// lo pulisco
pGraphics->Clear() ;
bool bLinNrmShow = ( ( m_nShowZmap & ZSM_LINES) != 0 || ( m_nShowZmap & ZSM_NORMALS) != 0) ;
if ( bLinNrmShow) {
// imposto indice blocco corrente e lo pulisco
if ( pGraphics->SetCurrent( ZMAP_COL * nCount))
pGraphics->Clear() ;
// ciclo sui tre gruppi di spilloni
int nKmin = ( m_nShowZmap & ZSM_LINES) != 0 ? 0 : 3 ;
int nKmax = ( m_nShowZmap & ZSM_NORMALS) != 0 ? 6 : 3 ;
@@ -580,6 +612,23 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj)
pGraphics->AddLines( vPnt) ;
}
}
// eventuali spigoli vivi
if ( pZmap->GetShowEdges()) {
if ( pGraphics->SetCurrent( ZMAP_COL * nCount + ( bLinNrmShow ? 1 : 0)))
pGraphics->Clear() ;
ICURVEPOVECTOR vpCurve ;
if ( pZmap->GetEdges( vpCurve) && ! vpCurve.empty()) {
int nEdgCnt = int( vpCurve.size()) ;
pGraphics->AddColor( DGRAY) ;
pGraphics->AddMaterial( DGRAY, DGRAY, DGRAY, 10) ;
pGraphics->AddBackMaterial( DGRAY) ;
for ( const auto& pCrv : vpCurve) {
PolyLine PL ;
if ( pCrv->ApproxWithLines(10 * EPS_SMALL, ANG_TOL_GRAPH_DEG, ICurve::APL_SPECIAL, PL))
pGraphics->AddPolyLine( PL, false, true) ;
}
}
}
}
// se testo
else if ( nGeoType == EXT_TEXT) {