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