EgtGraphics 2.7g2 :

- corretta gestione SetCurrent degli ObjGraphics che non sono Multi (prima errori  con visualizzazione solo spilloni di Zmap).
This commit is contained in:
Dario Sassi
2025-07-11 11:42:45 +02:00
parent 117511a04f
commit 3a4c73f77f
5 changed files with 69 additions and 57 deletions
+64 -56
View File
@@ -228,6 +228,10 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj)
// recupero eventuale parte custom
const IUserObj* pUserObj = iIter.GetUserObj() ;
// numero di colori per TriMesh e Zmap
const int STM_COL = 2 ;
const int ZMAP_COL = 2 ;
// se non esiste grafica associata, la creo
if ( pGeoObj->GetObjGraphics() == nullptr) {
// oggetto grafico molteplice solo per Zmap o superfici che lo richiedono
@@ -236,7 +240,7 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj)
const IVolZmap* pZmap = GetVolZmap( pGeoObj) ;
if ( pZmap != nullptr) {
if ( ( m_nShowZmap & ZSM_SURF) != 0)
nCount += 2 * pZmap->GetBlockCount() ;
nCount += ZMAP_COL * pZmap->GetBlockCount() ;
if ( ( m_nShowZmap & ZSM_LINES) != 0 || ( m_nShowZmap & ZSM_NORMALS) != 0)
nCount += 1 ;
if ( pZmap->GetShowEdges())
@@ -247,7 +251,7 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj)
const ISurfTriMesh* pSTM = GetSurfTriMeshAux( pGeoObj) ;
if ( pSTM != nullptr) {
if ( pSTM->GetMaxTFlag() > 0)
nCount = 2 ;
nCount = STM_COL ;
else
nCount = 1 ;
if ( pSTM->GetShowEdges())
@@ -420,8 +424,6 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj)
}
// altrimenti superficie con due colori
else {
// numero di colori
const int STM_COL = 2 ;
// definizione materiali
Material mMat[STM_COL] ;
Color cCol[STM_COL] ;
@@ -507,8 +509,6 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj)
return false ;
// numero di blocchi
int nCount = 0 ;
// numero di colori
const int ZMAP_COL = 2 ;
// indicazione se tridexel
bool bIsTriDexel = pZmap->IsTriDexel() ;
// se triangoli da disegnare
@@ -536,9 +536,9 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj)
// Ciclo sui blocchi
nCount = pZmap->GetBlockCount() ;
for ( int i = 0 ; i < nCount ; ++ i) {
// Se blocco già aggiornato, vado oltre
pGraphics->SetCurrent( ZMAP_COL * i) ;
if ( pZmap->GetBlockUpdatingCounter( i) <= pGraphics->GetCounter())
// Se blocco non esistente o già aggiornato, vado oltre
if ( ! pGraphics->SetCurrent( ZMAP_COL * i) ||
pZmap->GetBlockUpdatingCounter( i) <= pGraphics->GetCounter())
continue ;
// Recupero i triangoli del blocco
TRIA3DEXVECTOR vTria ;
@@ -553,9 +553,11 @@ 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 e lo pulisco
if ( pGraphics->SetCurrent( ZMAP_COL * i + j))
pGraphics->Clear() ;
// Imposto indice blocco corrente, se non esiste passo oltre
if ( ! pGraphics->SetCurrent( ZMAP_COL * i + j))
continue ;
// lo pulisco
pGraphics->Clear() ;
// se non ci sono triangoli, passo oltre
if ( nTri[j] == 0)
continue ;
@@ -583,59 +585,65 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj)
// visualizzazione spilloni e normali (sempre nell'ultimo blocco)
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))
// imposto indice blocco corrente
if ( pGraphics->SetCurrent( ZMAP_COL * nCount)) {
// lo pulisco
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 ;
Color vCol[6] = {BLUE, RED, GREEN, BLUE, RED, GREEN} ;
for ( int k = nKmin ; k < nKmax ; ++ k) {
pGraphics->AddColor( vCol[k]) ;
pGraphics->AddMaterial( vCol[k], vCol[k], vCol[k], 10) ;
pGraphics->AddBackMaterial( vCol[k]) ;
PNTVECTOR vPnt ;
for ( int i = 0 ; ; ++ i) {
bool bOutBreak = false ;
for ( int j = 0 ; ; ++ j) {
POLYLINELIST lstPL ;
if ( pZmap->GetDexelLines( k, j, i, lstPL)) {
for ( const auto& PL : lstPL) {
Point3d ptS, ptE ;
bool Found = PL.GetFirstLine( ptS, ptE) ;
while ( Found) {
vPnt.emplace_back( ptS) ;
vPnt.emplace_back( ptE) ;
Found = PL.GetNextLine( ptS, ptE) ;
// ciclo sui tre gruppi di spilloni
int nKmin = ( m_nShowZmap & ZSM_LINES) != 0 ? 0 : 3 ;
int nKmax = ( m_nShowZmap & ZSM_NORMALS) != 0 ? 6 : 3 ;
Color vCol[6] = {BLUE, RED, GREEN, BLUE, RED, GREEN} ;
for ( int k = nKmin ; k < nKmax ; ++ k) {
pGraphics->AddColor( vCol[k]) ;
pGraphics->AddMaterial( vCol[k], vCol[k], vCol[k], 10) ;
pGraphics->AddBackMaterial( vCol[k]) ;
PNTVECTOR vPnt ;
for ( int i = 0 ; ; ++ i) {
bool bOutBreak = false ;
for ( int j = 0 ; ; ++ j) {
POLYLINELIST lstPL ;
if ( pZmap->GetDexelLines( k, j, i, lstPL)) {
for ( const auto& PL : lstPL) {
Point3d ptS, ptE ;
bool Found = PL.GetFirstLine( ptS, ptE) ;
while ( Found) {
vPnt.emplace_back( ptS) ;
vPnt.emplace_back( ptE) ;
Found = PL.GetNextLine( ptS, ptE) ;
}
}
}
}
else {
if ( j == 0)
bOutBreak = true ;
break ;
}
}
if ( bOutBreak)
break ;
else {
if ( j == 0)
bOutBreak = true ;
break ;
}
}
if ( bOutBreak)
break ;
}
if ( vPnt.size() > 0)
pGraphics->AddLines( vPnt) ;
}
if ( vPnt.size() > 0)
pGraphics->AddLines( vPnt) ;
}
}
// eventuali spigoli vivi
if ( pZmap->GetShowEdges()) {
if ( pGraphics->SetCurrent( ZMAP_COL * nCount + ( bLinNrmShow ? 1 : 0)))
// imposto indice blocco corrente
if ( pGraphics->SetCurrent( ZMAP_COL * nCount + ( bLinNrmShow ? 1 : 0))) {
// lo pulisco
pGraphics->Clear() ;
ICURVEPOVECTOR vpCurve ;
if ( pZmap->GetEdges( vpCurve) && ! vpCurve.empty()) {
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) ;
// inserisco le curve
ICURVEPOVECTOR vpCurve ;
if ( pZmap->GetEdges( vpCurve) && ! vpCurve.empty()) {
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) ;
}
}
}
}