EgtGraphics 1.6b3 :
- aggiunta gestione flag di edge per non disegnare in wireframe/hiddenline (per poligoni).
This commit is contained in:
Binary file not shown.
+2
-1
@@ -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 ;
|
||||
} ;
|
||||
|
||||
+16
-9
@@ -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 ;
|
||||
|
||||
+1
-1
@@ -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) ;
|
||||
|
||||
|
||||
+6
-1
@@ -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) ;
|
||||
|
||||
+9
-3
@@ -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 ;
|
||||
|
||||
@@ -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
|
||||
|
||||
+3
-1
@@ -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<const char*> ( glGetString( GL_VERSION))) != nullptr)
|
||||
sInfo += p ;
|
||||
sInfo += ( m_bNewWay ? " (new way)" : " (old way)") ;
|
||||
sInfo += ( m_bNewWay ? " (Nw)" : " (Ow)") ;
|
||||
sInfo += " " ;
|
||||
if ( ( p = reinterpret_cast<const char*> ( glGetString( GL_VENDOR))) != nullptr)
|
||||
sInfo += p ;
|
||||
|
||||
+14
-2
@@ -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() ;
|
||||
|
||||
Reference in New Issue
Block a user