EgtGraphics 1.5d2 :

- prima implementazione dello shading.
This commit is contained in:
Dario Sassi
2014-04-04 09:40:34 +00:00
parent 82f1791391
commit cb34a7b71a
7 changed files with 81 additions and 10 deletions
BIN
View File
Binary file not shown.
+3
View File
@@ -21,9 +21,12 @@
// Definizione di Vert3f
class Vert3f {
public :
Vert3f( const Vector3d& vtV) : x( (float)vtV.x), y( (float)vtV.y), z( (float)vtV.z) {}
Vert3f( const Point3d& ptP) : x( (float)ptP.x), y( (float)ptP.y), z( (float)ptP.z) {}
Vert3f( double dX, double dY, double dZ) : x( (float)dX), y( (float)dY), z( (float)dZ) {}
Vert3f( void) : x( 0), y( 0), z( 0) {}
void Set( const Vector3d& vtV)
{ x = (float)vtV.x ; y = (float)vtV.y ; z = (float)vtV.z ; }
void Set( const Point3d& ptP)
{ x = (float)ptP.x ; y = (float)ptP.y ; z = (float)ptP.z ; }
void Set( double dX, double dY, double dZ)
+8 -3
View File
@@ -155,7 +155,8 @@ ObjNewGraphics::StartTriangles( int nNum)
return false ;
}
glBindBuffer( GL_ARRAY_BUFFER, nVboId) ;
glBufferData( GL_ARRAY_BUFFER, 3 * nNum * SIZEV3F, NULL, GL_STATIC_DRAW) ;
// 3 float per le coordinate e 3 per la normale
glBufferData( GL_ARRAY_BUFFER, 6 * nNum * SIZEV3F, NULL, GL_STATIC_DRAW) ;
// aggiungo i dati in lista
AddVerts( GL_TRIANGLES, 0, nVaoId, nVboId) ;
// dichiaro modo triangoli
@@ -177,7 +178,9 @@ ObjNewGraphics::AddTriangle( const Triangle3d& Tria)
// emetto i vertici del triangolo
for ( int i = 0 ; i < 3 ; ++ i) {
Vert3f v3V( Tria.GetP( i)) ;
glBufferSubData( GL_ARRAY_BUFFER, nCount * SIZEV3F, SIZEV3F, &v3V) ;
glBufferSubData( GL_ARRAY_BUFFER, 2 * nCount * SIZEV3F, SIZEV3F, &v3V) ;
Vert3f v3N( Tria.GetN()) ;
glBufferSubData( GL_ARRAY_BUFFER, ( 2 * nCount + 1) * SIZEV3F, SIZEV3F, &v3N) ;
++ nCount ;
}
// aggiorno il conteggio
@@ -195,8 +198,10 @@ ObjNewGraphics::EndTriangles( void)
if ( m_nCurrMode != GL_TRIANGLES)
return false ;
// termino il modo triangoli
glVertexPointer( 3, GL_FLOAT, 0, ((void*)(0))) ;
glVertexPointer( 3, GL_FLOAT, 2 * SIZEV3F, ((void*)(0))) ;
glEnableClientState( GL_VERTEX_ARRAY) ;
glNormalPointer( GL_FLOAT, 2 * SIZEV3F, ((void*)( 1 * SIZEV3F))) ;
glEnableClientState( GL_NORMAL_ARRAY) ;
glBindVertexArray( 0) ;
// dichiaro modalità standard
m_nCurrMode = GL_NONE ;
+5
View File
@@ -110,6 +110,8 @@ ObjOldGraphics::AddTriangle( const Triangle3d& Tria)
// 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)) ;
@@ -156,6 +158,9 @@ ObjOldGraphics::Draw( int nStat, int nMark)
case OldGrAtom::START :
glBegin( iIter->m_nMode) ;
break ;
case OldGrAtom::NORMAL :
glNormal3f( iIter->m_fX, iIter->m_fY, iIter->m_fZ) ;
break ;
case OldGrAtom::VERT :
glVertex3f( iIter->m_fX, iIter->m_fY, iIter->m_fZ) ;
break ;
+6 -1
View File
@@ -27,7 +27,7 @@ class OldGrAtom {
OldGrAtom( void) : m_nType( NONE), m_fX( 0), m_fY( 0), m_fZ( 0), m_fW( 1) {}
public :
enum GrType { NONE = 0, START = 1, VERT = 2, COLOR = 3, END = 4} ;
enum GrType { NONE = 0, START = 1, VERT = 2, NORMAL = 3, COLOR = 4, END = 5} ;
public :
GrType m_nType ;
@@ -95,6 +95,11 @@ class ObjOldGraphics : public ObjEGrGraphics
oga.m_nType = OldGrAtom::VERT ;
oga.m_fX = float( ptP.x) ; oga.m_fY = float( ptP.y) ; oga.m_fZ = float( ptP.z) ;
return AddOldGrAtom( oga) ; }
bool AddNormal3f( const Vector3d& vtN)
{ OldGrAtom oga ;
oga.m_nType = OldGrAtom::NORMAL ;
oga.m_fX = float( vtN.x) ; oga.m_fY = float( vtN.y) ; oga.m_fZ = float( vtN.z) ;
return AddOldGrAtom( oga) ; }
bool AddColor( float fRed, float fGreen, float fBlue, float fAlpha = 1)
{ OldGrAtom oga ;
oga.m_nType = OldGrAtom::COLOR ;
+15 -3
View File
@@ -55,6 +55,16 @@ class Scene : public IEGrScene
virtual bool ZoomChange( double dCoeff) ;
virtual bool ZoomOnPoint( const Point3d& ptWin, double dCoeff) ;
virtual bool ZoomWin( const Point3d& ptWin1, const Point3d& ptWin2) ;
// ShowMode
virtual bool SetShowMode( int nShowMode)
{ if ( nShowMode != SM_WIREFRAME &&
nShowMode != SM_HIDDENLINE &&
nShowMode != SM_SHADING)
return false ;
m_nShowMode = nShowMode ;
return true ; }
virtual int GetShowMode( void)
{ return m_nShowMode ;}
// Geometry
virtual bool SetExtension( const BBox3d& b3Ext) ;
virtual bool UpdateExtension( void) ;
@@ -97,11 +107,11 @@ class Scene : public IEGrScene
bool DrawWinRect( void) ;
private :
HDC m_hDC ; // Device Context
HGLRC m_hRC ; // OpenGL Rendering Context
HDC m_hDC ; // Device Context
HGLRC m_hRC ; // OpenGL Rendering Context
WGLEWContext m_wglewc ; // WGLEW Context
GLEWContext m_glewc ; // GLEW Context
bool m_bNewWay ; // flag che indica nuova modalità (OpenGL 3.0 in poi)
bool m_bNewWay ; // flag che indica nuova modalità (OpenGL 3.0 in poi)
Point3d m_ptCenter ; // centro verso cui è rivolta la camera
Vector3d m_vtDirCamera ; // versore direzione dal centro alla camera
@@ -114,6 +124,8 @@ class Scene : public IEGrScene
Color m_colBackTop ; // colore di sfondo in alto
Color m_colBackBottom ; // colore di sfondo in basso
int m_nShowMode ; // modo di visualizzazione (wireframe, hiddenline, shading)
IGeomDB* m_pGeomDB ; // puntatore al DB geometrico
Color m_colDef ; // colore di default
Color m_colMark ; // colore per marcatura
+44 -3
View File
@@ -53,6 +53,8 @@ Scene::Scene( void)
// Sfondo
m_colBackTop.Set( 128, 128, 128) ;
m_colBackBottom.Set( 128, 128, 128) ;
// Modalità di visualizzazione
m_nShowMode = SM_WIREFRAME ;
// GeomData
m_pGeomDB = nullptr ;
m_colDef.Set( 0, 0, 0) ;
@@ -512,6 +514,9 @@ Scene::Background( void)
// disabilito lo Zdepth
glDisable( GL_DEPTH_TEST) ;
// disabilito illuminazione
glDisable( GL_LIGHTING) ;
// imposto riempimento poligoni
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL) ;
@@ -632,14 +637,50 @@ Scene::Draw( void)
// imposto la dimensione standard dei punti
glPointSize( 3) ;
// imposto disegno wireframe anche per poligoni
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE) ;
// impostazioni dipendenti dalla modalità di visualizzazione
switch ( m_nShowMode) {
case SM_WIREFRAME :
// imposto disegno wireframe anche per poligoni
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE) ;
// disabilito illuminazione
glDisable( GL_LIGHTING) ;
break ;
case SM_HIDDENLINE :
break ;
case SM_SHADING :
// imposto disegno shading per poligoni
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL) ;
// imposto tipo shading
glShadeModel( GL_SMOOTH) ;
// imposto illuminazione
float LightAmbient[] = { 0.25f, 0.25f, 0.25f, 1.0f} ;
float LightStd[] = { 0.8f, 0.8f, 0.8f, 0.8f} ;
float Light0Pos[] = { 0.8f, 0.9f, 1.2f, 0.0f} ;
float Light1Pos[] = { -0.9f, -0.7f, 0.6f, 0.0f} ;
glLightfv( GL_LIGHT0, GL_AMBIENT, LightAmbient) ;
glLightfv( GL_LIGHT0, GL_DIFFUSE, LightStd) ;
glLightfv( GL_LIGHT0, GL_SPECULAR, LightStd) ;
glLightfv( GL_LIGHT0, GL_POSITION, Light0Pos) ;
glEnable( GL_LIGHT0) ;
glLightfv( GL_LIGHT1, GL_AMBIENT, LightAmbient) ;
glLightfv( GL_LIGHT1, GL_DIFFUSE, LightStd) ;
glLightfv( GL_LIGHT1, GL_SPECULAR, LightStd) ;
glLightfv( GL_LIGHT1, GL_POSITION, Light1Pos) ;
glEnable( GL_LIGHT1) ;
glEnable( GL_LIGHTING) ;
// provvisorio
glEnable( GL_COLOR_MATERIAL) ;
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE) ;
break ;
}
// disegno le geometrie del DB
DrawGroup( GDB_ID_ROOT, GDB_MD_STD, GDB_ST_ON, GDB_MK_OFF) ;
// aggiungo disegni diretti (senza test Zbuffer)
// aggiungo disegni diretti (senza test Zbuffer e con poligoni riempiti)
glDisable( GL_DEPTH_TEST) ;
glDisable( GL_LIGHTING) ;
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL) ;
DrawWinRect() ;
// aggiorno