diff --git a/EgtGraphics.vcxproj b/EgtGraphics.vcxproj index a22d313..ae0ab20 100644 --- a/EgtGraphics.vcxproj +++ b/EgtGraphics.vcxproj @@ -203,6 +203,7 @@ copy $(TargetPath) \EgtProg\Dll64 + diff --git a/EgtGraphics.vcxproj.filters b/EgtGraphics.vcxproj.filters index 32e4ca2..61f7d29 100644 --- a/EgtGraphics.vcxproj.filters +++ b/EgtGraphics.vcxproj.filters @@ -66,6 +66,9 @@ File di intestazione + + File di intestazione + diff --git a/ObjEGrGraphics.h b/ObjEGrGraphics.h index 1782fe8..8d6fdff 100644 --- a/ObjEGrGraphics.h +++ b/ObjEGrGraphics.h @@ -20,6 +20,7 @@ class Scene ; class Color ; class PolyLine ; class Triangle3d ; +class TriNormals3d ; //---------------------------------------------------------------------------- class ObjEGrGraphics : public IObjGraphics @@ -33,7 +34,7 @@ class ObjEGrGraphics : public IObjGraphics virtual bool AddPoint( const Point3d& ptP) = 0 ; virtual bool AddPolyLine( const PolyLine& PL) = 0 ; virtual bool StartTriangles( int nNum) = 0 ; - virtual bool AddTriangle( const Triangle3d& Tria) = 0 ; + virtual bool AddTriangle( const Triangle3d& Tria, const TriNormals3d& TNrms) = 0 ; virtual bool EndTriangles( void) = 0 ; virtual bool Draw( int nStat, int nMark) = 0 ; } ; diff --git a/ObjNewGraphics.cpp b/ObjNewGraphics.cpp index 973d94a..9a0729b 100644 --- a/ObjNewGraphics.cpp +++ b/ObjNewGraphics.cpp @@ -166,7 +166,7 @@ ObjNewGraphics::StartTriangles( int nNum) //---------------------------------------------------------------------------- bool -ObjNewGraphics::AddTriangle( const Triangle3d& Tria) +ObjNewGraphics::AddTriangle( const Triangle3d& Tria, const TriNormals3d& TNrms) { if ( m_pScene == nullptr || ! m_pScene->MakeCurrent()) return false ; @@ -175,11 +175,11 @@ ObjNewGraphics::AddTriangle( const Triangle3d& Tria) return false ; // recupero il conteggio dei vertici int nCount = m_ngaList.back().m_nCount ; - // emetto i vertici del triangolo + // emetto i vertici e le normali del triangolo for ( int i = 0 ; i < 3 ; ++ i) { Vert3f v3V( Tria.GetP( i)) ; glBufferSubData( GL_ARRAY_BUFFER, 2 * nCount * SIZEV3F, SIZEV3F, &v3V) ; - Vert3f v3N( Tria.GetN()) ; + Vert3f v3N( TNrms.vtN[i]) ; glBufferSubData( GL_ARRAY_BUFFER, ( 2 * nCount + 1) * SIZEV3F, SIZEV3F, &v3N) ; ++ nCount ; } diff --git a/ObjNewGraphics.h b/ObjNewGraphics.h index 7c6ab0a..19025bf 100644 --- a/ObjNewGraphics.h +++ b/ObjNewGraphics.h @@ -70,7 +70,7 @@ class ObjNewGraphics : public ObjEGrGraphics virtual bool AddPoint( const Point3d& ptP) ; virtual bool AddPolyLine( const PolyLine& PL) ; virtual bool StartTriangles( int nNum) ; - virtual bool AddTriangle( const Triangle3d& Tria) ; + virtual bool AddTriangle( const Triangle3d& Tria, const TriNormals3d& TNrms) ; virtual bool EndTriangles( void) ; virtual bool Draw( int nStat, int nMark) ; diff --git a/ObjOldGraphics.cpp b/ObjOldGraphics.cpp index d7d74e7..03c7581 100644 --- a/ObjOldGraphics.cpp +++ b/ObjOldGraphics.cpp @@ -105,17 +105,16 @@ ObjOldGraphics::StartTriangles( int nNum) //---------------------------------------------------------------------------- bool -ObjOldGraphics::AddTriangle( const Triangle3d& Tria) +ObjOldGraphics::AddTriangle( const Triangle3d& Tria, const TriNormals3d& TNrms) { // modo corrente deve essere triangoli if ( m_nCurrMode != GL_TRIANGLES) return false ; - // emetto la normale del triangolo - AddNormal3f( Tria.GetN()) ; - // emetto i vertici del triangolo - AddVert3f( Tria.GetP( 0)) ; - AddVert3f( Tria.GetP( 1)) ; - AddVert3f( Tria.GetP( 2)) ; + // emetto le normali e i vertici del triangolo + for ( int i = 0 ; i < 3 ; ++ i) { + AddNormal3f( TNrms.vtN[i]) ; + AddVert3f( Tria.GetP( i)) ; + } return true ; } diff --git a/ObjOldGraphics.h b/ObjOldGraphics.h index de3ae73..fa83f71 100644 --- a/ObjOldGraphics.h +++ b/ObjOldGraphics.h @@ -73,7 +73,7 @@ class ObjOldGraphics : public ObjEGrGraphics virtual bool AddPoint( const Point3d& ptP) ; virtual bool AddPolyLine( const PolyLine& PL) ; virtual bool StartTriangles( int nNum) ; - virtual bool AddTriangle( const Triangle3d& Tria) ; + virtual bool AddTriangle( const Triangle3d& Tria, const TriNormals3d& TNrms) ; virtual bool EndTriangles( void) ; virtual bool Draw( int nStat, int nMark) ; diff --git a/SceneGeom.cpp b/SceneGeom.cpp index c5775d9..6ed9644 100644 --- a/SceneGeom.cpp +++ b/SceneGeom.cpp @@ -263,9 +263,11 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nObjStat, int nObjMark) pGraphics->StartTriangles( pSTM->GetTriangleNum()) ; // ciclo sui triangoli della superficie Triangle3d Tria ; + TriNormals3d TNrms ; int nId = pSTM->GetFirstTriangle( Tria) ; while ( nId != -1) { - pGraphics->AddTriangle( Tria) ; + pSTM->GetTriangleSmoothNormals( nId, TNrms) ; + pGraphics->AddTriangle( Tria, TNrms) ; nId = pSTM->GetNextTriangle( nId, Tria) ; } pGraphics->EndTriangles() ;