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:
+64
-15
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user