diff --git a/EgtGraphics.rc b/EgtGraphics.rc index 31abc0b..6a8e012 100644 Binary files a/EgtGraphics.rc and b/EgtGraphics.rc differ diff --git a/ObjEGrGraphics.h b/ObjEGrGraphics.h index d3b555d..4428c0c 100644 --- a/ObjEGrGraphics.h +++ b/ObjEGrGraphics.h @@ -31,7 +31,7 @@ class ObjEGrGraphics : public IObjGraphics virtual bool IsValid( void) = 0 ; virtual void SetScene( Scene* pScene) = 0 ; virtual Scene* GetScene( void) = 0 ; - virtual bool SetCurrent( int nCurr) { return false ; } + virtual bool SetCurrent( int nCurr) = 0 ; virtual void Clear( void) = 0 ; virtual bool Validate( void) = 0 ; virtual bool AddColor( const Color& colC) = 0 ; diff --git a/ObjNewGraphics.h b/ObjNewGraphics.h index e3e6221..9fd5e50 100644 --- a/ObjNewGraphics.h +++ b/ObjNewGraphics.h @@ -69,6 +69,8 @@ class ObjNewGraphics : public ObjEGrGraphics { m_pScene = pScene ; } Scene* GetScene( void) override { return m_pScene ; } + bool SetCurrent( int nCurr) override + { return ( nCurr == 0) ; } void Clear( void) override ; bool Validate( void) override ; bool AddColor( const Color& colC) override ; diff --git a/ObjOldGraphics.h b/ObjOldGraphics.h index aa05447..9964089 100644 --- a/ObjOldGraphics.h +++ b/ObjOldGraphics.h @@ -74,6 +74,8 @@ class ObjOldGraphics : public ObjEGrGraphics { m_pScene = pScene ; } Scene* GetScene( void) override { return m_pScene ; } + bool SetCurrent( int nCurr) override + { return ( nCurr == 0) ; } void Clear( void) override ; bool Validate( void) override ; bool AddColor( const Color& colC) override ; diff --git a/SceneGeom.cpp b/SceneGeom.cpp index 44d3707..a7cd8a4 100644 --- a/SceneGeom.cpp +++ b/SceneGeom.cpp @@ -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) ; + } } } }