From 46df22d5eda458ada1dbdb9d1329c562ec3d0f33 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Wed, 12 Mar 2014 21:20:46 +0000 Subject: [PATCH] EgtGraphics 1.5c4 : - migliorato ciclo di disegno - migliorata gestione colore in disegno. --- EgtGraphics.rc | Bin 11390 -> 11390 bytes Scene.h | 5 +++-- SceneGeom.cpp | 54 +++++++++++++++++++++++++++++++++---------------- 3 files changed, 40 insertions(+), 19 deletions(-) diff --git a/EgtGraphics.rc b/EgtGraphics.rc index 74f0d9960e7fdd2db166d44640883fd2fdb17d13..b0152270ee57709e173437dbdcf6e7ed5f981b0a 100644 GIT binary patch delta 81 zcmewt@h@V-H#SC-&G%&mnSs F+yKA78{Yr` delta 81 zcmewt@h@V-H#SD&&G%&mnSs F+yK6f8`l5; diff --git a/Scene.h b/Scene.h index c5f761c..9ca798e 100644 --- a/Scene.h +++ b/Scene.h @@ -17,7 +17,7 @@ #include "/EgtDev/Include/EGrScene.h" #include "OpenGL.h" -class IGeoObj ; +class IGdbIterator ; //---------------------------------------------------------------------------- class Scene : public IEGrScene @@ -86,7 +86,8 @@ class Scene : public IEGrScene bool CalcCameraFrame( Frame3d& frView) ; // Geometry bool DrawGroup( int nId) ; - bool DrawGeoObj( IGeoObj* pGeoObj) ; + bool DrawGroup( const IGdbIterator& iIter) ; + bool DrawGeoObj( const IGdbIterator& iIter) ; bool DeleteObjGraphicsGroup( int nId) ; // Aux bool DrawWinRect( void) ; diff --git a/SceneGeom.cpp b/SceneGeom.cpp index 7d0ca9c..e6d26e5 100644 --- a/SceneGeom.cpp +++ b/SceneGeom.cpp @@ -81,10 +81,28 @@ Scene::UpdateExtension( void) //---------------------------------------------------------------------------- bool Scene::DrawGroup( int nId) +{ + // creo un iteratore + PtrOwner pIter( CreateGdbIterator()) ; + if ( ! ::IsValid( pIter)) + return false ; + + // recupero il gruppo + pIter->SetGDB( m_pGeomDB) ; + if ( ! pIter->GoTo( nId)) + return false ; + + // eseguo il disegno + return DrawGroup( *pIter) ; +} + +//---------------------------------------------------------------------------- +bool +Scene::DrawGroup( const IGdbIterator& iIter) { // recupero il riferimento del gruppo Frame3d frFrame ; - if ( ! m_pGeomDB->GetGroupFrame( nId, frFrame)) + if ( ! iIter.GetGroupFrame( frFrame)) return false ; // se non è identità, lo aggiungo sullo stack delle matrici MODELVIEW di OpenGL bool bMatrix = ( frFrame.GetType() != Frame3d::TOP || ! frFrame.Orig().IsSmall()) ; @@ -100,30 +118,20 @@ Scene::DrawGroup( int nId) return false ; // scandisco il gruppo pIter->SetGDB( m_pGeomDB) ; - bool bNext = pIter->GoToFirstInGroup( nId) ; + bool bNext = pIter->GoToFirstInGroup( iIter) ; while ( bNext) { // leggo il tipo di nodo int nGdbType = pIter->GetGdbType() ; // se oggetto geometrico if ( nGdbType == GDB_GEO) { - // lo recupero - IGeoObj* pGeoObj = pIter->GetGeoObj() ; - if ( pGeoObj == nullptr) - return false ; - // provvisorio per colore - Color cCol ; - if ( pIter->GetColor( cCol)) - glColor3f( cCol.GetRed(), cCol.GetGreen(), cCol.GetBlue()) ; - else - glColor3f( m_colDef.GetRed(), m_colDef.GetGreen(), m_colDef.GetBlue()) ; // lo disegno - if ( ! DrawGeoObj( pGeoObj)) + if ( ! DrawGeoObj( *pIter)) return false ; } // se gruppo else if ( nGdbType == GDB_GROUP) { // lo disegno - if ( ! DrawGroup( pIter->GetId())) + if ( ! DrawGroup( *pIter)) return false ; } // passo al successivo @@ -138,8 +146,13 @@ Scene::DrawGroup( int nId) //---------------------------------------------------------------------------- bool -Scene::DrawGeoObj( IGeoObj* pGeoObj) +Scene::DrawGeoObj( const IGdbIterator& iIter) { + // recupero l'oggetto geometrico + IGeoObj* pGeoObj = (const_cast(&iIter))->GetGeoObj() ; + if ( pGeoObj == nullptr) + return false ; + // se non esiste grafica associata, la creo if ( pGeoObj->GetObjGraphics() == nullptr) { ObjEGrGraphics* pGraphics = CreateObjEGrGraphics( m_bNewWay) ; @@ -154,6 +167,10 @@ Scene::DrawGeoObj( IGeoObj* pGeoObj) if ( ! pGraphics->IsValid()) { // leggo il tipo di oggetto geometrico int nGeoType = pGeoObj->GetType() ; + // recupero il colore + Color cCol ; + if ( ! iIter.GetColor( cCol)) + cCol = m_colDef ; // se vettore if ( nGeoType == GEO_VECT3D) { // recupero il vettore @@ -164,6 +181,7 @@ Scene::DrawGeoObj( IGeoObj* pGeoObj) PolyLine PL ; pVector->GetDrawWithArrowHead( 0.1, PL) ; pGraphics->Clear() ; + pGraphics->AddColor( cCol) ; pGraphics->AddPolyLine( PL) ; } // se punto @@ -174,6 +192,7 @@ Scene::DrawGeoObj( IGeoObj* pGeoObj) return false ; // calcolo la grafica pGraphics->Clear() ; + pGraphics->AddColor( cCol) ; pGraphics->AddPoint( pPoint->GetPoint()) ; } // se riferimento @@ -182,7 +201,7 @@ Scene::DrawGeoObj( IGeoObj* pGeoObj) const IGeoFrame3d* pFrame = GetGeoFrame3d( pGeoObj) ; if ( pFrame == nullptr) return false ; - // aggiorno la grafica + // aggiorno la grafica (colori speciali) PolyLine plX, plY, plZ ; pFrame->GetDrawWithArrowHeads( 10, 0.1, plX, plY, plZ) ; pGraphics->Clear() ; @@ -201,8 +220,9 @@ Scene::DrawGeoObj( IGeoObj* pGeoObj) return false ; // calcolo la grafica PolyLine PL ; - pCurve->ApproxWithLines( 0.1, 5, PL) ; + pCurve->ApproxWithLines( 0.01, 5, PL) ; pGraphics->Clear() ; + pGraphics->AddColor( cCol) ; pGraphics->AddPolyLine( PL) ; } }