diff --git a/EgtGraphics.rc b/EgtGraphics.rc index 05d5b49..01a84ca 100644 Binary files a/EgtGraphics.rc and b/EgtGraphics.rc differ diff --git a/ObjEGrGraphics.h b/ObjEGrGraphics.h index 1e2ae61..bec5f27 100644 --- a/ObjEGrGraphics.h +++ b/ObjEGrGraphics.h @@ -21,6 +21,7 @@ class Scene ; class Color ; class PolyLine ; class Triangle3d ; +class TriFlags3d ; class TriNormals3d ; //---------------------------------------------------------------------------- @@ -39,7 +40,7 @@ class ObjEGrGraphics : public IObjGraphics virtual bool AddLines( const PNTVECTOR& vPnt, bool bAux = false) = 0 ; virtual bool AddPolyLine( const PolyLine& PL, bool bAux = false) = 0 ; virtual bool StartTriangles( int nNum, bool bAux = false) = 0 ; - virtual bool AddTriangle( const Triangle3d& Tria, const TriNormals3d& TNrms) = 0 ; + virtual bool AddTriangle( const Triangle3d& Tria, const TriFlags3d& TFlags, const TriNormals3d& TNrms) = 0 ; virtual bool EndTriangles( void) = 0 ; virtual bool Draw( int nStat, int nMark, bool bSurfSha, bool ShowAux) = 0 ; } ; diff --git a/ObjNewGraphics.cpp b/ObjNewGraphics.cpp index 18c9357..c971e9d 100644 --- a/ObjNewGraphics.cpp +++ b/ObjNewGraphics.cpp @@ -21,10 +21,13 @@ #include "/EgtDev/Include/EGKTriangle3d.h" -//--------------------------- Macro ------------------------------------------ +//--------------------------- Macro e Costanti ------------------------------- // Per funzioni glew dipendenti dal context #define glewGetContext() (( m_pScene != nullptr) ? m_pScene->glewGetContext() : nullptr) - +// Dimensioni flag per edge di triangoli +const size_t SIZEFLAG = sizeof( unsigned char) ; +// Dimensioni record del buffer ( vertice + normale + flag) +const size_t SIZEVNF = ( 2 * SIZEV3F + SIZEFLAG) ; //---------------------------------------------------------------------------- ObjNewGraphics::~ObjNewGraphics( void) @@ -215,8 +218,8 @@ ObjNewGraphics::StartTriangles( int nNum, bool bAux) return false ; } glBindBuffer( GL_ARRAY_BUFFER, nVboId) ; - // 3 float per le coordinate e 3 per la normale - glBufferData( GL_ARRAY_BUFFER, 6 * nNum * SIZEV3F, NULL, GL_STATIC_DRAW) ; + // NumTria * 3 * dimensione( vertice+normale+flag) + glBufferData( GL_ARRAY_BUFFER, nNum * 3 * SIZEVNF, NULL, GL_STATIC_DRAW) ; // aggiungo i dati in lista AddVerts( GL_TRIANGLES, 0, nVaoId, nVboId, bAux) ; // dichiaro modo triangoli @@ -226,7 +229,7 @@ ObjNewGraphics::StartTriangles( int nNum, bool bAux) //---------------------------------------------------------------------------- bool -ObjNewGraphics::AddTriangle( const Triangle3d& Tria, const TriNormals3d& TNrms) +ObjNewGraphics::AddTriangle( const Triangle3d& Tria, const TriFlags3d& TFlags, const TriNormals3d& TNrms) { if ( m_pScene == nullptr || ! m_pScene->MakeCurrent()) return false ; @@ -238,9 +241,11 @@ ObjNewGraphics::AddTriangle( const Triangle3d& Tria, const TriNormals3d& TNrms) // 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) ; + glBufferSubData( GL_ARRAY_BUFFER, nCount * SIZEVNF, SIZEV3F, &v3V) ; Vert3f v3N( TNrms.vtN[i]) ; - glBufferSubData( GL_ARRAY_BUFFER, ( 2 * nCount + 1) * SIZEV3F, SIZEV3F, &v3N) ; + 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 ; } // aggiorno il conteggio @@ -258,10 +263,12 @@ ObjNewGraphics::EndTriangles( void) if ( m_nCurrMode != GL_TRIANGLES) return false ; // termino il modo triangoli - glVertexPointer( 3, GL_FLOAT, 2 * SIZEV3F, ((void*)(0))) ; + glVertexPointer( 3, GL_FLOAT, SIZEVNF, ((void*)(0))) ; glEnableClientState( GL_VERTEX_ARRAY) ; - glNormalPointer( GL_FLOAT, 2 * SIZEV3F, ((void*)( 1 * SIZEV3F))) ; + glNormalPointer( GL_FLOAT, SIZEVNF, ((void*)( 1 * SIZEV3F))) ; glEnableClientState( GL_NORMAL_ARRAY) ; + glEdgeFlagPointer( SIZEVNF, ((void*)( 2 * SIZEV3F))) ; + glEnableClientState( GL_EDGE_FLAG_ARRAY) ; glBindVertexArray( 0) ; // dichiaro modalità standard m_nCurrMode = GL_NONE ; diff --git a/ObjNewGraphics.h b/ObjNewGraphics.h index d258d48..3bfa4f2 100644 --- a/ObjNewGraphics.h +++ b/ObjNewGraphics.h @@ -74,7 +74,7 @@ class ObjNewGraphics : public ObjEGrGraphics virtual bool AddLines( const PNTVECTOR& vPnt, bool bAux = false) ; virtual bool AddPolyLine( const PolyLine& PL, bool bAux = false) ; virtual bool StartTriangles( int nNum, bool bAux = false) ; - virtual bool AddTriangle( const Triangle3d& Tria, const TriNormals3d& TNrms) ; + virtual bool AddTriangle( const Triangle3d& Tria, const TriFlags3d& TFlags, const TriNormals3d& TNrms) ; virtual bool EndTriangles( void) ; virtual bool Draw( int nStat, int nMark, bool bSurfSha, bool bShowAux) ; diff --git a/ObjOldGraphics.cpp b/ObjOldGraphics.cpp index 4ec7860..25de553 100644 --- a/ObjOldGraphics.cpp +++ b/ObjOldGraphics.cpp @@ -147,13 +147,14 @@ ObjOldGraphics::StartTriangles( int nNum, bool bAux) //---------------------------------------------------------------------------- bool -ObjOldGraphics::AddTriangle( const Triangle3d& Tria, const TriNormals3d& TNrms) +ObjOldGraphics::AddTriangle( const Triangle3d& Tria, const TriFlags3d& TFlags, const TriNormals3d& TNrms) { // modo corrente deve essere triangoli if ( m_nCurrMode != GL_TRIANGLES) return false ; // emetto le normali e i vertici del triangolo for ( int i = 0 ; i < 3 ; ++ i) { + AddBndFlag( TFlags.bFlag[i]) ; AddNormal3f( TNrms.vtN[i]) ; AddVert3f( Tria.GetP( i)) ; } @@ -236,6 +237,10 @@ ObjOldGraphics::Draw( int nStat, int nMark, bool bSurfSha, bool bShowAux) if ( ! bStartA || bShowAux) glVertex3fv( iIter->m_fVal) ; break ; + case OgAtom::BND_FLAG : + if ( ! bStartA || bShowAux) + glEdgeFlag( iIter->m_nFlag) ; + break ; case OgAtom::NORMAL : if ( ! bStartA || bShowAux) glNormal3fv( iIter->m_fVal) ; diff --git a/ObjOldGraphics.h b/ObjOldGraphics.h index 318535c..f90b24d 100644 --- a/ObjOldGraphics.h +++ b/ObjOldGraphics.h @@ -27,8 +27,8 @@ class OgAtom { OgAtom( void) : m_nType( NONE), m_fX( 0), m_fY( 0), m_fZ( 0), m_fW( 1) {} public : - enum GrType { NONE = 0, START = 1, START_A = 2, END = 3, VERT = 4, NORMAL = 5, - COLOR = 6, MAT_A = 7, MAT_D = 8, MAT_S = 9, MAT_SH = 10, MAT_B = 11} ; + enum GrType { NONE = 0, START = 1, START_A = 2, END = 3, VERT = 4, BND_FLAG = 5, NORMAL = 6, + COLOR = 7, MAT_A = 8, MAT_D = 9, MAT_S = 10, MAT_SH = 11, MAT_B = 12} ; public : GrType m_nType ; @@ -40,6 +40,7 @@ class OgAtom { float m_fZ ; float m_fW ; } ; + int m_nFlag ; struct { float m_fRed ; float m_fGreen ; @@ -77,7 +78,7 @@ class ObjOldGraphics : public ObjEGrGraphics virtual bool AddLines( const PNTVECTOR& vPnt, bool bAux = false) ; virtual bool AddPolyLine( const PolyLine& PL, bool bAux = false) ; virtual bool StartTriangles( int nNum, bool bAux = false) ; - virtual bool AddTriangle( const Triangle3d& Tria, const TriNormals3d& TNrms) ; + virtual bool AddTriangle( const Triangle3d& Tria, const TriFlags3d& TFlags, const TriNormals3d& TNrms) ; virtual bool EndTriangles( void) ; virtual bool Draw( int nStat, int nMark, bool bSurfSha, bool bShowAux) ; @@ -103,6 +104,11 @@ class ObjOldGraphics : public ObjEGrGraphics oga.m_nType = OgAtom::VERT ; oga.m_fX = float( ptP.x) ; oga.m_fY = float( ptP.y) ; oga.m_fZ = float( ptP.z) ; return AddOgAtom( oga) ; } + bool AddBndFlag( bool bFlag) + { OgAtom oga ; + oga.m_nType = OgAtom::BND_FLAG ; + oga.m_nFlag = ( bFlag ? TRUE : FALSE) ; + return AddOgAtom( oga) ; } bool AddNormal3f( const Vector3d& vtN) { OgAtom oga ; oga.m_nType = OgAtom::NORMAL ; diff --git a/Scene.h b/Scene.h index 96af576..5e65121 100644 --- a/Scene.h +++ b/Scene.h @@ -98,11 +98,15 @@ class Scene : public IEGrScene m_nShowMode = nShowMode ; return true ; } virtual int GetShowMode( void) - { return m_nShowMode ;} + { return m_nShowMode ; } virtual void SetShowCurveDirection( bool bShow) { m_bShowCurveDirection = bShow ; } virtual bool GetShowCurveDirection( void) { return m_bShowCurveDirection ; } + virtual void SetShowTriaAdvanced( bool bAdvanced) + { m_bShowTriaAdvanced = bAdvanced ; } + virtual bool GetShowTriaAdvanced( void) + { return m_bShowTriaAdvanced ; } // Geometry virtual bool SetExtension( const BBox3d& b3Ext) ; virtual bool UpdateExtension( void) ; @@ -210,6 +214,7 @@ class Scene : public IEGrScene // ShowMode int m_nShowMode ; // modo di visualizzazione (wireframe, hiddenline, shading) bool m_bShowCurveDirection ; // flag di visualizzazione direzione curve + bool m_bShowTriaAdvanced ; // flag per abilitare la visualizzazione avanzata dei triangoli // Selection bool m_bSelect ; // flag di selezione attiva INTVECTOR m_Unsel ; // vettore indici oggetti non selezionabili diff --git a/SceneBasic.cpp b/SceneBasic.cpp index 05b0047..8abcc3f 100644 --- a/SceneBasic.cpp +++ b/SceneBasic.cpp @@ -56,6 +56,8 @@ Scene::Scene( void) m_colBackBottom.Set( 176, 176, 176) ; // Modalità di visualizzazione m_nShowMode = SM_WIREFRAME ; + m_bShowCurveDirection = false ; + m_bShowTriaAdvanced = true ; // Selezione m_bSelect = false ; m_Unsel.reserve( 50) ; @@ -267,7 +269,7 @@ Scene::GetOpenGLInfo( void) const char* p ; if ( ( p = reinterpret_cast ( glGetString( GL_VERSION))) != nullptr) sInfo += p ; - sInfo += ( m_bNewWay ? " (new way)" : " (old way)") ; + sInfo += ( m_bNewWay ? " (Nw)" : " (Ow)") ; sInfo += " " ; if ( ( p = reinterpret_cast ( glGetString( GL_VENDOR))) != nullptr) sInfo += p ; diff --git a/SceneGeom.cpp b/SceneGeom.cpp index 5d381ae..cdc84ea 100644 --- a/SceneGeom.cpp +++ b/SceneGeom.cpp @@ -282,11 +282,23 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, MdStMk siObj) pGraphics->StartTriangles( pSTM->GetTriangleNum()) ; // ciclo sui triangoli della superficie Triangle3d Tria ; + TriFlags3d TFlags ; TriNormals3d TNrms ; int nId = pSTM->GetFirstTriangle( Tria) ; while ( nId != SVT_NULL) { - pSTM->GetTriangleSmoothNormals( nId, TNrms) ; - pGraphics->AddTriangle( Tria, TNrms) ; + // se visualizzazione avanzata : edge solo se boundary e normali ai vertici smussate + if ( m_bShowTriaAdvanced) { + pSTM->GetTriangleBoundaryEdges( nId, TFlags) ; + pSTM->GetTriangleSmoothNormals( nId, TNrms) ; + } + // altrimenti : tutti gli edge e normali ai vertici prendono quella del triangolo + else { + for ( int i = 0 ; i < 3 ; ++i) { + TFlags.bFlag[i] = true ; + TNrms.vtN[i] = Tria.GetN() ; + } + } + pGraphics->AddTriangle( Tria, TFlags, TNrms) ; nId = pSTM->GetNextTriangle( nId, Tria) ; } pGraphics->EndTriangles() ;