EgtGraphics 1.5c4 :

- migliorato ciclo di disegno
- migliorata gestione colore in disegno.
This commit is contained in:
Dario Sassi
2014-03-12 21:20:46 +00:00
parent f55619cc8b
commit 46df22d5ed
3 changed files with 40 additions and 19 deletions
+37 -17
View File
@@ -81,10 +81,28 @@ Scene::UpdateExtension( void)
//----------------------------------------------------------------------------
bool
Scene::DrawGroup( int nId)
{
// creo un iteratore
PtrOwner<IGdbIterator> 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<IGdbIterator*>(&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) ;
}
}