diff --git a/ObjEGrGraphics.h b/ObjEGrGraphics.h index 1333c65..d0db8da 100644 --- a/ObjEGrGraphics.h +++ b/ObjEGrGraphics.h @@ -31,6 +31,9 @@ class ObjEGrGraphics : public IObjGraphics virtual bool AddColor( const Color& colC) = 0 ; virtual bool AddPoint( const Point3d& ptP) = 0 ; virtual bool AddPolyLine( const PolyLine& PL) = 0 ; + virtual bool StartTriangles( void) = 0 ; + virtual bool AddTriangle( const Point3d& ptP0, const Point3d& ptP1, const Point3d& ptP2) = 0 ; + virtual bool EndTriangles( void) = 0 ; virtual bool Draw( int nStat, int nMark) = 0 ; } ; diff --git a/ObjNewGraphics.h b/ObjNewGraphics.h index caa96dd..67fb092 100644 --- a/ObjNewGraphics.h +++ b/ObjNewGraphics.h @@ -69,6 +69,12 @@ class ObjNewGraphics : public ObjEGrGraphics virtual bool AddColor( const Color& colC) ; virtual bool AddPoint( const Point3d& ptP) ; virtual bool AddPolyLine( const PolyLine& PL) ; + virtual bool StartTriangles( void) + { return false ; } + virtual bool AddTriangle( const Point3d& ptP0, const Point3d& ptP1, const Point3d& ptP2) + { return false ; } + virtual bool EndTriangles( void) + { return false ; } virtual bool Draw( int nStat, int nMark) ; public : diff --git a/ObjOldGraphics.cpp b/ObjOldGraphics.cpp index 788dd55..cdd5be8 100644 --- a/ObjOldGraphics.cpp +++ b/ObjOldGraphics.cpp @@ -51,6 +51,9 @@ ObjOldGraphics::AddColor( const Color& colC) bool ObjOldGraphics::AddPoint( const Point3d& ptP) { + // modo corrente deve essere nullo + if ( m_nCurrMode != GL_NONE) + return false ; // start AddStart( GL_POINTS) ; // inserisco il nuovo vertice @@ -67,6 +70,9 @@ ObjOldGraphics::AddPoint( const Point3d& ptP) bool ObjOldGraphics::AddPolyLine( const PolyLine& PL) { + // modo corrente deve essere nullo + if ( m_nCurrMode != GL_NONE) + return false ; // start AddStart( GL_LINE_STRIP) ; // inserisco i nuovi vertici @@ -81,6 +87,49 @@ ObjOldGraphics::AddPolyLine( const PolyLine& PL) return true ; } +//---------------------------------------------------------------------------- +bool +ObjOldGraphics::StartTriangles( void) +{ + // modo corrente deve essere nullo + if ( m_nCurrMode != GL_NONE) + return false ; + // inizio emissione triangoli + AddStart( GL_TRIANGLES) ; + m_nCurrMode = GL_TRIANGLES ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +ObjOldGraphics::AddTriangle( const Point3d& ptP0, const Point3d& ptP1, const Point3d& ptP2) +{ + // modo corrente deve essere triangoli + if ( m_nCurrMode != GL_TRIANGLES) + return false ; + // emetto i vertici del triangolo + AddVert3f( ptP0.x, ptP0.y, ptP0.z) ; + AddVert3f( ptP1.x, ptP1.y, ptP1.z) ; + AddVert3f( ptP2.x, ptP2.y, ptP2.z) ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +ObjOldGraphics::EndTriangles( void) +{ + // modo corrente deve essere triangoli + if ( m_nCurrMode != GL_TRIANGLES) + return false ; + // termino il modo triangoli + AddEnd() ; + m_nCurrMode = GL_NONE ; + // dichiaro valida la grafica + m_bValid = true ; + + return true ; +} + //---------------------------------------------------------------------------- bool ObjOldGraphics::Draw( int nStat, int nMark) diff --git a/ObjOldGraphics.h b/ObjOldGraphics.h index 7bfc374..4cf01ed 100644 --- a/ObjOldGraphics.h +++ b/ObjOldGraphics.h @@ -14,6 +14,7 @@ #pragma once #include "ObjEGrGraphics.h" +#include "OpenGL.h" #include class Color ; @@ -70,10 +71,13 @@ class ObjOldGraphics : public ObjEGrGraphics virtual bool AddColor( const Color& colC) ; virtual bool AddPoint( const Point3d& ptP) ; virtual bool AddPolyLine( const PolyLine& PL) ; + virtual bool StartTriangles( void) ; + virtual bool AddTriangle( const Point3d& ptP0, const Point3d& ptP1, const Point3d& ptP2) ; + virtual bool EndTriangles( void) ; virtual bool Draw( int nStat, int nMark) ; public : - ObjOldGraphics( void) : m_pScene( nullptr), m_bValid( false) {} + ObjOldGraphics( void) : m_pScene( nullptr), m_nCurrMode( GL_NONE), m_bValid( false) {} private : bool AddOldGrAtom( const OldGrAtom& oga) @@ -103,6 +107,7 @@ class ObjOldGraphics : public ObjEGrGraphics private : Scene* m_pScene ; // puntatore alla scena bool m_bValid ; // flag + int m_nCurrMode ; // modo corrente OGALIST m_ogaList ; // lista di atomi per vecchia grafica } ; diff --git a/SceneBasic.cpp b/SceneBasic.cpp index 1a61788..5257ad5 100644 --- a/SceneBasic.cpp +++ b/SceneBasic.cpp @@ -512,6 +512,9 @@ Scene::Background( void) // disabilito lo Zdepth glDisable( GL_DEPTH_TEST) ; + // imposto riempimento poligoni + glPolygonMode( GL_FRONT_AND_BACK, GL_FILL) ; + // disegno lo sfondo con due colori if ( ! m_bNewWay) { glBegin( GL_TRIANGLE_STRIP) ; @@ -629,6 +632,9 @@ Scene::Draw( void) // imposto la dimensione standard dei punti glPointSize( 3) ; + // imposto disegno wireframe anche per poligoni + glPolygonMode( GL_FRONT_AND_BACK, GL_LINE) ; + // disegno le geometrie del DB DrawGroup( GDB_ID_ROOT, GDB_MD_STD, GDB_ST_ON, GDB_MK_OFF) ; diff --git a/SceneGeom.cpp b/SceneGeom.cpp index 4c90160..29cccc2 100644 --- a/SceneGeom.cpp +++ b/SceneGeom.cpp @@ -24,6 +24,7 @@ #include "/EgtDev/Include/EGkGeoVector3d.h" #include "/EgtDev/Include/EGkGeoPoint3d.h" #include "/EgtDev/Include/EGkCurve.h" +#include "/EgtDev/Include/EGkSurfTriMesh.h" #include "/EgtDev/Include/EGkGdbFunct.h" using namespace std ; @@ -250,6 +251,25 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nObjStat, int nObjMark) pGraphics->AddColor( cCol) ; pGraphics->AddPolyLine( PL) ; } + // se superficie trimesh + else if ( nGeoType == SRF_TRIMESH) { + // recupero la superficie + const ISurfTriMesh* pSTM = GetSurfTriMesh( pGeoObj) ; + if ( pSTM == nullptr) + return false ; + // impostazioni iniziali + pGraphics->Clear() ; + pGraphics->AddColor( cCol) ; + pGraphics->StartTriangles() ; + // ciclo sui triangoli della superficie + Point3d ptP0, ptP1, ptP2 ; + int nId = pSTM->GetFirstTriangle( ptP0, ptP1, ptP2) ; + while ( nId != -1) { + pGraphics->AddTriangle( ptP0, ptP1, ptP2) ; + nId = pSTM->GetNextTriangle( nId, ptP0, ptP1, ptP2) ; + } + pGraphics->EndTriangles() ; + } } // visualizzo la grafica associata