diff --git a/EgtGraphics.rc b/EgtGraphics.rc index 48f1555..b2a003d 100644 Binary files a/EgtGraphics.rc and b/EgtGraphics.rc differ diff --git a/ObjEGrGraphics.h b/ObjEGrGraphics.h index d95cf3c..8b31555 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) { return false ; } virtual void Clear( void) = 0 ; virtual bool AddColor( const Color& colC) = 0 ; virtual bool AddMaterial( const Color& colAmb, const Color& colDiff, @@ -45,6 +45,8 @@ class ObjEGrGraphics : public IObjGraphics virtual bool EndTriangles( void) = 0 ; virtual bool Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool ShowAux) = 0 ; virtual bool GetLocalBBox( BBox3d& b3Loc) const = 0 ; + virtual bool SetCounter( int nCnt) { return false ; } + virtual int GetCounter( void) const { return -1 ; } } ; //---------------------------------------------------------------------------- diff --git a/ObjMultiGraphics.cpp b/ObjMultiGraphics.cpp index f531e28..e6c6df4 100644 --- a/ObjMultiGraphics.cpp +++ b/ObjMultiGraphics.cpp @@ -188,6 +188,25 @@ ObjMultiGraphics::GetLocalBBox( BBox3d& b3Loc) const return ! m_b3Loc.IsEmpty() ; } +//---------------------------------------------------------------------------- +bool +ObjMultiGraphics::SetCounter( int nCnt) +{ + if ( m_nCurr < 0 || m_nCurr >= int( m_vOEGR.size())) + return false ; + m_Counter[m_nCurr] = nCnt ; + return true ; +} + +//---------------------------------------------------------------------------- +int +ObjMultiGraphics::GetCounter( void) const +{ + if ( m_nCurr < 0 || m_nCurr >= int( m_vOEGR.size())) + return -1 ; + return m_Counter[m_nCurr] ; +} + //---------------------------------------------------------------------------- ObjMultiGraphics::ObjMultiGraphics( int nCount, bool bNewWay) { @@ -200,5 +219,6 @@ ObjMultiGraphics::ObjMultiGraphics( int nCount, bool bNewWay) else m_vOEGR.emplace_back( new( nothrow) ObjOldGraphics) ; } + m_Counter.resize( nCount, 0) ; m_nCurr = - 1 ; } diff --git a/ObjMultiGraphics.h b/ObjMultiGraphics.h index f907b34..7763359 100644 --- a/ObjMultiGraphics.h +++ b/ObjMultiGraphics.h @@ -29,7 +29,7 @@ class ObjMultiGraphics : public ObjEGrGraphics void SetScene( Scene* pScene) override ; Scene* GetScene( void) override { return m_pScene ; } - bool SetCurrent( int nCurr) ; + bool SetCurrent( int nCurr) override ; void Clear( void) override ; bool AddColor( const Color& colC) override ; bool AddMaterial( const Color& colAmb, const Color& colDiff, @@ -43,6 +43,8 @@ class ObjMultiGraphics : public ObjEGrGraphics bool EndTriangles( void) override ; bool Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bShowAux) override ; bool GetLocalBBox( BBox3d& b3Loc) const override ; + bool SetCounter( int nCnt) override ; + int GetCounter( void) const override ; public : ObjMultiGraphics( int nCount, bool bNewWay) ; @@ -53,4 +55,5 @@ class ObjMultiGraphics : public ObjEGrGraphics mutable BBox3d m_b3Loc ; // BoundingBox locale int m_nCurr ; // Graphics corrente std::vector m_vOEGR ; // vettore di Graphics + std::vector m_Counter ; // vettore contatori di aggiornamento } ; diff --git a/SceneGeom.cpp b/SceneGeom.cpp index 243ccc6..aa3e78a 100644 --- a/SceneGeom.cpp +++ b/SceneGeom.cpp @@ -314,24 +314,15 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj) pGraphics->AddBackMaterial( GetSurfBackColor( mMat.GetDiffuse())) ; // ciclo sui triangoli della superficie pGraphics->StartTriangles( pSTM->GetTriangleCount()) ; - Triangle3d Tria ; - TriFlags3d TFlags ; - TriNormals3d TNrms ; + Triangle3dEx Tria ; int nId = pSTM->GetFirstTriangle( Tria) ; while ( nId != SVT_NULL) { // se visualizzazione avanzata : edge solo se boundary e normali ai vertici smussate - if ( m_bShowTriaAdvanced) { - pSTM->GetTriangleBoundaryEdges( nId, TFlags) ; - pSTM->GetTriangleSmoothNormals( nId, TNrms) ; - } + if ( m_bShowTriaAdvanced) + pGraphics->AddTriangle( Tria, Tria.GetTriFlags(), Tria.GetTriNormals()) ; // altrimenti : tutti gli edge e normali ai vertici prendono quella del triangolo - else { - for ( int i = 0 ; i < 3 ; ++i) { - TFlags.bFlag[i] = true ; - TNrms.vtN[i] = Tria.GetN() ; - } - } - pGraphics->AddTriangle( Tria, TFlags, TNrms) ; + else + pGraphics->AddTriangle( Tria, TriFlags3d(), TriNormals3d( Tria.GetN())) ; nId = pSTM->GetNextTriangle( nId, Tria) ; } pGraphics->EndTriangles() ; @@ -344,86 +335,77 @@ 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 ; // se triangoli da disegnare if ( ( m_nShowZmap & ZSM_SURF) != 0) { - // recupero il materiale - Material mMat ; - if ( ! iIter.GetCalcMaterial( mMat)) - mMat.Set( m_colDef) ; - // secondo materiale per parti lavorate (tonalità spostata di 18 deg) - Color cCol2 = siObj.colObj ; - Material mMat2( mMat) ; + // definizione materiali + Material mMat[ZMAP_COL] ; + Color cCol[ZMAP_COL] ; + // recupero il materiale principale + cCol[0] = siObj.colObj ; + if ( ! iIter.GetCalcMaterial( mMat[0])) + mMat[0].Set( m_colDef) ; + // secondo materiale per parti lavorate (tonalità spostata di 15 deg) + cCol[1] = cCol[0] ; + mMat[1] = mMat[0] ; // se richiesto diverso - if (( m_nShowZmap & ZSM_COLORS) != 0) { + if ( ( m_nShowZmap & ZSM_COLORS) != 0) { HSV hsv = GetHSVFromColor( siObj.colObj) ; - hsv.dHue += ANG_RIGHT / 5 ; + hsv.dHue += ANG_RIGHT / 6 ; hsv.dVal *= 1.2 ; - cCol2 = GetColorFromHSV( hsv) ; - mMat2.Set( cCol2) ; + cCol[1] = GetColorFromHSV( hsv) ; + mMat[1].Set( cCol[1]) ; } - // ciclo sui blocchi da aggiornare - INTVECTOR vnModif ; - TRIA3DEXLISTVECTOR vlTria ; + // Ciclo sui blocchi nCount = pZmap->GetBlockCount() ; - pZmap->GetTriangles( false, vnModif, vlTria) ; for ( int i = 0 ; i < nCount ; ++ i) { - // se blocco non modificato, vado oltre - if ( vnModif[i] < 0) + // Se blocco già aggiornato, vado oltre + pGraphics->SetCurrent( ZMAP_COL * i) ; + if ( pZmap->GetBlockUpdatingCounter( i) <= pGraphics->GetCounter()) continue ; + // Recupero i triangoli del blocco + TRIA3DEXVECTOR vTria ; + pZmap->GetBlockTriangles( i, vTria) ; // conto i triangoli per tipo (Flag == 0 e altri) - int nTri0 = 0 ; int nTri1 = 0 ; - for ( const auto& Tria : vlTria[vnModif[i]]) { + int nTri[ZMAP_COL] = { 0, 0} ; + for ( const auto& Tria : vTria) { if ( Tria.GetGrade() == 0) - ++ nTri0 ; + ++ nTri[0] ; else - ++ nTri1 ; + ++ nTri[1] ; + } + // 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() ; + // assegno materiali + pGraphics->AddColor( cCol[j]) ; // per wireframe + pGraphics->AddMaterial( mMat[j].GetAmbient(), mMat[j].GetDiffuse(), + mMat[j].GetSpecular(), mMat[j].GetShininess()) ; + pGraphics->AddBackMaterial( GetSurfBackColor( mMat[j].GetDiffuse())) ; + // passo i triangoli alla grafica + pGraphics->StartTriangles( nTri[j]) ; + for ( const auto& Tria : vTria) { + if ( ( j == 0 && Tria.GetGrade() != 0) || ( j == 1 && Tria.GetGrade() == 0)) + continue ; + if ( m_bShowTriaAdvanced) + pGraphics->AddTriangle( Tria, Tria.GetTriFlags(), Tria.GetTriNormals()) ; + else + pGraphics->AddTriangle( Tria, TriFlags3d(), TriNormals3d( Tria.GetN())) ; + } + pGraphics->EndTriangles() ; + // assegno contatore di aggiornamenti + pGraphics->SetCounter( pZmap->GetBlockUpdatingCounter( i)) ; } - // imposto indice blocco corrente (con Flag == 0 --> materiale principale) - pGraphics->SetCurrent( 2 * i) ; - // lo pulisco - pGraphics->Clear() ; - pGraphics->AddColor( siObj.colObj) ; // per wireframe - pGraphics->AddMaterial( mMat.GetAmbient(), mMat.GetDiffuse(), - mMat.GetSpecular(), mMat.GetShininess()) ; - pGraphics->AddBackMaterial( GetSurfBackColor( mMat.GetDiffuse())) ; - // recupero la geometria - // passo i triangoli alla grafica - pGraphics->StartTriangles( nTri0) ; - for ( const auto& Tria : vlTria[vnModif[i]]) { - if ( Tria.GetGrade() != 0) - continue ; - if ( m_bShowTriaAdvanced) - pGraphics->AddTriangle( Tria, Tria.GetTriFlags(), Tria.GetTriNormals()) ; - else - pGraphics->AddTriangle( Tria, TriFlags3d(), TriNormals3d( Tria.GetN())) ; - } - pGraphics->EndTriangles() ; - // imposto indice blocco corrente (con Flag != 0 --> materiale 2) - pGraphics->SetCurrent( 2 * i + 1) ; - // lo pulisco - pGraphics->Clear() ; - pGraphics->AddColor( cCol2) ; // per wireframe - pGraphics->AddMaterial( mMat2.GetAmbient(), mMat2.GetDiffuse(), - mMat2.GetSpecular(), mMat2.GetShininess()) ; - pGraphics->AddBackMaterial( GetSurfBackColor( mMat2.GetDiffuse())) ; - // recupero la geometria - // passo i triangoli alla grafica - pGraphics->StartTriangles( nTri1) ; - for ( const auto& Tria : vlTria[vnModif[i]]) { - if ( Tria.GetGrade() == 0) - continue ; - if ( m_bShowTriaAdvanced) - pGraphics->AddTriangle( Tria, Tria.GetTriFlags(), Tria.GetTriNormals()) ; - else - pGraphics->AddTriangle( Tria, TriFlags3d(), TriNormals3d( Tria.GetN())) ; - } - pGraphics->EndTriangles() ; } } // 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( 2 * nCount) ; + pGraphics->SetCurrent( ZMAP_COL * nCount) ; // lo pulisco pGraphics->Clear() ; // ciclo sui tre gruppi di spilloni