diff --git a/EgtGraphics.rc b/EgtGraphics.rc index 73ce376..c8e49b3 100644 Binary files a/EgtGraphics.rc and b/EgtGraphics.rc differ diff --git a/ObjNewGraphics.cpp b/ObjNewGraphics.cpp index 86bd4b5..8339840 100644 --- a/ObjNewGraphics.cpp +++ b/ObjNewGraphics.cpp @@ -241,19 +241,28 @@ ObjNewGraphics::AddTriangle( const Triangle3d& Tria, const TriFlags3d& TFlags, c return false ; // recupero il conteggio dei vertici int nCount = m_ngaList.back().m_nCount ; - // emetto i flag, le normali e i vertici del triangolo + aggiorno bbox + // emetto i vertici, le normali e i flag del triangolo + #pragma pack( push, 1) + struct VnfBuf { + Vert3f v3V ; + Vert3f v3N ; + unsigned char cFlag ; + } ; + #pragma pack( pop) + VnfBuf Buffer[3] ; for ( int i = 0 ; i < 3 ; ++ i) { - Vert3f v3V( Tria.GetP( i)) ; - glBufferSubData( GL_ARRAY_BUFFER, nCount * SIZEVNF, SIZEV3F, &v3V) ; - m_b3Loc.Add( Tria.GetP( i)) ; - Vert3f v3N( TNrms.vtN[i]) ; - glBufferSubData( GL_ARRAY_BUFFER, nCount * SIZEVNF + SIZEV3F, SIZEV3F, &v3N) ; - unsigned char cFlag = ( TFlags.bFlag[i] ? 1 : 0) ; - glBufferSubData( GL_ARRAY_BUFFER, nCount * SIZEVNF + 2 * SIZEV3F, SIZEFLAG, &cFlag) ; - ++ nCount ; + Buffer[i].v3V = Tria.GetP( i) ; + Buffer[i].v3N = TNrms.vtN[i] ; + Buffer[i].cFlag = ( TFlags.bFlag[i] ? 1 : 0) ; } + glBufferSubData( GL_ARRAY_BUFFER, nCount * SIZEVNF, 3 * SIZEVNF, Buffer) ; // aggiorno il conteggio + nCount += 3 ; m_ngaList.back().m_nCount = nCount ; + // aggiorno bbox + for ( int i = 0 ; i < 3 ; ++ i) + m_b3Loc.Add( Tria.GetP( i)) ; + return true ; } diff --git a/ObjOldGraphics.cpp b/ObjOldGraphics.cpp index 5ba08b6..30e7253 100644 --- a/ObjOldGraphics.cpp +++ b/ObjOldGraphics.cpp @@ -20,6 +20,10 @@ #include "/EgtDev/Include/EGkGdbConst.h" #include "/EgtDev/Include/EGKTriangle3d.h" +//---------------------------------------------------------------------------- +const int VECT_HEAP = 20 ; + + //---------------------------------------------------------------------------- ObjOldGraphics::~ObjOldGraphics( void) { @@ -38,7 +42,7 @@ ObjOldGraphics::Reset( void) void ObjOldGraphics::Clear( void) { - m_ogaList.clear() ; + m_ogaVect.clear() ; m_bValid = false ; m_nCurrMode = GL_NONE ; } @@ -100,6 +104,8 @@ ObjOldGraphics::AddLines( const PNTVECTOR& vPnt, bool bAux) // modo corrente deve essere nullo if ( m_nCurrMode != GL_NONE) return false ; + // riservo memoria per vettore + m_ogaVect.reserve( VECT_HEAP + vPnt.size()) ; // start AddStart( GL_LINES, bAux) ; // inserisco i vertici + aggiorno bbox @@ -122,6 +128,8 @@ ObjOldGraphics::AddPolyLine( const PolyLine& PL, bool bAux) // modo corrente deve essere nullo if ( m_nCurrMode != GL_NONE) return false ; + // riservo memoria per vettore + m_ogaVect.reserve( VECT_HEAP + PL.GetPointNbr()) ; // start AddStart( GL_LINE_STRIP, bAux) ; // inserisco i nuovi vertici + aggiorno bbox @@ -145,6 +153,8 @@ ObjOldGraphics::StartTriangles( int nNum, bool bAux) // modo corrente deve essere nullo if ( m_nCurrMode != GL_NONE) return false ; + // riservo memoria per vettore + m_ogaVect.reserve( VECT_HEAP + 3 * nNum) ; // inizio emissione triangoli AddStart( GL_TRIANGLES, bAux) ; m_nCurrMode = GL_TRIANGLES ; @@ -189,7 +199,7 @@ bool ObjOldGraphics::Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bShowAux) { // se vuoto non faccio alcunché - if ( m_ogaList.size() == 0) + if ( m_ogaVect.size() == 0) return true ; // gestione stato di visualizzazione @@ -227,8 +237,8 @@ ObjOldGraphics::Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bSho // ciclo di disegno bool bStartA = false ; - OGALIST::iterator iIter ; - for ( iIter = m_ogaList.begin() ; iIter != m_ogaList.end() ; ++ iIter) { + OGAVECT::iterator iIter ; + for ( iIter = m_ogaVect.begin() ; iIter != m_ogaVect.end() ; ++ iIter) { switch ( iIter->m_nType) { case OgAtom::START : glBegin( iIter->m_nMode) ; @@ -292,8 +302,8 @@ ObjOldGraphics::Draw( int nStat, int nMark, bool bSurfSha, int nAlpha, bool bSho // ciclo di disegno bool bStartA = false ; - OGALIST::iterator iIter ; - for ( iIter = m_ogaList.begin() ; iIter != m_ogaList.end() ; ++ iIter) { + OGAVECT::iterator iIter ; + for ( 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 9f8101e..7d2241d 100644 --- a/ObjOldGraphics.h +++ b/ObjOldGraphics.h @@ -52,8 +52,9 @@ class OgAtom { } ; //---------------------------------------------------------------------------- -// Lista di OgAtom +// Lista e vettore di OgAtom typedef std::list OGALIST ; +typedef std::vector OGAVECT ; //---------------------------------------------------------------------------- class ObjOldGraphics : public ObjEGrGraphics @@ -89,7 +90,7 @@ class ObjOldGraphics : public ObjEGrGraphics private : bool AddOgAtom( const OgAtom& oga) - { try { m_ogaList.push_back( oga) ; } + { try { m_ogaVect.push_back( oga) ; } catch(...) { return false ; } return true ; } bool AddStart( int nMode, bool bAux = false) @@ -131,7 +132,7 @@ class ObjOldGraphics : public ObjEGrGraphics Scene* m_pScene ; // puntatore alla scena bool m_bValid ; // flag int m_nCurrMode ; // modo corrente - OGALIST m_ogaList ; // lista di atomi per vecchia grafica + OGAVECT m_ogaVect ; // vettore di atomi per vecchia grafica BBox3d m_b3Loc ; // BoundingBox locale } ; diff --git a/SceneGeom.cpp b/SceneGeom.cpp index 11cd19b..0982f70 100644 --- a/SceneGeom.cpp +++ b/SceneGeom.cpp @@ -363,7 +363,7 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj) POLYLINELIST lstPL ; for ( int k = 0 ; k < 3 ; ++ k) { switch ( k) { - default : pGraphics->AddColor( BLUE) ; break ; + case 0 : pGraphics->AddColor( BLUE) ; break ; case 1 : pGraphics->AddColor( RED) ; break ; case 2 : pGraphics->AddColor( GREEN) ; break ; }