diff --git a/EgtGraphics.rc b/EgtGraphics.rc index c1155c4..3b4d88e 100644 Binary files a/EgtGraphics.rc and b/EgtGraphics.rc differ diff --git a/EgtGraphics.vcxproj b/EgtGraphics.vcxproj index 05af160..2b31922 100644 --- a/EgtGraphics.vcxproj +++ b/EgtGraphics.vcxproj @@ -95,6 +95,10 @@ true false true + ProgramDatabase + CompileAsCpp + + Windows @@ -118,6 +122,8 @@ copy $(TargetPath) \EgtProg\Dll32 true false true + + Windows @@ -144,6 +150,9 @@ copy $(TargetPath) \EgtProg\Dll64 Speed AnySuitable true + CompileAsCpp + + Windows @@ -172,6 +181,8 @@ copy $(TargetPath) \EgtProg\Dll32 AnySuitable false true + + Windows @@ -188,6 +199,7 @@ copy $(TargetPath) \EgtProg\Dll64 + diff --git a/EgtGraphics.vcxproj.filters b/EgtGraphics.vcxproj.filters index b82a4fb..3387407 100644 --- a/EgtGraphics.vcxproj.filters +++ b/EgtGraphics.vcxproj.filters @@ -63,6 +63,9 @@ File di intestazione + + File di intestazione + diff --git a/ObjNewGraphics.cpp b/ObjNewGraphics.cpp index a300019..e85e762 100644 --- a/ObjNewGraphics.cpp +++ b/ObjNewGraphics.cpp @@ -61,8 +61,8 @@ ObjNewGraphics::AddPolyLine( const PolyLine& PL) glBufferSubData( GL_ARRAY_BUFFER, m_nCount * SIZEV3F, SIZEV3F, &v3V) ; ++ m_nCount ; } - glVertexAttribPointer( (GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0) ; - glEnableVertexAttribArray( 0) ; + glVertexPointer( 3, GL_FLOAT, 0, ((void*)(0))) ; + glEnableClientState( GL_VERTEX_ARRAY) ; glBindVertexArray( 0) ; return true ; @@ -82,6 +82,7 @@ ObjNewGraphics::Draw( void) if ( m_nVaoId != 0) { glBindVertexArray( m_nVaoId) ; glDrawArrays( m_nMode, 0, m_nCount) ; + glBindVertexArray( 0) ; } return true ; diff --git a/SceExecutor.cpp b/SceExecutor.cpp index c1b6e26..72792b2 100644 --- a/SceExecutor.cpp +++ b/SceExecutor.cpp @@ -42,13 +42,24 @@ SceExecutor::~SceExecutor( void) //---------------------------------------------------------------------------- bool -SceExecutor::Init( IEGrScene* pScene) +SceExecutor::SetScene( IEGrScene* pScene) { m_pScene = pScene ; return ( m_pScene != nullptr) ; } +//---------------------------------------------------------------------------- +bool +SceExecutor::SetCmdParser( ICmdParser* pParser) +{ + // imposto eventuale parser dipendente + if ( m_pOtherExec != nullptr) + m_pOtherExec->SetCmdParser( pParser) ; + + return true ; +} + //---------------------------------------------------------------------------- bool SceExecutor::AddExecutor( ICmdExecutor* pOtherExec) @@ -61,24 +72,7 @@ SceExecutor::AddExecutor( ICmdExecutor* pOtherExec) bool SceExecutor::Execute( const string& sCmd1, const string& sCmd2, const STRVECTOR& vsParams) { - string sOut ; - STRVECTOR::const_iterator theConstIter ; - - - // output di debug - sOut = " " + sCmd1 ; - if ( ! sCmd2.empty()) - sOut += "." + sCmd2 ; - sOut += "( " ; - for ( theConstIter = vsParams.begin() ; theConstIter != vsParams.end() ; ++theConstIter) { - if ( theConstIter != vsParams.begin()) - sOut += ", " ; - sOut += *theConstIter ; - } - sOut += ")" ; - LOG_DBG_INFO( GetEGrLogger(), sOut.c_str()) - - // verifico validita Scene + // verifico validità Scene if ( m_pScene == nullptr) { LOG_ERROR( GetEGrLogger(), "Error : null Scene.") return false ; @@ -137,15 +131,15 @@ SceExecutor::ExecuteRedraw( const string& sCmd2, const STRVECTOR& vsParams) bool SceExecutor::ExecuteZoom( const string& sCmd2, const STRVECTOR& vsParams) { - const double COEFF_PLUS = 0.9 ; - const double COEFF_MINUS = 1 / COEFF_PLUS ; + const double COEFF_IN = 0.9 ; + const double COEFF_OUT = 1 / COEFF_IN ; if ( sCmd2 == "ALL") m_pScene->ZoomAll() ; - else if ( sCmd2 == "PLUS") - m_pScene->ZoomChange( COEFF_PLUS) ; - else if ( sCmd2 == "MINUS") - m_pScene->ZoomChange( COEFF_MINUS) ; + else if ( sCmd2 == "IN") + m_pScene->ZoomChange( COEFF_IN) ; + else if ( sCmd2 == "OUT") + m_pScene->ZoomChange( COEFF_OUT) ; else if ( sCmd2 == "CHANGE") { // 1 parametro : fattore di zoom if ( vsParams.size() != 1) diff --git a/SceExecutor.h b/SceExecutor.h index bd6c9ba..cd46c78 100644 --- a/SceExecutor.h +++ b/SceExecutor.h @@ -21,9 +21,10 @@ class SceExecutor : public ISceExecutor { public : - virtual bool Execute( const std::string& sCmd1, const std::string& sCmd2, const STRVECTOR& vsParams) ; + virtual bool SetCmdParser( ICmdParser* pParser) ; virtual bool AddExecutor( ICmdExecutor* pOtherExec) ; - virtual bool Init( IEGrScene* pScene) ; + virtual bool Execute( const std::string& sCmd1, const std::string& sCmd2, const STRVECTOR& vsParams) ; + virtual bool SetScene( IEGrScene* pScene) ; public : SceExecutor( void) ; diff --git a/Scene.h b/Scene.h index 169c9bc..3e6d912 100644 --- a/Scene.h +++ b/Scene.h @@ -35,6 +35,7 @@ class Scene : public IEGrScene virtual bool RedrawWindow( void) ; virtual bool SetExtension( const BBox3d& b3Ext) ; virtual bool Reshape( int nW, int nH) ; + virtual bool SetBackground( Color BackTop, Color BackBottom) ; virtual bool Prepare( void) ; virtual bool Draw( void) ; virtual bool Project( const Point3d& ptWorld, Point3d& ptView) ; @@ -73,6 +74,7 @@ class Scene : public IEGrScene bool CalcDimViewFromExtView( void) ; bool AdjustDimView( double dHalfWidth, double dHalfHeight) ; bool CalcClippingPlanesFromExtView( void) ; + bool Background( void) ; // Camera bool VerifyCamera( void) ; bool CalcDirUp( void) ; @@ -90,6 +92,9 @@ class Scene : public IEGrScene GLEWContext m_glewc ; // GLEW Context bool m_bNewWay ; // flag che indica nuova modalità (OpenGL 3.0 in poi) + Color m_BackTop ; // colore di sfondo in alto + Color m_BackBottom ; // colore di sfondo in basso + Point3d m_ptCenter ; // centro verso cui è rivolta la camera Vector3d m_vtDirCamera ; // versore direzione dal centro alla camera double m_dDistCamera ; // distanza dal centro alla camera diff --git a/SceneBasic.cpp b/SceneBasic.cpp index b9dcf0d..027f1f2 100644 --- a/SceneBasic.cpp +++ b/SceneBasic.cpp @@ -14,6 +14,7 @@ //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "Scene.h" +#include "GraphObjs.h" #include "DllMain.h" #include "/EgtDev/Include/EgtILogger.h" #include "/EgtDev/Include/EGnStringUtils.h" @@ -467,14 +468,105 @@ Scene::Reshape( int nW, int nH) //---------------------------------------------------------------------------- bool -Scene::Prepare( void) +Scene::SetBackground( Color BackTop, Color BackBottom) +{ + m_BackTop = BackTop ; + m_BackBottom = BackBottom ; + + return true ; +} + +//---------------------------------------------------------------------------- +bool +Scene::Background( void) { // imposto il rendering corrente if ( ! MakeCurrent()) return false ; // imposto il colore dello sfondo - glClearColor( 0.1f, 0.1f, 0.5f, 0.0f) ; + glClearColor( m_BackTop.GetRed(), m_BackTop.GetGreen(), m_BackTop.GetBlue(), m_BackTop.GetAlpha()) ; + + // cancello + glClear( GL_COLOR_BUFFER_BIT) ; + + // se lo sfondo ha un colore uniforme, ho finito + if ( m_BackTop == m_BackBottom) + return true ; + + // rendo neutre matrici di proiezione e di modello/vista + glMatrixMode( GL_PROJECTION) ; + glLoadIdentity() ; + glMatrixMode( GL_MODELVIEW) ; + glLoadIdentity() ; + + // disegno lo sfondo con due colori + if ( ! m_bNewWay) { + glBegin( GL_TRIANGLE_STRIP) ; + glColor3f( m_BackBottom.GetRed(), m_BackBottom.GetGreen(), m_BackBottom.GetBlue()) ; + glVertex3f( -1, -1, 0.5) ; + glVertex3f( 1, -1, 0.5) ; + glColor3f( m_BackTop.GetRed(), m_BackTop.GetGreen(), m_BackTop.GetBlue()) ; + glVertex3f( -1, 1, 0.5) ; + glVertex3f( 1, 1, 0.5) ; + glEnd() ; + } + else { + unsigned int nVaoId ; + unsigned int nVboId ; + // definizione + glGenVertexArrays( 1, &nVaoId) ; + if ( nVaoId == 0) + return false ; + glBindVertexArray( nVaoId) ; + glGenBuffers( 1, &nVboId) ; + glBindBuffer( GL_ARRAY_BUFFER, nVboId) ; + glBufferData( GL_ARRAY_BUFFER, 8 * SIZEV3F, NULL, GL_STATIC_DRAW) ; + glVertexPointer( 3, GL_FLOAT, 2 * SIZEV3F, ((void*)(0))) ; + glEnableClientState( GL_VERTEX_ARRAY) ; + glColorPointer( 3, GL_FLOAT, 2 * SIZEV3F, ((void*)(1 * SIZEV3F))) ; + glEnableClientState( GL_COLOR_ARRAY) ; + Vert3f v3V ; + Vert3f v3C ; + // bottom left + v3V.Set( -1, -1, 0.5) ; + glBufferSubData( GL_ARRAY_BUFFER, 0 * SIZEV3F, SIZEV3F, &v3V) ; + v3C.Set( m_BackBottom.GetRed(), m_BackBottom.GetGreen(), m_BackBottom.GetBlue()) ; + glBufferSubData( GL_ARRAY_BUFFER, 1 * SIZEV3F, SIZEV3F, &v3C) ; + // bottom right + v3V.Set( 1, -1, 0.5) ; + glBufferSubData( GL_ARRAY_BUFFER, 2 * SIZEV3F, SIZEV3F, &v3V) ; + // v3C constant + glBufferSubData( GL_ARRAY_BUFFER, 3 * SIZEV3F, SIZEV3F, &v3C) ; + // top left + v3V.Set( -1, 1, 0.5) ; + glBufferSubData( GL_ARRAY_BUFFER, 4 * SIZEV3F, SIZEV3F, &v3V) ; + v3C.Set( m_BackTop.GetRed(), m_BackTop.GetGreen(), m_BackTop.GetBlue()) ; + glBufferSubData( GL_ARRAY_BUFFER, 5 * SIZEV3F, SIZEV3F, &v3C) ; + // top right + v3V.Set( 1, 1, 0.5) ; + glBufferSubData( GL_ARRAY_BUFFER, 6 * SIZEV3F, SIZEV3F, &v3V) ; + // v3C constant + glBufferSubData( GL_ARRAY_BUFFER, 7 * SIZEV3F, SIZEV3F, &v3C) ; + // disegno + glDrawArrays( GL_TRIANGLE_STRIP, 0, 4) ; + // cancellazione + glBindBuffer( GL_ARRAY_BUFFER, 0) ; + glDeleteBuffers( 1, &nVboId) ; + glBindVertexArray( 0) ; + glDeleteVertexArrays( 1, &nVaoId) ; + } + + return true ; +} + +//---------------------------------------------------------------------------- +bool +Scene::Prepare( void) +{ + // imposto il rendering corrente + if ( ! MakeCurrent()) + return false ; // eventuale ricalcolo parametri di vista CalcDirUp() ; @@ -506,12 +598,16 @@ Scene::Prepare( void) bool Scene::Draw( void) { + // sistemo lo sfondo + if ( ! Background()) + return false ; + // imposto if ( ! Prepare()) return false ; - // cancello - glClear( GL_COLOR_BUFFER_BIT) ; + // colore di default + glColor4f( 1, 1, 1, 1) ; // disegno DrawGroup( GDB_ID_ROOT) ;