From 73ee89f9c5a1cdf5b4bb1b3fbd5a8846e231d290 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Wed, 19 Feb 2014 11:21:12 +0000 Subject: [PATCH] EgtGraphics 1.5b3 : - aggiunto SceExecutor per eseguire file Tsc - centralizzata gestiopne del logger - mogliorie varie --- DllMain.h | 20 ++++ EGrDllMain.cpp | 18 +++ EgtGraphics.rc | Bin 11390 -> 11390 bytes EgtGraphics.vcxproj | 4 + EgtGraphics.vcxproj.filters | 12 ++ SceExecutor.cpp | 222 ++++++++++++++++++++++++++++++++++++ SceExecutor.h | 42 +++++++ Scene.h | 7 +- SceneBasic.cpp | 41 ++++--- SceneCamera.cpp | 70 ++++++------ SceneGeom.cpp | 2 +- 11 files changed, 383 insertions(+), 55 deletions(-) create mode 100644 DllMain.h create mode 100644 SceExecutor.cpp create mode 100644 SceExecutor.h diff --git a/DllMain.h b/DllMain.h new file mode 100644 index 0000000..f96dcc4 --- /dev/null +++ b/DllMain.h @@ -0,0 +1,20 @@ +//---------------------------------------------------------------------------- +// EgalTech 2013-2013 +//---------------------------------------------------------------------------- +// File : DllMain.h Data : 17.02.14 Versione : 1.5b3 +// Contenuto : Prototipi funzioni per uso locale della DLL. +// +// +// +// Modifiche : 17.02.14 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +#pragma once + + +#include "/EgtDev/Include/EgtILogger.h" + +//----------------------------------------------------------------------------- +ILogger* GetEGrLogger( void) ; diff --git a/EGrDllMain.cpp b/EGrDllMain.cpp index 1b3bbf8..c6adbc3 100644 --- a/EGrDllMain.cpp +++ b/EGrDllMain.cpp @@ -13,6 +13,7 @@ //--------------------------- Include ---------------------------------------- #include "stdafx.h" +#include "DllMain.h" #include "/EgtDev/Include/EGrDllMain.h" #include "/EgtDev/Include/EGnGetModuleVer.h" #include "/EgtDev/Include/EgtTrace.h" @@ -65,3 +66,20 @@ GetEGrVersion( void) return s_szEGrNameVer ; } + +//----------------------------------------------------------------------------- +static ILogger* s_pLogger = nullptr ; + +//----------------------------------------------------------------------------- +void +SetEGrLogger( ILogger* pLogger) +{ + s_pLogger = pLogger ; +} + +//----------------------------------------------------------------------------- +ILogger* +GetEGrLogger( void) +{ + return s_pLogger ; +} diff --git a/EgtGraphics.rc b/EgtGraphics.rc index 1654b8e455409af9e14b74ca452148b782615422..c1155c429a5b1cf1b719270a32183dcb1628f5ad 100644 GIT binary patch delta 81 zcmewt@h@V-H#SD&&G%&mnSs F+yK6f8`l5; delta 81 zcmewt@h@V-H#SD2&G%&mnSs F+yK2>8_xg$ diff --git a/EgtGraphics.vcxproj b/EgtGraphics.vcxproj index 7ff730a..05af160 100644 --- a/EgtGraphics.vcxproj +++ b/EgtGraphics.vcxproj @@ -192,7 +192,10 @@ copy $(TargetPath) \EgtProg\Dll64 + + + @@ -204,6 +207,7 @@ copy $(TargetPath) \EgtProg\Dll64 + diff --git a/EgtGraphics.vcxproj.filters b/EgtGraphics.vcxproj.filters index 18c2162..b82a4fb 100644 --- a/EgtGraphics.vcxproj.filters +++ b/EgtGraphics.vcxproj.filters @@ -54,6 +54,15 @@ File di intestazione + + File di intestazione + + + File di intestazione + + + File di intestazione + @@ -77,6 +86,9 @@ File di origine + + File di origine + diff --git a/SceExecutor.cpp b/SceExecutor.cpp new file mode 100644 index 0000000..c1b6e26 --- /dev/null +++ b/SceExecutor.cpp @@ -0,0 +1,222 @@ +//---------------------------------------------------------------------------- +// EgalTech 2013-2014 +//---------------------------------------------------------------------------- +// File : GraExecutor.cpp Data : 18.02.14 Versione : 1.5b3 +// Contenuto : Implementazione della classe GraExecutor. +// +// +// +// Modifiche : 18.02.14 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "SceExecutor.h" +#include "DllMain.h" +#include "/EgtDev/Include/EgnStringUtils.h" +#include "/EgtDev/Include/EgrScene.h" + +using namespace std ; + + +//---------------------------------------------------------------------------- +ISceExecutor* +CreateSceExecutor( void) +{ + return static_cast ( new SceExecutor) ; +} + +//---------------------------------------------------------------------------- +SceExecutor::SceExecutor( void) +{ + m_pScene = nullptr ; + m_pOtherExec = nullptr ; +} + +//---------------------------------------------------------------------------- +SceExecutor::~SceExecutor( void) +{ +} + +//---------------------------------------------------------------------------- +bool +SceExecutor::Init( IEGrScene* pScene) +{ + m_pScene = pScene ; + + return ( m_pScene != nullptr) ; +} + +//---------------------------------------------------------------------------- +bool +SceExecutor::AddExecutor( ICmdExecutor* pOtherExec) +{ + m_pOtherExec = pOtherExec ; + return true ; +} + +//---------------------------------------------------------------------------- +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 + if ( m_pScene == nullptr) { + LOG_ERROR( GetEGrLogger(), "Error : null Scene.") + return false ; + } + + // esecuzione comando + if ( sCmd1 == "PAUSE") + return ExecutePause( sCmd2, vsParams) ; + else if ( sCmd1 == "RD" || sCmd1 == "REDRAW") + return ExecuteRedraw( sCmd2, vsParams) ; + else if ( sCmd1 == "ZM" || sCmd1 == "ZOOM") + return ExecuteZoom( sCmd2, vsParams) ; + else if ( sCmd1 == "CENTER") + return ExecuteCenter( sCmd2, vsParams) ; + else if ( sCmd1 == "CAMERA") + return ExecuteCamera( sCmd2, vsParams) ; + else if ( m_pOtherExec != nullptr) + return m_pOtherExec->Execute( sCmd1, sCmd2, vsParams) ; + + return false ; +} + +//---------------------------------------------------------------------------- +bool +SceExecutor::ExecutePause( const string& sCmd2, const STRVECTOR& vsParams) +{ + const int MIN_TIME = 0 ; + const int MAX_TIME = 10000 ; + + // 1 parametro : durata della pausa in ms + if ( vsParams.size() != 1) + return false ; + // tempo di attesa + int nTime ; + if ( ! FromString( vsParams[0], nTime)) + return false ; + if ( nTime < MIN_TIME) + nTime = MIN_TIME ; + else if ( nTime > MAX_TIME) + nTime = MAX_TIME ; + // eseguo + Sleep( nTime) ; + + return true ; +} + +//---------------------------------------------------------------------------- +bool +SceExecutor::ExecuteRedraw( const string& sCmd2, const STRVECTOR& vsParams) +{ + m_pScene->RedrawWindow() ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +SceExecutor::ExecuteZoom( const string& sCmd2, const STRVECTOR& vsParams) +{ + const double COEFF_PLUS = 0.9 ; + const double COEFF_MINUS = 1 / COEFF_PLUS ; + + 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 == "CHANGE") { + // 1 parametro : fattore di zoom + if ( vsParams.size() != 1) + return false ; + // fattore di zoom + double nFactor ; + if ( ! FromString( vsParams[0], nFactor)) + return false ; + // eseguo + m_pScene->ZoomChange( nFactor) ; + } + + return true ; +} + +//---------------------------------------------------------------------------- +bool +SceExecutor::ExecuteCenter( const string& sCmd2, const STRVECTOR& vsParams) +{ + // 3 parametri : le 3 coordinate + if ( vsParams.size() != 3) + return false ; + // recupero le tre coordinate + Point3d ptCen ; + if ( ! FromString( vsParams[0], ptCen.x) || + ! FromString( vsParams[1], ptCen.y) || + ! FromString( vsParams[2], ptCen.z)) + return false ; + // eseguo + m_pScene->SetCenter( ptCen) ; + + return true ; +} + +//---------------------------------------------------------------------------- +bool +SceExecutor::ExecuteCamera( const string& sCmd2, const STRVECTOR& vsParams) +{ + if ( sCmd2 == "TOP") + m_pScene->SetCamera( CT_TOP) ; + else if ( sCmd2 == "FRONT") + m_pScene->SetCamera( CT_FRONT) ; + else if ( sCmd2 == "RIGHT") + m_pScene->SetCamera( CT_RIGHT) ; + else if ( sCmd2 == "BACK") + m_pScene->SetCamera( CT_BACK) ; + else if ( sCmd2 == "LEFT") + m_pScene->SetCamera( CT_LEFT) ; + else if ( sCmd2 == "BOTTOM") + m_pScene->SetCamera( CT_BOTTOM) ; + else if ( sCmd2 == "ISO_SW") + m_pScene->SetCamera( CT_ISO_SW) ; + else if ( sCmd2 == "ISO_SE") + m_pScene->SetCamera( CT_ISO_SE) ; + else if ( sCmd2 == "ISO_NE") + m_pScene->SetCamera( CT_ISO_NE) ; + else if ( sCmd2 == "ISO_NW") + m_pScene->SetCamera( CT_ISO_NW) ; + else if ( sCmd2.empty() || sCmd2 == "GEN") { + // 2 parametri : i 2 angoli + if ( vsParams.size() != 2) + return false ; + // recupero i due angoli + double dAngVertDeg ; + double dAngOrizzDeg ; + if ( ! FromString( vsParams[0], dAngVertDeg) || + ! FromString( vsParams[1], dAngOrizzDeg)) + return false ; + // eseguo + m_pScene->SetCamera( dAngVertDeg, dAngOrizzDeg, 0) ; + } + + return true ; +} diff --git a/SceExecutor.h b/SceExecutor.h new file mode 100644 index 0000000..bd6c9ba --- /dev/null +++ b/SceExecutor.h @@ -0,0 +1,42 @@ +//---------------------------------------------------------------------------- +// EgalTech 2013-2013 +//---------------------------------------------------------------------------- +// File : GraExecutor.h Data : 18.02.14 Versione : 1.5b3 +// Contenuto : Dichiarazione della classe GraExecutor. +// +// +// +// Modifiche : 18.02.14 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +#pragma once + + +#include "/EgtDev/Include/EGrSceExecutor.h" + + +//---------------------------------------------------------------------------- +class SceExecutor : public ISceExecutor +{ + public : + virtual bool Execute( const std::string& sCmd1, const std::string& sCmd2, const STRVECTOR& vsParams) ; + virtual bool AddExecutor( ICmdExecutor* pOtherExec) ; + virtual bool Init( IEGrScene* pScene) ; + + public : + SceExecutor( void) ; + ~SceExecutor( void) ; + + private : + bool ExecutePause( const std::string& sCmd2, const STRVECTOR& vsParams) ; + bool ExecuteRedraw( const std::string& sCmd2, const STRVECTOR& vsParams) ; + bool ExecuteZoom( const std::string& sCmd2, const STRVECTOR& vsParams) ; + bool ExecuteCenter( const std::string& sCmd2, const STRVECTOR& vsParams) ; + bool ExecuteCamera( const std::string& sCmd2, const STRVECTOR& vsParams) ; + + private : + IEGrScene* m_pScene ; + ICmdExecutor* m_pOtherExec ; +} ; diff --git a/Scene.h b/Scene.h index 42e54f9..169c9bc 100644 --- a/Scene.h +++ b/Scene.h @@ -25,15 +25,16 @@ class Scene : public IEGrScene public : // Basic virtual ~Scene( void) ; - virtual bool Init( IGeomDB* pGeomDB, ILogger* pLogger) ; + virtual bool Init( IGeomDB* pGeomDB) ; virtual bool CreateContext( HDC hDC, int nDriver, bool b2Buff, int nColorBits, int nDepthBits) ; virtual bool IsValid( void) { return ( m_hDC != nullptr && m_hRC != nullptr) ; } virtual std::string GetOpenGLInfo( void) ; virtual std::string GetGLSLInfo( void) ; virtual std::string GetPixelFormatInfo( void) ; - virtual bool Reshape( int nW, int nH) ; + virtual bool RedrawWindow( void) ; virtual bool SetExtension( const BBox3d& b3Ext) ; + virtual bool Reshape( int nW, int nH) ; 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 AdjustDimView( double dHalfWidth, double dHalfHeight) ; bool CalcClippingPlanesFromExtView( void) ; // Camera + bool VerifyCamera( void) ; bool CalcDirUp( void) ; // Geometry bool DrawGroup( int nId) ; @@ -81,7 +83,6 @@ class Scene : public IEGrScene private : IGeomDB* m_pGeomDB ; - ILogger* m_pLogger ; HDC m_hDC ; // Device Context HGLRC m_hRC ; // OpenGL Rendering Context diff --git a/SceneBasic.cpp b/SceneBasic.cpp index 31e40ed..b9dcf0d 100644 --- a/SceneBasic.cpp +++ b/SceneBasic.cpp @@ -14,6 +14,7 @@ //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "Scene.h" +#include "DllMain.h" #include "/EgtDev/Include/EgtILogger.h" #include "/EgtDev/Include/EGnStringUtils.h" #include "/EgtDev/Include/EGkFrame3d.h" @@ -37,7 +38,6 @@ CreateEGrScene( void) Scene::Scene( void) { m_pGeomDB = nullptr ; - m_pLogger = nullptr ; // Context data m_hDC = nullptr ; m_hRC = nullptr ; @@ -62,10 +62,9 @@ Scene::~Scene( void) //---------------------------------------------------------------------------- bool -Scene::Init( IGeomDB* pGeomDB, ILogger* pLogger) +Scene::Init( IGeomDB* pGeomDB) { m_pGeomDB = pGeomDB ; - m_pLogger = pLogger ; return true ; } @@ -113,7 +112,7 @@ Scene::CreateContext( HDC hDC, int nDriver, bool b2Buff, int nColorBits, int nDe WglewInitResult = wglewInit() ; if ( WglewInitResult != GLEW_OK) - LOG_INFO( m_pLogger, "WGLEW is not initialized !") + LOG_INFO( GetEGrLogger(), "WGLEW is not initialized !") int attribs[10] ; if ( nDriver == OD_SOFT) { @@ -147,7 +146,7 @@ Scene::CreateContext( HDC hDC, int nDriver, bool b2Buff, int nColorBits, int nDe 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 ; - LOG_INFO( m_pLogger, "WGL_ARB_create_context missing !") + LOG_INFO( GetEGrLogger(), "WGL_ARB_create_context missing !") } // verifico validità Rendering Context @@ -159,12 +158,12 @@ Scene::CreateContext( HDC hDC, int nDriver, bool b2Buff, int nColorBits, int nDe GlewInitResult = glewInit() ; if ( GlewInitResult != GLEW_OK) - LOG_INFO( m_pLogger, "GLEW is not initialized !") + LOG_INFO( GetEGrLogger(), "GLEW is not initialized !") // verifico se posso lavorare in modalità nuova m_bNewWay = ( nDriver == OD_NEW && glewIsSupported( "GL_VERSION_3_0") == 1) ; if ( ! m_bNewWay) - LOG_INFO( m_pLogger, "OpenGL old way rendering !") + LOG_INFO( GetEGrLogger(), "OpenGL old way rendering !") // reset stato di errore di OpenGL glGetError() ; @@ -310,14 +309,26 @@ Scene::GetPixelFormatInfo( void) return sInfo ; } +//---------------------------------------------------------------------------- +bool +Scene::RedrawWindow( void) +{ + HWND hWnd = ::WindowFromDC( m_hDC) ; + if ( hWnd == nullptr) + return false ; + + return ( ::RedrawWindow( hWnd, nullptr, nullptr, RDW_INVALIDATE | RDW_UPDATENOW) != 0) ; +} + //---------------------------------------------------------------------------- bool Scene::SetExtension( const BBox3d& b3Ext) { if ( b3Ext.IsEmpty()) - return false ; - - m_b3ExtWorld = b3Ext ; + m_b3ExtWorld.Set( -MIN_EXTENSION, -MIN_EXTENSION, -MIN_EXTENSION, + MIN_EXTENSION, MIN_EXTENSION, MIN_EXTENSION) ; + else + m_b3ExtWorld = b3Ext ; m_bExtViewOk = false ; return true ; } @@ -387,7 +398,7 @@ Scene::AdjustDimView( double dHalfWidth, double dHalfHeight) GLenum nErr = glGetError() ; if ( nErr != GL_NO_ERROR) { string sOut = "First glViewport OpenGL error " + ToString( (int)nErr) ; - LOG_INFO( m_pLogger, sOut.c_str()) + LOG_INFO( GetEGrLogger(), sOut.c_str()) } } @@ -444,7 +455,7 @@ Scene::Reshape( int nW, int nH) GLenum nErr = glGetError() ; if ( nErr != GL_NO_ERROR) { string sOut = "Reshape OpenGL error " + ToString( (int)nErr) ; - LOG_INFO( m_pLogger, sOut.c_str()) + LOG_INFO( GetEGrLogger(), sOut.c_str()) } // aggiorno @@ -485,7 +496,7 @@ Scene::Prepare( void) GLenum nErr = glGetError() ; if ( nErr != GL_NO_ERROR) { string sOut = "Prepare OpenGL error " + ToString( (int)nErr) ; - LOG_INFO( m_pLogger, sOut.c_str()) + LOG_INFO( GetEGrLogger(), sOut.c_str()) } return true ; @@ -512,12 +523,12 @@ Scene::Draw( void) GLenum nErr = glGetError() ; if ( nErr != GL_NO_ERROR) { string sOut = "Draw OpenGL error " + ToString( (int)nErr) ; - LOG_INFO( m_pLogger, sOut.c_str()) + LOG_INFO( GetEGrLogger(), sOut.c_str()) } // scambio i buffer back e front ( eseguita solo se previsti) if ( ! SwapBuffers( m_hDC)) - LOG_INFO( m_pLogger, "Draw SwapBuffers error") + LOG_INFO( GetEGrLogger(), "Draw SwapBuffers error") return true ; } diff --git a/SceneCamera.cpp b/SceneCamera.cpp index a22b57c..8329f36 100644 --- a/SceneCamera.cpp +++ b/SceneCamera.cpp @@ -43,74 +43,72 @@ Scene::SetCamera( double dAngVertDeg, double dAngOrizzDeg, double dDist) { // assegno la direzione e la distanza m_vtDirCamera.FromSpherical( 1, dAngVertDeg, dAngOrizzDeg) ; - if ( dDist < EPS_SMALL) - m_dDistCamera = STD_DIST_CAMERA ; - else - m_dDistCamera = __max( dDist, MIN_DIST_CAMERA) ; - // invalido Up e ExtView - m_bUpOk = false ; - m_bExtViewOk = false ; - // calcolo nuovi dati di Z clipping - CalcClippingPlanesFromExtView() ; - return true ; + m_dDistCamera = dDist ; + return VerifyCamera() ; } //---------------------------------------------------------------------------- bool Scene::SetCamera( int nDir, double dDist) { - const double ANG_VERT_ISOVIEW = 54.73561032 ; - double dAngVertDeg ; - double dAngOrizzDeg ; - - switch ( nDir) { case CT_TOP : - dAngVertDeg = 0 ; - dAngOrizzDeg = 0 ; + m_vtDirCamera.Set( 0, 0, 1) ; break ; case CT_FRONT : - dAngVertDeg = 90 ; - dAngOrizzDeg = -90 ; + m_vtDirCamera.Set( 0, -1, 0) ; break ; case CT_RIGHT : - dAngVertDeg = 90 ; - dAngOrizzDeg = 0 ; + m_vtDirCamera.Set( 1, 0, 0) ; break ; case CT_BACK : - dAngVertDeg = 90 ; - dAngOrizzDeg = 90 ; + m_vtDirCamera.Set( 0, 1, 0) ; break ; case CT_LEFT : - dAngVertDeg = 90 ; - dAngOrizzDeg = 180 ; + m_vtDirCamera.Set( -1, 0, 0) ; break ; case CT_BOTTOM : - dAngVertDeg = 180 ; - dAngOrizzDeg = 0 ; + m_vtDirCamera.Set( 0, 0, -1) ; break ; case CT_ISO_SW : - dAngVertDeg = ANG_VERT_ISOVIEW ; - dAngOrizzDeg = -135 ; + m_vtDirCamera.Set( - SQRT1_3, - SQRT1_3, SQRT1_3) ; break ; case CT_ISO_SE : - dAngVertDeg = ANG_VERT_ISOVIEW ; - dAngOrizzDeg = -45 ; + m_vtDirCamera.Set( SQRT1_3, - SQRT1_3, SQRT1_3) ; break ; case CT_ISO_NE : - dAngVertDeg = ANG_VERT_ISOVIEW ; - dAngOrizzDeg = 45 ; + m_vtDirCamera.Set( SQRT1_3, SQRT1_3, SQRT1_3) ; break ; case CT_ISO_NW : - dAngVertDeg = ANG_VERT_ISOVIEW ; - dAngOrizzDeg = 135 ; + m_vtDirCamera.Set( - SQRT1_3, SQRT1_3, SQRT1_3) ; break ; default : return false ; break ; } + m_dDistCamera = dDist ; - return SetCamera( dAngVertDeg, dAngOrizzDeg, dDist) ; + return VerifyCamera() ; +} + +//---------------------------------------------------------------------------- +bool +Scene::VerifyCamera( void) +{ + // verifico il versore + if ( ! m_vtDirCamera.Normalize()) + m_vtDirCamera.Set( 0, 0, 1) ; + // verifico la distanza + if ( m_dDistCamera < EPS_SMALL) + m_dDistCamera = STD_DIST_CAMERA ; + else + m_dDistCamera = __max( m_dDistCamera, MIN_DIST_CAMERA) ; + // invalido Up e ExtView + m_bUpOk = false ; + m_bExtViewOk = false ; + // calcolo nuovi dati di Z clipping + CalcClippingPlanesFromExtView() ; + return true ; } //---------------------------------------------------------------------------- diff --git a/SceneGeom.cpp b/SceneGeom.cpp index b5cad4a..63dca22 100644 --- a/SceneGeom.cpp +++ b/SceneGeom.cpp @@ -71,7 +71,7 @@ bool Scene::UpdateExtension( void) { BBox3d b3Ext ; - if ( ! m_pGeomDB->GetLocalBBox( GDB_ID_ROOT, b3Ext)) + if ( m_pGeomDB == nullptr || ! m_pGeomDB->GetLocalBBox( GDB_ID_ROOT, b3Ext)) return false ; return SetExtension( b3Ext) ; }