From 3a8cdff937afc5a7d9bd1592dacc7750ff29e4b9 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 23 Nov 2020 07:20:57 +0000 Subject: [PATCH] =?UTF-8?q?EgtGraphics=20:=20-=20modifiche=20per=20colore?= =?UTF-8?q?=20pi=C3=B9=20scuro=20in=20wireframe=20superfici=20(se=20sfondo?= =?UTF-8?q?=20chiaro).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ObjNewGraphics.cpp | 53 ++++++++++++++++++++++++++++++++-------------- ObjNewGraphics.h | 10 ++++----- ObjOldGraphics.cpp | 34 ++++++++++++++++++++++++----- ObjOldGraphics.h | 4 +--- 4 files changed, 71 insertions(+), 30 deletions(-) diff --git a/ObjNewGraphics.cpp b/ObjNewGraphics.cpp index e78c316..14b3fe9 100644 --- a/ObjNewGraphics.cpp +++ b/ObjNewGraphics.cpp @@ -22,8 +22,6 @@ //--------------------------- Macro e Costanti ------------------------------- -// Per funzioni glew dipendenti dal context -//#define glewGetContext() (( m_pScene != nullptr) ? m_pScene->glewGetContext() : nullptr) // Dimensioni flag per edge di triangoli const size_t SIZEFLAG = sizeof( unsigned char) ; // Dimensioni record del buffer ( vertice + normale + flag) @@ -48,7 +46,7 @@ void ObjNewGraphics::Clear( void) { DeleteVaoVbo() ; - m_ngaList.clear() ; + m_ngaVect.clear() ; m_bValid = false ; m_nCurrMode = GL_NONE ; } @@ -240,7 +238,7 @@ ObjNewGraphics::AddTriangle( const Triangle3d& Tria, const TriFlags3d& TFlags, c if ( m_nCurrMode != GL_TRIANGLES) return false ; // recupero il conteggio dei vertici - int nCount = m_ngaList.back().m_nCount ; + int nCount = m_ngaVect.back().m_nCount ; // emetto i vertici, le normali e i flag del triangolo #pragma pack( push, 1) struct VnfBuf { @@ -258,7 +256,7 @@ ObjNewGraphics::AddTriangle( const Triangle3d& Tria, const TriFlags3d& TFlags, c glBufferSubData( GL_ARRAY_BUFFER, nCount * SIZEVNF, 3 * SIZEVNF, Buffer) ; // aggiorno il conteggio nCount += 3 ; - m_ngaList.back().m_nCount = nCount ; + m_ngaVect.back().m_nCount = nCount ; // aggiorno bbox for ( int i = 0 ; i < 3 ; ++ i) m_b3Loc.Add( Tria.GetP( i)) ; @@ -291,6 +289,23 @@ ObjNewGraphics::EndTriangles( void) return true ; } +//---------------------------------------------------------------------------- +static float* +AdjustColor( float fCol[4], bool bDark) +{ + if ( ! bDark) { + return fCol ; + } + else { + static float fDarkCol[4] = { fCol[0], fCol[1], fCol[2], fCol[3]} ; + fDarkCol[0] = fCol[0] * 0.6f ; + fDarkCol[1] = fCol[1] * 0.6f ; + fDarkCol[2] = fCol[2] * 0.6f ; + fDarkCol[3] = fCol[3] * 0.6f ; + return fDarkCol ; + } +} + //---------------------------------------------------------------------------- bool ObjNewGraphics::Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bShowAux) @@ -299,7 +314,7 @@ ObjNewGraphics::Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bSho return false ; // se vuoto non faccio alcunché - if ( m_ngaList.size() == 0) + if ( m_ngaVect.size() == 0) return true ; // gestione stato di visualizzazione @@ -317,7 +332,7 @@ ObjNewGraphics::Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bSho if ( bSurfSha) { if ( nMark == GDB_MK_ON) { bStdCol = false ; - Color colMark = ( ( GetScene() != nullptr) ? GetScene()->GetMark() : Color( 192, 192, 0)) ; + Color colMark = m_pScene->GetMark() ; colMark.SetAlpha( nAlpha) ; colMark.GetFloat( fSelMarkCol) ; Color colMarkBack = GetSurfBackColor( colMark) ; @@ -326,7 +341,7 @@ ObjNewGraphics::Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bSho } else if ( nStat == GDB_ST_SEL) { bStdCol = false ; - Color colSelSurf = ( ( GetScene() != nullptr) ? GetScene()->GetSelSurf() : Color( 255, 255, 192)) ; + Color colSelSurf = m_pScene->GetSelSurf() ; colSelSurf.SetAlpha( nAlpha) ; colSelSurf.GetFloat( fSelMarkCol) ; Color colSelSurfBack = GetSurfBackColor( colSelSurf) ; @@ -335,9 +350,17 @@ ObjNewGraphics::Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bSho } } + // determino se devo scurire il colore wireframe + bool bDark = false ; + if ( bStdCol && ! bSurfSha) { + Color colBT, colBB ; + m_pScene->GetBackground( colBT, colBB) ; + int nColMid = ( colBT.GetIntIntensity() + colBB.GetIntIntensity()) / 2 ; + bDark = ( nColMid > 127) ; + } + // ciclo di disegno - NGALIST::iterator iIter ; - for ( iIter = m_ngaList.begin() ; iIter != m_ngaList.end() ; ++ iIter) { + for ( auto iIter = m_ngaVect.begin() ; iIter != m_ngaVect.end() ; ++ iIter) { switch ( iIter->m_nType) { case NgAtom::VERTS : if ( iIter->m_nCount > 0 && iIter->m_nVaoId != 0) { @@ -354,7 +377,7 @@ ObjNewGraphics::Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bSho } break ; case NgAtom::COLOR : - glColor4fv( ( bStdCol ? iIter->m_fCol : fSelMarkCol)) ; + glColor4fv( ( bStdCol ? AdjustColor( iIter->m_fCol, bDark) : fSelMarkCol)) ; break ; case NgAtom::MAT_A : glMaterialfv( GL_FRONT, GL_AMBIENT, ( bStdCol ? iIter->m_fCol : fSelMarkCol)) ; @@ -384,12 +407,11 @@ ObjNewGraphics::Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bSho glLineWidth( (float) m_pScene->GetMarkLineWidth()) ; // colore di marcatura - Color colMark = ( ( GetScene() != nullptr) ? GetScene()->GetMark() : Color( 192, 192, 0)) ; + Color colMark = m_pScene->GetMark() ; glColor4f( colMark.GetRed(), colMark.GetGreen(), colMark.GetBlue(), colMark.GetAlpha()) ; // ciclo di disegno - NGALIST::iterator iIter ; - for ( iIter = m_ngaList.begin() ; iIter != m_ngaList.end() ; ++ iIter) { + for ( auto iIter = m_ngaVect.begin() ; iIter != m_ngaVect.end() ; ++ iIter) { switch ( iIter->m_nType) { case NgAtom::VERTS : if ( iIter->m_nCount > 0 && iIter->m_nVaoId != 0) { @@ -429,8 +451,7 @@ ObjNewGraphics::DeleteVaoVbo( void) return false ; // ciclo di cancellazione VAO/VBO - NGALIST::iterator iIter ; - for ( iIter = m_ngaList.begin() ; iIter != m_ngaList.end() ; ++ iIter) { + for ( auto iIter = m_ngaVect.begin() ; iIter != m_ngaVect.end() ; ++ iIter) { if ( iIter->m_nType == NgAtom::VERTS && iIter->m_nCount > 0) { glBindBuffer( GL_ARRAY_BUFFER, 0) ; glDeleteBuffers( 1, &iIter->m_nVboId) ; diff --git a/ObjNewGraphics.h b/ObjNewGraphics.h index ba68817..2c1fed6 100644 --- a/ObjNewGraphics.h +++ b/ObjNewGraphics.h @@ -14,7 +14,6 @@ #pragma once #include "ObjEGrGraphics.h" -#include //---------------------------------------------------------------------------- @@ -47,9 +46,8 @@ class NgAtom { } ; //---------------------------------------------------------------------------- -// Lista di NgAtom -typedef std::list NGALIST ; - +// Vettore di NgAtom +typedef std::vector NGAVECT ; //---------------------------------------------------------------------------- class ObjNewGraphics : public ObjEGrGraphics @@ -88,7 +86,7 @@ class ObjNewGraphics : public ObjEGrGraphics private : bool DeleteVaoVbo( void) ; bool AddNgAtom( const NgAtom& nga) - { try { m_ngaList.push_back( nga) ; } + { try { m_ngaVect.push_back( nga) ; } catch(...) { return false ; } return true ; } bool AddVerts( int nMode, int nCount, unsigned int nVaoId, unsigned int nVboId, bool bAux = false) @@ -112,7 +110,7 @@ class ObjNewGraphics : public ObjEGrGraphics Scene* m_pScene ; // puntatore alla scena bool m_bValid ; // flag int m_nCurrMode ; // modo corrente - NGALIST m_ngaList ; // liste di atomi per nuova grafica + NGAVECT m_ngaVect ; // vettore di atomi per nuova grafica BBox3d m_b3Loc ; // BoundingBox locale } ; diff --git a/ObjOldGraphics.cpp b/ObjOldGraphics.cpp index e4879d0..8cf85c7 100644 --- a/ObjOldGraphics.cpp +++ b/ObjOldGraphics.cpp @@ -194,6 +194,23 @@ ObjOldGraphics::EndTriangles( void) return true ; } +//---------------------------------------------------------------------------- +static float* +AdjustColor( float fCol[4], bool bDark) +{ + if ( ! bDark) { + return fCol ; + } + else { + static float fDarkCol[4] = { fCol[0], fCol[1], fCol[2], fCol[3]} ; + fDarkCol[0] = fCol[0] * 0.6f ; + fDarkCol[1] = fCol[1] * 0.6f ; + fDarkCol[2] = fCol[2] * 0.6f ; + fDarkCol[3] = fCol[3] * 0.6f ; + return fDarkCol ; + } +} + //---------------------------------------------------------------------------- bool ObjOldGraphics::Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bShowAux) @@ -235,10 +252,18 @@ ObjOldGraphics::Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bSho } } + // determino se devo scurire il colore wireframe + bool bDark = false ; + if ( bStdCol && ! bSurfSha) { + Color colBT, colBB ; + m_pScene->GetBackground( colBT, colBB) ; + int nColMid = ( colBT.GetIntIntensity() + colBB.GetIntIntensity()) / 2 ; + bDark = ( nColMid > 127) ; + } + // ciclo di disegno bool bStartA = false ; - OGAVECT::iterator iIter ; - for ( iIter = m_ogaVect.begin() ; iIter != m_ogaVect.end() ; ++ iIter) { + for ( auto iIter = m_ogaVect.begin() ; iIter != m_ogaVect.end() ; ++ iIter) { switch ( iIter->m_nType) { case OgAtom::START : glBegin( iIter->m_nMode) ; @@ -267,7 +292,7 @@ ObjOldGraphics::Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bSho glNormal3fv( iIter->m_fVal) ; break ; case OgAtom::COLOR : - glColor4fv( ( bStdCol ? iIter->m_fVal : fSelMarkCol)) ; + glColor4fv( ( bStdCol ? AdjustColor( iIter->m_fVal, bDark) : fSelMarkCol)) ; break ; case OgAtom::MAT_A : glMaterialfv( GL_FRONT, GL_AMBIENT, ( bStdCol ? iIter->m_fVal : fSelMarkCol)) ; @@ -302,8 +327,7 @@ ObjOldGraphics::Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bSho // ciclo di disegno bool bStartA = false ; - OGAVECT::iterator iIter ; - for ( iIter = m_ogaVect.begin() ; iIter != m_ogaVect.end() ; ++ iIter) { + for ( auto iIter = m_ogaVect.begin() ; iIter != m_ogaVect.end() ; ++ iIter) { switch ( iIter->m_nType) { case OgAtom::START : glBegin( iIter->m_nMode) ; diff --git a/ObjOldGraphics.h b/ObjOldGraphics.h index d176936..6b72ceb 100644 --- a/ObjOldGraphics.h +++ b/ObjOldGraphics.h @@ -16,7 +16,6 @@ #include "ObjEGrGraphics.h" #include "OpenGL.h" #include "/EgtDev/Include/EGkPoint3d.h" -#include class Color ; @@ -52,8 +51,7 @@ class OgAtom { } ; //---------------------------------------------------------------------------- -// Lista e vettore di OgAtom -typedef std::list OGALIST ; +// Vettore di OgAtom typedef std::vector OGAVECT ; //----------------------------------------------------------------------------