From fcd21f03189db264a7beca4ed77c664a080b44f0 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Fri, 7 Feb 2014 08:13:24 +0000 Subject: [PATCH] TestEgr 1.5b4 : aggiunta gestione immediate mode per OpenGL vecchio stile. --- EGrGraphObjs.h | 42 ++++++ EGrScene.cpp | 320 ++++++++++++++++++++++++++-------------- EGrScene.h | 16 +- TestEGr.rc | Bin 18828 -> 18828 bytes TestEGr.vcxproj | 1 + TestEGr.vcxproj.filters | 3 + TestEGrDlg.cpp | 14 +- 7 files changed, 273 insertions(+), 123 deletions(-) create mode 100644 EGrGraphObjs.h diff --git a/EGrGraphObjs.h b/EGrGraphObjs.h new file mode 100644 index 0000000..01f1d90 --- /dev/null +++ b/EGrGraphObjs.h @@ -0,0 +1,42 @@ +//---------------------------------------------------------------------------- +// EgalTech 2013-2014 +//---------------------------------------------------------------------------- +// File : EGrGraphObjs.h Data : 06.02.14 Versione : 1.5b4 +// Contenuto : Oggetti grafici e loro raccolte. +// +// +// +// Modifiche : 06.02.14 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +#pragma once + +#include +#include + +//---------------------------------------------------------------------------- +// Definizione di Vert3f +class Vert3f { + public : + 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( double dX, double dY, double dZ) { x = (float)dX ; y = (float)dY ; z = (float)dZ ;} + const Vert3f& operator =( const Vert3f& ptSrc) + { if ( &ptSrc != this) { + x = ptSrc.x , y = ptSrc.y , z = ptSrc.z ; } + return *this ; } + + public : + float x ; + float y ; + float z ; +} ; +const size_t SIZEV3F = sizeof( Vert3f) ; + + +//---------------------------------------------------------------------------- +// Raccolte di Vert3f +typedef std::vector V3FVECTOR ; // vettore di vertici +typedef std::list V3FLIST ; // lista di vertici diff --git a/EGrScene.cpp b/EGrScene.cpp index d312653..ac627fa 100644 --- a/EGrScene.cpp +++ b/EGrScene.cpp @@ -14,6 +14,7 @@ //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "EGrScene.h" +#include "/EgtDev/Include/EgtILogger.h" #include "/EgtDev/Include/EGnStringUtils.h" #include "/EgtDev/Include/EGkFrame3d.h" @@ -24,18 +25,11 @@ static const double MIN_DIST_CAMERA = 10 ; static const double STD_DIST_CAMERA = 1000 ; static const double MIN_EXTENSION = 50 ; -//--------------------------- Structs ---------------------------------------- -struct Vert3f { - GLfloat x ; - GLfloat y ; - GLfloat z ; -} ; -#define SET_VERT3F( P, X, Y, Z) {P.x=X;P.y=Y;P.z=Z;} - //---------------------------------------------------------------------------- EGrScene::EGrScene( void) { + m_pLogger = nullptr ; // Context data m_hDC = nullptr ; m_hRC = nullptr ; @@ -60,19 +54,33 @@ EGrScene::~EGrScene( void) //---------------------------------------------------------------------------- bool -EGrScene::CreateContext( HDC hDC, int nDriver, bool bDouBuff, int nColorBits, int nDepthBits) +EGrScene::Init( ILogger* pLogger) +{ + m_pLogger = pLogger ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +EGrScene::CreateContext( HDC hDC, int nDriver, bool b2Buff, int nColorBits, int nDepthBits) { // verifico validità Device Context if ( hDC == nullptr) return false ; m_hDC = hDC ; + // riporto nei limiti il tipo di driver + if ( nDriver < OD_SOFT) + nDriver = OD_SOFT ; + else if ( nDriver > OD_NEW) + nDriver = OD_NEW ; + // assegno formato pixel PIXELFORMATDESCRIPTOR pfd ; memset( &pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)) ; pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR) ; pfd.nVersion = 1 ; - pfd.dwFlags = ( bDouBuff ? PFD_DOUBLEBUFFER : 0) | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW ; + pfd.dwFlags = ( b2Buff ? PFD_DOUBLEBUFFER : 0) | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW ; pfd.iPixelType = PFD_TYPE_RGBA ; pfd.cColorBits = nColorBits ; pfd.cDepthBits = nDepthBits ; @@ -82,7 +90,7 @@ EGrScene::CreateContext( HDC hDC, int nDriver, bool bDouBuff, int nColorBits, in if ( nPixelFormat == 0) return false ; if ( nDriver == OD_SOFT) { - int nPixFormGen = ChooseGenPixelFormat( nPixelFormat, bDouBuff, nColorBits, nDepthBits) ; + int nPixFormGen = ChooseGenPixelFormat( nPixelFormat, b2Buff, nColorBits, nDepthBits) ; if ( nPixFormGen != 0) nPixelFormat = nPixFormGen ; } @@ -95,16 +103,33 @@ EGrScene::CreateContext( HDC hDC, int nDriver, bool bDouBuff, int nColorBits, in GLenum WglewInitResult ; WglewInitResult = wglewInit() ; - if ( WglewInitResult != GLEW_OK) { - AfxMessageBox( _T("WGLEW is not initialized!")) ; - } + if ( WglewInitResult != GLEW_OK) + LOG_INFO( m_pLogger, "WGLEW is not initialized !") - int attribs[] = { - WGL_CONTEXT_MAJOR_VERSION_ARB, 3, - WGL_CONTEXT_MINOR_VERSION_ARB, 0, - WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, - 0 - } ; + int attribs[10] ; + if ( nDriver == OD_SOFT) { + attribs[0] = WGL_CONTEXT_MAJOR_VERSION_ARB ; + attribs[1] = 1 ; + attribs[2] = WGL_CONTEXT_MINOR_VERSION_ARB ; + attribs[3] = 1 ; + attribs[4] = 0 ; + } + else if ( nDriver == OD_OLD) { + attribs[0] = WGL_CONTEXT_MAJOR_VERSION_ARB ; + attribs[1] = 2 ; + attribs[2] = WGL_CONTEXT_MINOR_VERSION_ARB ; + attribs[3] = 0 ; + attribs[4] = 0 ; + } + else { + attribs[0] = WGL_CONTEXT_MAJOR_VERSION_ARB ; + attribs[1] = 3 ; + attribs[2] = WGL_CONTEXT_MINOR_VERSION_ARB ; + attribs[3] = 0 ; + attribs[4] = WGL_CONTEXT_PROFILE_MASK_ARB ; + attribs[5] = WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB ; + attribs[6] = 0 ; + } if ( wglewIsSupported( "WGL_ARB_create_context") == 1) { m_hRC = wglCreateContextAttribsARB( m_hDC, 0, attribs) ; @@ -114,7 +139,8 @@ EGrScene::CreateContext( HDC hDC, int nDriver, bool bDouBuff, int nColorBits, in } else { //It's not possible to make a GL 3.x context. Use the old style context (GL 2.1 and before) - m_hRC = tempContext; + m_hRC = tempContext ; + LOG_INFO( m_pLogger, "WGL_ARB_create_context missing !") } // verifico validità Rendering Context @@ -125,19 +151,23 @@ EGrScene::CreateContext( HDC hDC, int nDriver, bool bDouBuff, int nColorBits, in glewExperimental = GL_TRUE ; GlewInitResult = glewInit() ; - if ( GlewInitResult != GLEW_OK) { - AfxMessageBox( _T("GLEW is not initialized!")) ; - } + if ( GlewInitResult != GLEW_OK) + LOG_INFO( m_pLogger, "GLEW is not initialized !") // verifico se posso lavorare in modalità nuova - m_bNewWay = ( glewIsSupported( "GL_VERSION_3_0") == 1) ; + m_bNewWay = ( nDriver == OD_NEW && glewIsSupported( "GL_VERSION_3_0") == 1) ; + if ( ! m_bNewWay) + LOG_INFO( m_pLogger, "OpenGL old way rendering !") + + // reset stato di errore di OpenGL + glGetError() ; return true ; } //---------------------------------------------------------------------------- int -EGrScene::ChooseGenPixelFormat( int nPfd, bool bDouBuff, int nColorBits, int nDepthBits) +EGrScene::ChooseGenPixelFormat( int nPfd, bool b2Buff, int nColorBits, int nDepthBits) { PIXELFORMATDESCRIPTOR pfdR ; @@ -155,7 +185,7 @@ EGrScene::ChooseGenPixelFormat( int nPfd, bool bDouBuff, int nColorBits, int nDe DescribePixelFormat( m_hDC, nI, sizeof(PIXELFORMATDESCRIPTOR), &pfdR) ; if ( pfdR.dwFlags & PFD_GENERIC_FORMAT && ! (pfdR.dwFlags & PFD_GENERIC_ACCELERATED) && - ( ! bDouBuff || pfdR.dwFlags & PFD_DOUBLEBUFFER)) { + ( ! b2Buff || pfdR.dwFlags & PFD_DOUBLEBUFFER)) { int nErr = abs( nColorBits - pfdR.cColorBits) + abs( nDepthBits - pfdR.cDepthBits) ; if ( nErr < nErrOpt) { @@ -204,6 +234,9 @@ EGrScene::GetOpenGLInfo( void) else sInfo += "ERROR" ; + // reset stato di errore di OpenGL + glGetError() ; + return sInfo ; } @@ -223,6 +256,9 @@ EGrScene::GetGLSLInfo( void) else sInfo += "ERROR" ; + // reset stato di errore di OpenGL + glGetError() ; + return sInfo ; } @@ -261,6 +297,9 @@ EGrScene::GetPixelFormatInfo( void) else sInfo += "ERROR" ; + // reset stato di errore di OpenGL + glGetError() ; + return sInfo ; } @@ -522,6 +561,14 @@ EGrScene::AdjustDimView( double dHalfWidth, double dHalfHeight) return false ; m_nViewportW = rect.right ; m_nViewportH = rect.bottom ; + // aggiorno la vista + glViewport( 0, 0, m_nViewportW, m_nViewportH) ; + // verifico presenza errori + GLenum nErr = glGetError() ; + if ( nErr != GL_NO_ERROR) { + string sOut = "First glViewport OpenGL error " + ToString( (int)nErr) ; + LOG_INFO( m_pLogger, sOut.c_str()) + } } // adatto il rapporto tra le dimensioni calcolate a quello delle dimensioni della vista @@ -573,6 +620,13 @@ EGrScene::Reshape( int nW, int nH) // aggiorno la vista glViewport( 0, 0, m_nViewportW, m_nViewportH) ; + // verifico presenza errori + GLenum nErr = glGetError() ; + if ( nErr != GL_NO_ERROR) { + string sOut = "Reshape OpenGL error " + ToString( (int)nErr) ; + LOG_INFO( m_pLogger, sOut.c_str()) + } + // aggiorno AdjustDimView( m_dHalfWidth, m_dHalfHeight) ; @@ -599,8 +653,6 @@ EGrScene::Prepare( void) glLoadIdentity() ; glOrtho( - m_dHalfWidth, m_dHalfWidth, - m_dHalfHeight, m_dHalfHeight, m_dZNear, m_dZFar) ; - GLenum nErr = glGetError() ; - // imposto matrice modello/vista glMatrixMode( GL_MODELVIEW) ; glLoadIdentity() ; @@ -609,7 +661,12 @@ EGrScene::Prepare( void) m_ptCenter.x, m_ptCenter.y, m_ptCenter.z, m_vtUp.x, m_vtUp.y, m_vtUp.z) ; - nErr = glGetError() ; + // verifico presenza errori + GLenum nErr = glGetError() ; + if ( nErr != GL_NO_ERROR) { + string sOut = "Prepare OpenGL error " + ToString( (int)nErr) ; + LOG_INFO( m_pLogger, sOut.c_str()) + } return true ; } @@ -626,18 +683,38 @@ EGrScene::Draw( void) glClear( GL_COLOR_BUFFER_BIT) ; // disegno - for ( int i = 0 ; i < NUM_VAO ; ++ i) { - if ( m_vaoID[i] != 0) { - glBindVertexArray( m_vaoID[i]) ; - glDrawArrays( m_nMode[i], 0, m_nCount[i]) ; + if ( m_bNewWay) { + for ( int i = 0 ; i < NUM_VAO ; ++ i) { + if ( m_vaoID[i] != 0) { + glBindVertexArray( m_vaoID[i]) ; + glDrawArrays( m_nMode[i], 0, m_nCount[i]) ; + } + } + } + else { + for ( int i = 0 ; i < NUM_VAO ; ++ i) { + if ( m_nCount[i] != 0) { + glBegin( m_nMode[i]) ; + for ( int j = 0 ; j < m_nCount[i] ; ++ j) + glVertex3f( m_v3fVect[i][j].x, m_v3fVect[i][j].y, m_v3fVect[i][j].z) ; + glEnd() ; + } } } // aggiorno glFlush() ; - // scambio i buffer back e front (se previsti) - SwapBuffers( m_hDC) ; + // verifico presenza errori + GLenum nErr = glGetError() ; + if ( nErr != GL_NO_ERROR) { + string sOut = "Draw OpenGL error " + ToString( (int)nErr) ; + LOG_INFO( m_pLogger, sOut.c_str()) + } + + // scambio i buffer back e front ( eseguita solo se previsti) + if ( ! SwapBuffers( m_hDC)) + LOG_INFO( m_pLogger, "Draw SwapBuffers error") return true ; } @@ -683,12 +760,11 @@ EGrScene::SetSquare( void) return ; // vertici - size_t nSizeV3f = sizeof( Vert3f) ; Vert3f Point[4] ; - SET_VERT3F( Point[0], -0.5f, -0.5f, 0.0f) - SET_VERT3F( Point[1], -0.5f, 0.5f, 0.0f) - SET_VERT3F( Point[2], 0.5f, 0.5f, 0.0f) - SET_VERT3F( Point[3], 0.5f, -0.5f, 0.0f) + Point[0].Set( -0.5, -0.5, 0.0) ; + Point[1].Set( -0.5, 0.5, 0.0) ; + Point[2].Set( 0.5, 0.5, 0.0) ; + Point[3].Set( 0.5, -0.5, 0.0) ; // dimensioni di ingombro BBox3d b3Ext ; @@ -696,11 +772,10 @@ EGrScene::SetSquare( void) b3Ext.Add( Point[i].x, Point[i].y, Point[i].z) ; SetExtension( b3Ext) ; - // inizializzo VAOs a non allocati - for ( int i = 0 ; i < NUM_VAO ; ++ i) - m_vaoID[i] = 0 ; - if ( m_bNewWay) { + // inizializzo VAOs a non allocati + for ( int i = 0 ; i < NUM_VAO ; ++ i) + m_vaoID[i] = 0 ; // VAO allocation glGenVertexArrays( 1, &m_vaoID[0]) ; if ( m_vaoID[0] == 0) @@ -711,12 +786,12 @@ EGrScene::SetSquare( void) glBindBuffer( GL_ARRAY_BUFFER, m_vboID[0]) ; m_nMode[0] = GL_LINE_STRIP ; m_nCount[0] = 5 ; - glBufferData( GL_ARRAY_BUFFER, 5 * nSizeV3f, NULL, GL_STATIC_DRAW) ; - glBufferSubData( GL_ARRAY_BUFFER, 0 * nSizeV3f, nSizeV3f, &Point[0]) ; - glBufferSubData( GL_ARRAY_BUFFER, 1 * nSizeV3f, nSizeV3f, &Point[1]) ; - glBufferSubData( GL_ARRAY_BUFFER, 2 * nSizeV3f, nSizeV3f, &Point[2]) ; - glBufferSubData( GL_ARRAY_BUFFER, 3 * nSizeV3f, nSizeV3f, &Point[3]) ; - glBufferSubData( GL_ARRAY_BUFFER, 4 * nSizeV3f, nSizeV3f, &Point[0]) ; + glBufferData( GL_ARRAY_BUFFER, 5 * SIZEV3F, NULL, GL_STATIC_DRAW) ; + glBufferSubData( GL_ARRAY_BUFFER, 0 * SIZEV3F, SIZEV3F, &Point[0]) ; + glBufferSubData( GL_ARRAY_BUFFER, 1 * SIZEV3F, SIZEV3F, &Point[1]) ; + glBufferSubData( GL_ARRAY_BUFFER, 2 * SIZEV3F, SIZEV3F, &Point[2]) ; + glBufferSubData( GL_ARRAY_BUFFER, 3 * SIZEV3F, SIZEV3F, &Point[3]) ; + glBufferSubData( GL_ARRAY_BUFFER, 4 * SIZEV3F, SIZEV3F, &Point[0]) ; glVertexAttribPointer( (GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0) ; glEnableVertexAttribArray( 0) ; glBindVertexArray( 0) ; @@ -734,16 +809,15 @@ EGrScene::SetCube( void) return ; // vertici - size_t nSizeV3f = sizeof( Vert3f) ; Vert3f Point[8] ; - SET_VERT3F( Point[0], -0.5f, -0.5f, 0.0f) - SET_VERT3F( Point[1], -0.5f, 0.5f, 0.0f) - SET_VERT3F( Point[2], 0.5f, 0.5f, 0.0f) - SET_VERT3F( Point[3], 0.5f, -0.5f, 0.0f) - SET_VERT3F( Point[4], -0.5f, -0.5f, 1.0f) - SET_VERT3F( Point[5], -0.5f, 0.5f, 1.0f) - SET_VERT3F( Point[6], 0.5f, 0.5f, 1.0f) - SET_VERT3F( Point[7], 0.5f, -0.5f, 1.0f) + Point[0].Set( -0.5, -0.5, 0.0) ; + Point[1].Set( -0.5, 0.5, 0.0) ; + Point[2].Set( 0.5, 0.5, 0.0) ; + Point[3].Set( 0.5, -0.5, 0.0) ; + Point[4].Set( -0.5, -0.5, 1.0) ; + Point[5].Set( -0.5, 0.5, 1.0) ; + Point[6].Set( 0.5, 0.5, 1.0) ; + Point[7].Set( 0.5, -0.5, 1.0) ; // dimensioni di ingombro BBox3d b3Ext ; @@ -751,11 +825,10 @@ EGrScene::SetCube( void) b3Ext.Add( Point[i].x, Point[i].y, Point[i].z) ; SetExtension( b3Ext) ; - // inizializzo VAOs a non allocati - for ( int i = 0 ; i < NUM_VAO ; ++ i) - m_vaoID[i] = 0 ; - if ( m_bNewWay) { + // inizializzo VAOs a non allocati + for ( int i = 0 ; i < NUM_VAO ; ++ i) + m_vaoID[i] = 0 ; // VAO allocation glGenVertexArrays( 3, &m_vaoID[0]) ; if ( m_vaoID[0] == 0) @@ -766,12 +839,12 @@ EGrScene::SetCube( void) glBindBuffer( GL_ARRAY_BUFFER, m_vboID[0]) ; m_nMode[0] = GL_LINE_STRIP ; m_nCount[0] = 5 ; - glBufferData( GL_ARRAY_BUFFER, 5 * nSizeV3f, NULL, GL_STATIC_DRAW) ; - glBufferSubData( GL_ARRAY_BUFFER, 0 * nSizeV3f, nSizeV3f, &Point[0]) ; - glBufferSubData( GL_ARRAY_BUFFER, 1 * nSizeV3f, nSizeV3f, &Point[1]) ; - glBufferSubData( GL_ARRAY_BUFFER, 2 * nSizeV3f, nSizeV3f, &Point[2]) ; - glBufferSubData( GL_ARRAY_BUFFER, 3 * nSizeV3f, nSizeV3f, &Point[3]) ; - glBufferSubData( GL_ARRAY_BUFFER, 4 * nSizeV3f, nSizeV3f, &Point[0]) ; + glBufferData( GL_ARRAY_BUFFER, 5 * SIZEV3F, NULL, GL_STATIC_DRAW) ; + glBufferSubData( GL_ARRAY_BUFFER, 0 * SIZEV3F, SIZEV3F, &Point[0]) ; + glBufferSubData( GL_ARRAY_BUFFER, 1 * SIZEV3F, SIZEV3F, &Point[1]) ; + glBufferSubData( GL_ARRAY_BUFFER, 2 * SIZEV3F, SIZEV3F, &Point[2]) ; + glBufferSubData( GL_ARRAY_BUFFER, 3 * SIZEV3F, SIZEV3F, &Point[3]) ; + glBufferSubData( GL_ARRAY_BUFFER, 4 * SIZEV3F, SIZEV3F, &Point[0]) ; glVertexAttribPointer( (GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0) ; glEnableVertexAttribArray( 0) ; glBindVertexArray( 0) ; @@ -781,12 +854,12 @@ EGrScene::SetCube( void) glBindBuffer( GL_ARRAY_BUFFER, m_vboID[1]) ; m_nMode[1] = GL_LINE_STRIP ; m_nCount[1] = 5 ; - glBufferData( GL_ARRAY_BUFFER, 5 * nSizeV3f, NULL, GL_STATIC_DRAW) ; - glBufferSubData( GL_ARRAY_BUFFER, 0 * nSizeV3f, nSizeV3f, &Point[4]) ; - glBufferSubData( GL_ARRAY_BUFFER, 1 * nSizeV3f, nSizeV3f, &Point[5]) ; - glBufferSubData( GL_ARRAY_BUFFER, 2 * nSizeV3f, nSizeV3f, &Point[6]) ; - glBufferSubData( GL_ARRAY_BUFFER, 3 * nSizeV3f, nSizeV3f, &Point[7]) ; - glBufferSubData( GL_ARRAY_BUFFER, 4 * nSizeV3f, nSizeV3f, &Point[4]) ; + glBufferData( GL_ARRAY_BUFFER, 5 * SIZEV3F, NULL, GL_STATIC_DRAW) ; + glBufferSubData( GL_ARRAY_BUFFER, 0 * SIZEV3F, SIZEV3F, &Point[4]) ; + glBufferSubData( GL_ARRAY_BUFFER, 1 * SIZEV3F, SIZEV3F, &Point[5]) ; + glBufferSubData( GL_ARRAY_BUFFER, 2 * SIZEV3F, SIZEV3F, &Point[6]) ; + glBufferSubData( GL_ARRAY_BUFFER, 3 * SIZEV3F, SIZEV3F, &Point[7]) ; + glBufferSubData( GL_ARRAY_BUFFER, 4 * SIZEV3F, SIZEV3F, &Point[4]) ; glVertexAttribPointer( (GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0) ; glEnableVertexAttribArray( 0) ; glBindVertexArray( 0) ; @@ -796,15 +869,15 @@ EGrScene::SetCube( void) glBindBuffer( GL_ARRAY_BUFFER, m_vboID[2]) ; m_nMode[2] = GL_LINES ; m_nCount[2] = 8 ; - glBufferData( GL_ARRAY_BUFFER, 8 * nSizeV3f, NULL, GL_STATIC_DRAW) ; - glBufferSubData( GL_ARRAY_BUFFER, 0 * nSizeV3f, nSizeV3f, &Point[0]) ; - glBufferSubData( GL_ARRAY_BUFFER, 1 * nSizeV3f, nSizeV3f, &Point[4]) ; - glBufferSubData( GL_ARRAY_BUFFER, 2 * nSizeV3f, nSizeV3f, &Point[1]) ; - glBufferSubData( GL_ARRAY_BUFFER, 3 * nSizeV3f, nSizeV3f, &Point[5]) ; - glBufferSubData( GL_ARRAY_BUFFER, 4 * nSizeV3f, nSizeV3f, &Point[2]) ; - glBufferSubData( GL_ARRAY_BUFFER, 5 * nSizeV3f, nSizeV3f, &Point[6]) ; - glBufferSubData( GL_ARRAY_BUFFER, 6 * nSizeV3f, nSizeV3f, &Point[3]) ; - glBufferSubData( GL_ARRAY_BUFFER, 7 * nSizeV3f, nSizeV3f, &Point[7]) ; + glBufferData( GL_ARRAY_BUFFER, 8 * SIZEV3F, NULL, GL_STATIC_DRAW) ; + glBufferSubData( GL_ARRAY_BUFFER, 0 * SIZEV3F, SIZEV3F, &Point[0]) ; + glBufferSubData( GL_ARRAY_BUFFER, 1 * SIZEV3F, SIZEV3F, &Point[4]) ; + glBufferSubData( GL_ARRAY_BUFFER, 2 * SIZEV3F, SIZEV3F, &Point[1]) ; + glBufferSubData( GL_ARRAY_BUFFER, 3 * SIZEV3F, SIZEV3F, &Point[5]) ; + glBufferSubData( GL_ARRAY_BUFFER, 4 * SIZEV3F, SIZEV3F, &Point[2]) ; + glBufferSubData( GL_ARRAY_BUFFER, 5 * SIZEV3F, SIZEV3F, &Point[6]) ; + glBufferSubData( GL_ARRAY_BUFFER, 6 * SIZEV3F, SIZEV3F, &Point[3]) ; + glBufferSubData( GL_ARRAY_BUFFER, 7 * SIZEV3F, SIZEV3F, &Point[7]) ; glVertexAttribPointer( (GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0) ; glEnableVertexAttribArray( 0) ; glBindVertexArray( 0) ; @@ -819,14 +892,13 @@ EGrScene::SetTriangle( void) return ; // vertici - size_t nSizeV3f = sizeof( Vert3f) ; Vert3f Point[6] ; - SET_VERT3F( Point[0], -0.3f, 0.5f, -1.0f) - SET_VERT3F( Point[1], -0.8f, -0.5f, -1.0f) - SET_VERT3F( Point[2], 0.2f, -0.5f, -1.0f) - SET_VERT3F( Point[3], -0.2f, 0.5f, -1.0f) - SET_VERT3F( Point[4], 0.3f, -0.5f, -1.0f) - SET_VERT3F( Point[5], 0.8f, 0.5f, -1.0f) + Point[0].Set( -0.3, 0.5, -1.0) ; + Point[1].Set( -0.8, -0.5, -1.0) ; + Point[2].Set( 0.2, -0.5, -1.0) ; + Point[3].Set( -0.2, 0.5, -1.0) ; + Point[4].Set( 0.3, -0.5, -1.0) ; + Point[5].Set( 0.8, 0.5, -1.0) ; // dimensioni di ingombro BBox3d b3Ext ; @@ -834,25 +906,23 @@ EGrScene::SetTriangle( void) b3Ext.Add( Point[i].x, Point[i].y, Point[i].z) ; SetExtension( b3Ext) ; - // inizializzo VAOs a non allocati - for ( int i = 0 ; i < NUM_VAO ; ++ i) - m_vaoID[i] = 0 ; - if ( m_bNewWay) { + // inizializzo VAOs a non allocati + for ( int i = 0 ; i < NUM_VAO ; ++ i) + m_vaoID[i] = 0 ; // VAOs allocation glGenVertexArrays( 2, &m_vaoID[0]) ; - // First VAO setup glBindVertexArray( m_vaoID[0]) ; glGenBuffers( 1, &m_vboID[0]) ; //VBO allocation glBindBuffer( GL_ARRAY_BUFFER, m_vboID[0]) ; m_nMode[0] = GL_LINE_STRIP ; m_nCount[0] = 4 ; - glBufferData( GL_ARRAY_BUFFER, 4 * nSizeV3f, NULL, GL_STATIC_DRAW) ; - glBufferSubData( GL_ARRAY_BUFFER, 0 * nSizeV3f, nSizeV3f, &Point[0]) ; - glBufferSubData( GL_ARRAY_BUFFER, 1 * nSizeV3f, nSizeV3f, &Point[1]) ; - glBufferSubData( GL_ARRAY_BUFFER, 2 * nSizeV3f, nSizeV3f, &Point[2]) ; - glBufferSubData( GL_ARRAY_BUFFER, 3 * nSizeV3f, nSizeV3f, &Point[0]) ; + glBufferData( GL_ARRAY_BUFFER, 4 * SIZEV3F, NULL, GL_STATIC_DRAW) ; + glBufferSubData( GL_ARRAY_BUFFER, 0 * SIZEV3F, SIZEV3F, &Point[0]) ; + glBufferSubData( GL_ARRAY_BUFFER, 1 * SIZEV3F, SIZEV3F, &Point[1]) ; + glBufferSubData( GL_ARRAY_BUFFER, 2 * SIZEV3F, SIZEV3F, &Point[2]) ; + glBufferSubData( GL_ARRAY_BUFFER, 3 * SIZEV3F, SIZEV3F, &Point[0]) ; glVertexAttribPointer( (GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0) ; glEnableVertexAttribArray( 0) ; glBindVertexArray( 0) ; @@ -862,25 +932,51 @@ EGrScene::SetTriangle( void) glBindBuffer( GL_ARRAY_BUFFER, m_vboID[1]) ; m_nMode[1] = GL_LINE_STRIP ; m_nCount[1] = 4 ; - glBufferData( GL_ARRAY_BUFFER, 4 * nSizeV3f, NULL, GL_STATIC_DRAW) ; - glBufferSubData( GL_ARRAY_BUFFER, 0 * nSizeV3f, nSizeV3f, &Point[3]) ; - glBufferSubData( GL_ARRAY_BUFFER, 1 * nSizeV3f, nSizeV3f, &Point[4]) ; - glBufferSubData( GL_ARRAY_BUFFER, 2 * nSizeV3f, nSizeV3f, &Point[5]) ; - glBufferSubData( GL_ARRAY_BUFFER, 3 * nSizeV3f, nSizeV3f, &Point[3]) ; + glBufferData( GL_ARRAY_BUFFER, 4 * SIZEV3F, NULL, GL_STATIC_DRAW) ; + glBufferSubData( GL_ARRAY_BUFFER, 0 * SIZEV3F, SIZEV3F, &Point[3]) ; + glBufferSubData( GL_ARRAY_BUFFER, 1 * SIZEV3F, SIZEV3F, &Point[4]) ; + glBufferSubData( GL_ARRAY_BUFFER, 2 * SIZEV3F, SIZEV3F, &Point[5]) ; + glBufferSubData( GL_ARRAY_BUFFER, 3 * SIZEV3F, SIZEV3F, &Point[3]) ; glVertexAttribPointer( (GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0) ; glEnableVertexAttribArray( 0) ; glBindVertexArray( 0) ; } + else { + // First VAO setup + m_nMode[0] = GL_LINE_STRIP ; + m_nCount[0] = 4 ; + m_v3fVect[0].reserve( 4) ; + m_v3fVect[0].push_back( Point[0]) ; + m_v3fVect[0].push_back( Point[1]) ; + m_v3fVect[0].push_back( Point[2]) ; + m_v3fVect[0].push_back( Point[0]) ; + // Second VAO setup + m_nMode[1] = GL_LINE_STRIP ; + m_nCount[1] = 4 ; + m_v3fVect[1].reserve( 4) ; + m_v3fVect[1].push_back( Point[3]) ; + m_v3fVect[1].push_back( Point[4]) ; + m_v3fVect[1].push_back( Point[5]) ; + m_v3fVect[1].push_back( Point[3]) ; + // Third VAO null + m_nCount[2] = 0 ; + } } //---------------------------------------------------------------------------- void EGrScene::ResetData( void) { - if ( m_bNewWay && MakeCurrent()) { - glBindBuffer( GL_ARRAY_BUFFER, 0) ; - glDeleteBuffers( NUM_VAO, m_vboID) ; - glBindVertexArray( 0) ; - glDeleteVertexArrays( NUM_VAO, m_vaoID) ; + if ( m_bNewWay) { + if ( MakeCurrent()) { + glBindBuffer( GL_ARRAY_BUFFER, 0) ; + glDeleteBuffers( NUM_VAO, m_vboID) ; + glBindVertexArray( 0) ; + glDeleteVertexArrays( NUM_VAO, m_vaoID) ; + } + } + else { + for ( int i = 0 ; i < NUM_VAO ; ++ i) + m_v3fVect[i].clear() ; } } diff --git a/EGrScene.h b/EGrScene.h index 834d77e..a072c87 100644 --- a/EGrScene.h +++ b/EGrScene.h @@ -16,11 +16,13 @@ //---------------------------------------------------------------------------- #include "/EgtDev/Include/EGkPoint3d.h" #include "/EgtDev/Include/EGkBBox3d.h" +#include "EGrGraphObjs.h" #define GLEW_MX #include "/EgtDev/Extern/GLEW/Include/glew.h" #include "/EgtDev/Extern/GLEW/Include/wglew.h" #include +class ILogger ; //---------------------------------------------------------------------------- class EGrScene @@ -32,13 +34,13 @@ class EGrScene public: EGrScene( void); virtual ~EGrScene( void); - bool CreateContext( HDC hDC, int nDriver, bool bDouBuff, int nColorBits, int nDepthBits) ; + bool Init( ILogger* pLogger) ; + bool CreateContext( HDC hDC, int nDriver, bool b2Buff, int nColorBits, int nDepthBits) ; bool IsValid( void) { return ( m_hDC != nullptr && m_hRC != nullptr) ; } std::string GetOpenGLInfo( void) ; std::string GetGLSLInfo( void) ; std::string GetPixelFormatInfo( void) ; - bool Prepare( void) ; bool Reshape( int nW, int nH) ; bool Draw( void) ; void Destroy( void) ; @@ -59,7 +61,7 @@ class EGrScene void ResetData( void) ; private : - int ChooseGenPixelFormat( int nPfd, bool bDouBuff, int nColorBits, int nDepthBits) ; + int ChooseGenPixelFormat( int nPfd, bool b2Buff, int nColorBits, int nDepthBits) ; bool MakeCurrent( void) ; GLEWContext* glewGetContext( void) { return &m_glewc ; } @@ -71,12 +73,15 @@ class EGrScene bool CalcDimViewFromExtView( void) ; bool AdjustDimView( double dHalfWidth, double dHalfHeight) ; bool CalcClippingPlanesFromExtView( void) ; + bool Prepare( void) ; void SetTriangle( void) ; void SetSquare( void) ; void SetCube( void) ; private : + ILogger* m_pLogger ; + HDC m_hDC ; // Device Context HGLRC m_hRC ; // OpenGL Rendering Context WGLEWContext m_wglewc ; // WGLEW Context @@ -100,8 +105,9 @@ class EGrScene double m_dZFar ; static const int NUM_VAO = 3 ; - GLuint m_vaoID[NUM_VAO] ; // VAOs - GLuint m_vboID[NUM_VAO] ; // VBOs int m_nMode[NUM_VAO] ; // modo di utilizzo dei vertici int m_nCount[NUM_VAO] ; // contatore di vertici + GLuint m_vaoID[NUM_VAO] ; // VAOs + GLuint m_vboID[NUM_VAO] ; // VBOs + V3FVECTOR m_v3fVect[NUM_VAO] ; // array di vertici equivalenti per vecchio modo } ; diff --git a/TestEGr.rc b/TestEGr.rc index 641040be09a65e525f6c71ac063dd89e1c172ad7..a0d4dcf9235896697bbebba8d26369eaae0c04d3 100644 GIT binary patch delta 96 zcmeB~%-A!Tal + diff --git a/TestEGr.vcxproj.filters b/TestEGr.vcxproj.filters index 0fa3099..2b435f0 100644 --- a/TestEGr.vcxproj.filters +++ b/TestEGr.vcxproj.filters @@ -59,6 +59,9 @@ File di intestazione + + File di intestazione + diff --git a/TestEGrDlg.cpp b/TestEGrDlg.cpp index b976b7e..18c79cd 100644 --- a/TestEGrDlg.cpp +++ b/TestEGrDlg.cpp @@ -169,10 +169,11 @@ CTestEGrDlg::OnPaint( void) dc.DrawIcon( x, y, m_hIcon) ; } else { - //m_Scene.Reshape( 0, 0) ; + // ridisegno dialogo + CDialog::OnPaint() ; + // ridisegno finestra OpenGL m_Scene.Draw() ; m_View.ValidateRgn( NULL) ; - CDialog::OnPaint() ; } } @@ -222,7 +223,7 @@ CTestEGrDlg::OnSize( UINT nType, int cx, int cy) m_nPrevCx = cx ; m_nPrevCy = cy ; // lancio ridisegno - Invalidate() ; + RedrawWindow() ; } } @@ -310,8 +311,8 @@ void CTestEGrDlg::StartScene( void) { // recupero i parametri - int nDriver = ( GetPrivateProfileInt( "OpenGL", "Driver", 2, AfxGetApp()->m_pszProfileName) == 1) ; - bool bDouBuff = ( GetPrivateProfileInt( "OpenGL", "DoubleBuffer", 1, AfxGetApp()->m_pszProfileName) == 1) ; + int nDriver = GetPrivateProfileInt( "OpenGL", "Driver", 2, AfxGetApp()->m_pszProfileName) ; + bool b2Buff = ( GetPrivateProfileInt( "OpenGL", "DoubleBuffer", 1, AfxGetApp()->m_pszProfileName) == 1) ; int nColorBits = GetPrivateProfileInt( "OpenGL", "ColorBits", 16, AfxGetApp()->m_pszProfileName) ; int nDepthBits = GetPrivateProfileInt( "OpenGL", "DepthBits", 16, AfxGetApp()->m_pszProfileName) ; @@ -325,7 +326,8 @@ CTestEGrDlg::StartScene( void) m_View.Create( this, IDC_SCENE) ; // creazione della scena - m_Scene.CreateContext( m_View.GetSafeHdc(), nDriver, bDouBuff, nColorBits, nDepthBits) ; + m_Scene.Init( m_pLogger) ; + m_Scene.CreateContext( m_View.GetSafeHdc(), nDriver, b2Buff, nColorBits, nDepthBits) ; // impostazione dati geometrie m_Scene.SetData( 3) ;