diff --git a/EGrScene.h b/EGrScene.h index a072c87..d732b7d 100644 --- a/EGrScene.h +++ b/EGrScene.h @@ -31,7 +31,9 @@ class EGrScene enum OglDriver { OD_SOFT = 1, OD_OLD = 2, OD_NEW = 3} ; enum CameraDir { CT_NONE = 0, CT_TOP = 1, CT_FRONT = 2, CT_RIGHT = 3, CT_BACK = 4, CT_LEFT = 5, CT_BOTTOM = 6, CT_ISO_SW = 7, CT_ISO_SE = 8, CT_ISO_NE = 9, CT_ISO_NW = 10} ; - public: + + public : + // Basic EGrScene( void); virtual ~EGrScene( void); bool Init( ILogger* pLogger) ; @@ -42,39 +44,45 @@ class EGrScene std::string GetGLSLInfo( void) ; std::string GetPixelFormatInfo( void) ; bool Reshape( int nW, int nH) ; + bool SetExtension( const BBox3d& b3Ext) ; + bool Prepare( void) ; bool Draw( void) ; + bool Project( const Point3d& ptWorld, Point3d& ptView) ; + bool UnProject( const Point3d& ptView, Point3d& ptWorld) ; void Destroy( void) ; - + // Camera bool SetCenter( const Point3d& ptCenter) ; bool SetCamera( double dAngVertDeg, double dAngOrizzDeg, double dDist) ; bool SetCamera( int nDir, double dDist = 0) ; const Point3d& GetCenter( void) { return m_ptCenter ; } + Point3d GetProjectedCenter( void) ; void GetCamera( double* pdAngVertDeg, double* pdAngOrizzDeg, double* pdDist = nullptr) ; int GetCameraDir( void) ; - - bool SetExtension( const BBox3d& b3Ext) ; + bool PanCamera( const Point3d& ptWinOld, const Point3d& ptWinNew) ; + bool RotateCamera( const Point3d& ptWinOld, const Point3d& ptWinNew) ; bool ZoomAll( void) ; bool ZoomChange( double dCoeff) ; - + bool ZoomOnPoint( const Point3d& ptWin, double dCoeff) ; + // Geometry void SetData( int nType) ; void ResetData( void) ; private : + // Basic int ChooseGenPixelFormat( int nPfd, bool b2Buff, int nColorBits, int nDepthBits) ; bool MakeCurrent( void) ; GLEWContext* glewGetContext( void) { return &m_glewc ; } WGLEWContext* wglewGetContext( void) { return &m_wglewc ; } - - bool CalcDirUp( void) ; bool CalcExtView( void) ; bool CalcDimViewFromExtView( void) ; bool AdjustDimView( double dHalfWidth, double dHalfHeight) ; bool CalcClippingPlanesFromExtView( void) ; - bool Prepare( void) ; - + // Camera + bool CalcDirUp( void) ; + // Geometry void SetTriangle( void) ; void SetSquare( void) ; void SetCube( void) ; diff --git a/EGrScene.cpp b/EGrSceneBasic.cpp similarity index 50% rename from EGrScene.cpp rename to EGrSceneBasic.cpp index ac627fa..f47ff84 100644 --- a/EGrScene.cpp +++ b/EGrSceneBasic.cpp @@ -1,7 +1,7 @@ //---------------------------------------------------------------------------- // EgalTech 2013-2014 //---------------------------------------------------------------------------- -// File : Scene.cpp Data : 03.02.14 Versione : 1.5b1 +// File : EgrScene.cpp Data : 03.02.14 Versione : 1.5b1 // Contenuto : Implementazione della classe gestione scena. // // @@ -21,8 +21,6 @@ using namespace std ; //--------------------------- Constants -------------------------------------- -static const double MIN_DIST_CAMERA = 10 ; -static const double STD_DIST_CAMERA = 1000 ; static const double MIN_EXTENSION = 50 ; @@ -303,156 +301,6 @@ EGrScene::GetPixelFormatInfo( void) return sInfo ; } -//---------------------------------------------------------------------------- -bool -EGrScene::SetCenter( const Point3d& ptCenter) -{ - // assegno il punto - m_ptCenter = ptCenter ; - // invalido ExtView - m_bExtViewOk = false ; - // calcolo nuovi dati di Z clipping - CalcClippingPlanesFromExtView() ; - return true ; -} - -//---------------------------------------------------------------------------- -bool -EGrScene::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 ; -} - -//---------------------------------------------------------------------------- -bool -EGrScene::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 ; - break ; - case CT_FRONT : - dAngVertDeg = 90 ; - dAngOrizzDeg = -90 ; - break ; - case CT_RIGHT : - dAngVertDeg = 90 ; - dAngOrizzDeg = 0 ; - break ; - case CT_BACK : - dAngVertDeg = 90 ; - dAngOrizzDeg = 90 ; - break ; - case CT_LEFT : - dAngVertDeg = 90 ; - dAngOrizzDeg = 180 ; - break ; - case CT_BOTTOM : - dAngVertDeg = 180 ; - dAngOrizzDeg = 0 ; - break ; - case CT_ISO_SW : - dAngVertDeg = ANG_VERT_ISOVIEW ; - dAngOrizzDeg = -135 ; - break ; - case CT_ISO_SE : - dAngVertDeg = ANG_VERT_ISOVIEW ; - dAngOrizzDeg = -45 ; - break ; - case CT_ISO_NE : - dAngVertDeg = ANG_VERT_ISOVIEW ; - dAngOrizzDeg = 45 ; - break ; - case CT_ISO_NW : - dAngVertDeg = ANG_VERT_ISOVIEW ; - dAngOrizzDeg = 135 ; - break ; - default : - return false ; - break ; - } - - return SetCamera( dAngVertDeg, dAngOrizzDeg, dDist) ; -} - -//---------------------------------------------------------------------------- -void -EGrScene::GetCamera( double* pdAngVertDeg, double* pdAngOrizzDeg, double* pdDist) -{ - m_vtDirCamera.ToSpherical( nullptr, pdAngVertDeg, pdAngOrizzDeg) ; - if ( pdDist != nullptr) - *pdDist = m_dDistCamera ; -} - -//---------------------------------------------------------------------------- -int -EGrScene::GetCameraDir( void) -{ - if ( m_vtDirCamera.IsZplus()) - return CT_TOP ; - else if ( m_vtDirCamera.IsYminus()) - return CT_FRONT ; - else if ( m_vtDirCamera.IsXplus()) - return CT_RIGHT ; - else if ( m_vtDirCamera.IsYplus()) - return CT_BACK ; - else if ( m_vtDirCamera.IsXminus()) - return CT_LEFT ; - else if ( m_vtDirCamera.IsZminus()) - return CT_BOTTOM ; - else if ( AreSameVectorNear( m_vtDirCamera, Vector3d( SQRT1_3, - SQRT1_3, - SQRT1_3))) - return CT_ISO_SW ; - else if ( AreSameVectorNear( m_vtDirCamera, Vector3d( SQRT1_3, SQRT1_3, - SQRT1_3))) - return CT_ISO_SE ; - else if ( AreSameVectorNear( m_vtDirCamera, Vector3d( SQRT1_3, SQRT1_3, SQRT1_3))) - return CT_ISO_NE ; - else if ( AreSameVectorNear( m_vtDirCamera, Vector3d( SQRT1_3, - SQRT1_3, SQRT1_3))) - return CT_ISO_NW ; - else - return CT_NONE ; -} - -//---------------------------------------------------------------------------- -bool -EGrScene::CalcDirUp( void) -{ - // verifico se il calcolo è necessario - if ( m_bUpOk) - return true ; - // direzione perpendicolare giacente nel piano XY - // ( m_vtDirCamera è opposta alla direzione in cui si guarda) - Vector3d vtPerpXY = m_vtDirCamera ^ Z_AX ; - if ( ! vtPerpXY.Normalize()) { - if ( m_vtDirCamera.z < 0) - vtPerpXY = X_AX ; - else - vtPerpXY = - X_AX ; - } - // direzione Up - m_vtUp = vtPerpXY ^ m_vtDirCamera ; - m_bUpOk = m_vtUp.Normalize() ; - // invalido ExtView - m_bExtViewOk = false ; - return m_bUpOk ; -} - //---------------------------------------------------------------------------- bool EGrScene::SetExtension( const BBox3d& b3Ext) @@ -489,43 +337,6 @@ EGrScene::CalcExtView( void) return m_bExtViewOk ; } -//---------------------------------------------------------------------------- -bool -EGrScene::ZoomAll( void) -{ - // traslo il centro di vista nel centro del box - Point3d ptExtCent ; - if ( ! m_b3ExtWorld.GetCenter( ptExtCent)) - return false ; - m_ptCenter = ptExtCent ; - m_bExtViewOk = false ; - - // calcolo nuovi dati di ingombro - CalcDimViewFromExtView() ; - CalcClippingPlanesFromExtView() ; - - return true ; -} - -//---------------------------------------------------------------------------- -bool -EGrScene::ZoomChange( double dCoeff) -{ - const double MIN_COEFF = 0.5 ; - const double MAX_COEFF = 2 ; - - // controllo i limiti - if ( dCoeff < MIN_COEFF) - dCoeff = MIN_COEFF ; - else if ( dCoeff > MAX_COEFF) - dCoeff = MAX_COEFF ; - // cambio le dimensioni di zoom - m_dHalfWidth *= dCoeff ; - m_dHalfHeight *= dCoeff ; - - return true ; -} - //---------------------------------------------------------------------------- bool EGrScene::CalcDimViewFromExtView( void) @@ -611,7 +422,7 @@ bool EGrScene::Reshape( int nW, int nH) { if ( ! MakeCurrent()) - return true ; + return false ; // assegno le dimensioni della vista m_nViewportW = nW ; @@ -719,6 +530,57 @@ EGrScene::Draw( void) return true ; } +/*------------------------------------------------------------------------------------------*/ +bool +EGrScene::Project( const Point3d& ptWorld, Point3d& ptView) +{ + if ( ! MakeCurrent()) + return false ; + + // recupero le matrici + GLdouble ModelView[ 16] ; + glGetDoublev( GL_MODELVIEW_MATRIX, ModelView) ; + GLdouble Projection[ 16] ; + glGetDoublev( GL_PROJECTION_MATRIX, Projection) ; + GLint Viewport[ 4] ; + glGetIntegerv( GL_VIEWPORT, Viewport) ; + + // eseguo la proiezione + // l'asse y della vista OpenGL va in alto con l'origine in basso, + // quello di Windows va in basso con l'origine in alto + int nRes =gluProject( ptWorld.x, ptWorld.y, ptWorld.z, + ModelView, Projection, Viewport, + &ptView.x, &ptView.y, &ptView.z) ; + ptView.y = (double) Viewport[3] - ptView.y ; + + return ( nRes == GL_TRUE) ; +} + +/*------------------------------------------------------------------------------------------*/ +bool +EGrScene::UnProject( const Point3d& ptView, Point3d& ptWorld) +{ + if ( ! MakeCurrent()) + return false ; + + // recupero le matrici + GLdouble ModelView[ 16] ; + glGetDoublev( GL_MODELVIEW_MATRIX, ModelView) ; + GLdouble Projection[ 16] ; + glGetDoublev( GL_PROJECTION_MATRIX, Projection) ; + GLint Viewport[ 4] ; + glGetIntegerv( GL_VIEWPORT, Viewport) ; + + // eseguo la contro proiezione + // l'asse y della vista OpenGL va in alto con l'origine in basso, + // quello di Windows va in basso con l'origine in alto + int nRes = gluUnProject( ptView.x, ((double) Viewport[3] - ptView.y), ptView.z, + ModelView, Projection, Viewport, + &ptWorld.x, &ptWorld.y, &ptWorld.z) ; + + return ( nRes == GL_TRUE) ; +} + //---------------------------------------------------------------------------- void EGrScene::Destroy( void) @@ -729,254 +591,3 @@ EGrScene::Destroy( void) m_hRC = nullptr ; } } - -//---------------------------------------------------------------------------- -void -EGrScene::SetData( int nType) -{ - const int SQUARE = 1 ; - const int CUBE = 2 ; - const int TRIANGLE = 3 ; - - switch ( nType) { - case SQUARE : - SetSquare() ; - break; - case CUBE : - SetCube() ; - break; - case TRIANGLE : - default : - SetTriangle() ; - break; - } -} - -//---------------------------------------------------------------------------- -void -EGrScene::SetSquare( void) -{ - if ( ! MakeCurrent()) - return ; - - // vertici - Vert3f Point[4] ; - 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 ; - for ( int i = 0 ; i < 4 ; ++ i) - b3Ext.Add( Point[i].x, Point[i].y, Point[i].z) ; - SetExtension( b3Ext) ; - - 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) - return ; - // First VAO setup - glBindVertexArray( m_vaoID[0]) ; - glGenBuffers( 1, &m_vboID[0]) ; - glBindBuffer( GL_ARRAY_BUFFER, m_vboID[0]) ; - m_nMode[0] = GL_LINE_STRIP ; - m_nCount[0] = 5 ; - 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) ; - } - else { - - } -} - -//---------------------------------------------------------------------------- -void -EGrScene::SetCube( void) -{ - if ( ! MakeCurrent()) - return ; - - // vertici - Vert3f Point[8] ; - 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 ; - for ( int i = 0 ; i < 8 ; ++ i) - b3Ext.Add( Point[i].x, Point[i].y, Point[i].z) ; - SetExtension( b3Ext) ; - - 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) - return ; - // First VAO setup - glBindVertexArray( m_vaoID[0]) ; - glGenBuffers( 1, &m_vboID[0]) ; - glBindBuffer( GL_ARRAY_BUFFER, m_vboID[0]) ; - m_nMode[0] = GL_LINE_STRIP ; - m_nCount[0] = 5 ; - 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) ; - // Second VAO setup - glBindVertexArray( m_vaoID[1]) ; - glGenBuffers( 1, &m_vboID[1]) ; - glBindBuffer( GL_ARRAY_BUFFER, m_vboID[1]) ; - m_nMode[1] = GL_LINE_STRIP ; - m_nCount[1] = 5 ; - 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) ; - // Third VAO setup - glBindVertexArray( m_vaoID[2]) ; - glGenBuffers( 1, &m_vboID[2]) ; - glBindBuffer( GL_ARRAY_BUFFER, m_vboID[2]) ; - m_nMode[2] = GL_LINES ; - m_nCount[2] = 8 ; - 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) ; - } -} - -//---------------------------------------------------------------------------- -void -EGrScene::SetTriangle( void) -{ - if ( ! MakeCurrent()) - return ; - - // vertici - Vert3f Point[6] ; - 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 ; - for ( int i = 0 ; i < 6 ; ++ i) - b3Ext.Add( Point[i].x, Point[i].y, Point[i].z) ; - SetExtension( b3Ext) ; - - 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 * 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) ; - // Second VAO setup - glBindVertexArray( m_vaoID[1]) ; - glGenBuffers( 1, &m_vboID[1]) ; //VBO allocation - glBindBuffer( GL_ARRAY_BUFFER, m_vboID[1]) ; - m_nMode[1] = GL_LINE_STRIP ; - m_nCount[1] = 4 ; - 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) { - 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/EGrSceneCamera.cpp b/EGrSceneCamera.cpp new file mode 100644 index 0000000..6fbe1e6 --- /dev/null +++ b/EGrSceneCamera.cpp @@ -0,0 +1,295 @@ +//---------------------------------------------------------------------------- +// EgalTech 2013-2014 +//---------------------------------------------------------------------------- +// File : EgrSceneCamera.cpp Data : 10.02.14 Versione : 1.5b1 +// Contenuto : Implementazione della gestione camera della classe scena. +// +// +// +// Modifiche : 10.02.14 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "EGrScene.h" +#include "/EgtDev/Include/EgtILogger.h" +#include "/EgtDev/Include/EGnStringUtils.h" +#include "/EgtDev/Include/EGkFrame3d.h" + +using namespace std ; + +//--------------------------- Constants -------------------------------------- +static const double MIN_DIST_CAMERA = 10 ; +static const double STD_DIST_CAMERA = 1000 ; + +//---------------------------------------------------------------------------- +bool +EGrScene::SetCenter( const Point3d& ptCenter) +{ + // assegno il punto + m_ptCenter = ptCenter ; + // invalido ExtView + m_bExtViewOk = false ; + // calcolo nuovi dati di Z clipping + CalcClippingPlanesFromExtView() ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +EGrScene::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 ; +} + +//---------------------------------------------------------------------------- +bool +EGrScene::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 ; + break ; + case CT_FRONT : + dAngVertDeg = 90 ; + dAngOrizzDeg = -90 ; + break ; + case CT_RIGHT : + dAngVertDeg = 90 ; + dAngOrizzDeg = 0 ; + break ; + case CT_BACK : + dAngVertDeg = 90 ; + dAngOrizzDeg = 90 ; + break ; + case CT_LEFT : + dAngVertDeg = 90 ; + dAngOrizzDeg = 180 ; + break ; + case CT_BOTTOM : + dAngVertDeg = 180 ; + dAngOrizzDeg = 0 ; + break ; + case CT_ISO_SW : + dAngVertDeg = ANG_VERT_ISOVIEW ; + dAngOrizzDeg = -135 ; + break ; + case CT_ISO_SE : + dAngVertDeg = ANG_VERT_ISOVIEW ; + dAngOrizzDeg = -45 ; + break ; + case CT_ISO_NE : + dAngVertDeg = ANG_VERT_ISOVIEW ; + dAngOrizzDeg = 45 ; + break ; + case CT_ISO_NW : + dAngVertDeg = ANG_VERT_ISOVIEW ; + dAngOrizzDeg = 135 ; + break ; + default : + return false ; + break ; + } + + return SetCamera( dAngVertDeg, dAngOrizzDeg, dDist) ; +} + +//---------------------------------------------------------------------------- +void +EGrScene::GetCamera( double* pdAngVertDeg, double* pdAngOrizzDeg, double* pdDist) +{ + double dAngVertDeg ; + double dAngOrizzDeg ; + m_vtDirCamera.ToSpherical( nullptr, &dAngVertDeg, &dAngOrizzDeg) ; + if ( fabs( dAngVertDeg) < EPS_ANG_SMALL) + dAngOrizzDeg = -90 ; + if ( pdAngVertDeg != nullptr) + *pdAngVertDeg = dAngVertDeg ; + if ( pdAngOrizzDeg != nullptr) + *pdAngOrizzDeg = dAngOrizzDeg ; + if ( pdDist != nullptr) + *pdDist = m_dDistCamera ; +} + +//---------------------------------------------------------------------------- +int +EGrScene::GetCameraDir( void) +{ + if ( m_vtDirCamera.IsZplus()) + return CT_TOP ; + else if ( m_vtDirCamera.IsYminus()) + return CT_FRONT ; + else if ( m_vtDirCamera.IsXplus()) + return CT_RIGHT ; + else if ( m_vtDirCamera.IsYplus()) + return CT_BACK ; + else if ( m_vtDirCamera.IsXminus()) + return CT_LEFT ; + else if ( m_vtDirCamera.IsZminus()) + return CT_BOTTOM ; + else if ( AreSameVectorNear( m_vtDirCamera, Vector3d( SQRT1_3, - SQRT1_3, - SQRT1_3))) + return CT_ISO_SW ; + else if ( AreSameVectorNear( m_vtDirCamera, Vector3d( SQRT1_3, SQRT1_3, - SQRT1_3))) + return CT_ISO_SE ; + else if ( AreSameVectorNear( m_vtDirCamera, Vector3d( SQRT1_3, SQRT1_3, SQRT1_3))) + return CT_ISO_NE ; + else if ( AreSameVectorNear( m_vtDirCamera, Vector3d( SQRT1_3, - SQRT1_3, SQRT1_3))) + return CT_ISO_NW ; + else + return CT_NONE ; +} + +//---------------------------------------------------------------------------- +Point3d +EGrScene::GetProjectedCenter( void) +{ + Point3d ptVCen ; + if ( ! Project( m_ptCenter, ptVCen)) + ptVCen.Set( 0, 0, 0) ; + + return ptVCen ; +} + +//---------------------------------------------------------------------------- +bool +EGrScene::CalcDirUp( void) +{ + // verifico se il calcolo è necessario + if ( m_bUpOk) + return true ; + // direzione perpendicolare giacente nel piano XY + // ( m_vtDirCamera è opposta alla direzione in cui si guarda) + Vector3d vtPerpXY = m_vtDirCamera ^ Z_AX ; + if ( ! vtPerpXY.Normalize()) { + if ( m_vtDirCamera.z < 0) + vtPerpXY = X_AX ; + else + vtPerpXY = - X_AX ; + } + // direzione Up + m_vtUp = vtPerpXY ^ m_vtDirCamera ; + m_bUpOk = m_vtUp.Normalize() ; + // invalido ExtView + m_bExtViewOk = false ; + return m_bUpOk ; +} + +//---------------------------------------------------------------------------- +bool +EGrScene::PanCamera( const Point3d& ptWinOld, const Point3d& ptWinNew) +{ + // porto i due punti in coordinate mondo + double dZCenter = GetProjectedCenter().z ; + Point3d ptViewOld( ptWinOld.x, ptWinOld.y, dZCenter) ; + Point3d ptWorldOld ; + if ( ! UnProject( ptViewOld, ptWorldOld)) + return false ; + Point3d ptViewNew( ptWinNew.x, ptWinNew.y, dZCenter) ; + Point3d ptWorldNew ; + if ( ! UnProject( ptViewNew, ptWorldNew)) + return false ; + // calcolo lo spostamento tra i due punti + Vector3d vtMove = ptWorldNew - ptWorldOld ; + // applico questo spostamento al centro di vista + return SetCenter( GetCenter() - vtMove) ; +} + +//---------------------------------------------------------------------------- +bool +EGrScene::RotateCamera( const Point3d& ptWinOld, const Point3d& ptWinNew) +{ + const double MIN_ANG_VERT = 0.1 ; + const double MAX_ANG_VERT = 179.9 ; + + // angoli correnti della camera + double dAngVertDeg ; + double dAngOrizzDeg ; + GetCamera( &dAngVertDeg, &dAngOrizzDeg) ; + + // incrementi + double dDeltaAngVertDeg = ( ptWinNew.y - ptWinOld.y) / m_nViewportH * 360 ; + double dDeltaAngOrizzDeg = ( ptWinNew.x - ptWinOld.x) / m_nViewportW * 360 ; + + // calcolo nuovi angoli e limitazione dell'angolo verticale + dAngVertDeg -= dDeltaAngVertDeg ; + if ( dAngVertDeg < MIN_ANG_VERT) + dAngVertDeg = MIN_ANG_VERT ; + else if ( dAngVertDeg > MAX_ANG_VERT) + dAngVertDeg = MAX_ANG_VERT ; + dAngOrizzDeg -= dDeltaAngOrizzDeg ; + + // imposto nuova direzione camera + return SetCamera( dAngVertDeg, dAngOrizzDeg, 0) ; +} + +//---------------------------------------------------------------------------- +bool +EGrScene::ZoomAll( void) +{ + // traslo il centro di vista nel centro del box + Point3d ptExtCent ; + if ( ! m_b3ExtWorld.GetCenter( ptExtCent)) + return false ; + m_ptCenter = ptExtCent ; + m_bExtViewOk = false ; + + // calcolo nuovi dati di ingombro + CalcDimViewFromExtView() ; + CalcClippingPlanesFromExtView() ; + + return true ; +} + +//---------------------------------------------------------------------------- +bool +EGrScene::ZoomChange( double dCoeff) +{ + const double MIN_COEFF = 0.5 ; + const double MAX_COEFF = 2 ; + + // controllo i limiti + if ( dCoeff < MIN_COEFF) + dCoeff = MIN_COEFF ; + else if ( dCoeff > MAX_COEFF) + dCoeff = MAX_COEFF ; + // cambio le dimensioni di zoom + m_dHalfWidth *= dCoeff ; + m_dHalfHeight *= dCoeff ; + + return true ; +} + +//---------------------------------------------------------------------------- +bool +EGrScene::ZoomOnPoint( const Point3d& ptWin, double dCoeff) +{ + // porto il punto in coordinate mondo + Point3d ptView( ptWin.x, ptWin.y, GetProjectedCenter().z) ; + Point3d ptWorld ; + if ( ! UnProject( ptView, ptWorld)) + return false ; + // modifico opportunamente il centro di vista + Point3d ptNewCen = ptWorld + ( GetCenter() - ptWorld) * dCoeff ; + SetCenter( ptNewCen) ; + // eseguo lo zoom + return ZoomChange( dCoeff) ; +} diff --git a/EGrSceneGeom.cpp b/EGrSceneGeom.cpp new file mode 100644 index 0000000..b3129ad --- /dev/null +++ b/EGrSceneGeom.cpp @@ -0,0 +1,272 @@ +//---------------------------------------------------------------------------- +// EgalTech 2013-2014 +//---------------------------------------------------------------------------- +// File : EgrSceneGeom.cpp Data : 10.02.14 Versione : 1.5b1 +// Contenuto : Implementazione della gestione geometria della classe scena. +// +// +// +// Modifiche : 10.02.14 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "EGrScene.h" +#include "/EgtDev/Include/EgtILogger.h" +#include "/EgtDev/Include/EGnStringUtils.h" +#include "/EgtDev/Include/EGkFrame3d.h" + +using namespace std ; + +//---------------------------------------------------------------------------- +void +EGrScene::SetData( int nType) +{ + const int SQUARE = 1 ; + const int CUBE = 2 ; + const int TRIANGLE = 3 ; + + switch ( nType) { + case SQUARE : + SetSquare() ; + break; + case CUBE : + SetCube() ; + break; + case TRIANGLE : + default : + SetTriangle() ; + break; + } +} + +//---------------------------------------------------------------------------- +void +EGrScene::SetSquare( void) +{ + if ( ! MakeCurrent()) + return ; + + // vertici + Vert3f Point[4] ; + 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 ; + for ( int i = 0 ; i < 4 ; ++ i) + b3Ext.Add( Point[i].x, Point[i].y, Point[i].z) ; + SetExtension( b3Ext) ; + + 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) + return ; + // First VAO setup + glBindVertexArray( m_vaoID[0]) ; + glGenBuffers( 1, &m_vboID[0]) ; + glBindBuffer( GL_ARRAY_BUFFER, m_vboID[0]) ; + m_nMode[0] = GL_LINE_STRIP ; + m_nCount[0] = 5 ; + 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) ; + } + else { + + } +} + +//---------------------------------------------------------------------------- +void +EGrScene::SetCube( void) +{ + if ( ! MakeCurrent()) + return ; + + // vertici + Vert3f Point[8] ; + 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 ; + for ( int i = 0 ; i < 8 ; ++ i) + b3Ext.Add( Point[i].x, Point[i].y, Point[i].z) ; + SetExtension( b3Ext) ; + + 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) + return ; + // First VAO setup + glBindVertexArray( m_vaoID[0]) ; + glGenBuffers( 1, &m_vboID[0]) ; + glBindBuffer( GL_ARRAY_BUFFER, m_vboID[0]) ; + m_nMode[0] = GL_LINE_STRIP ; + m_nCount[0] = 5 ; + 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) ; + // Second VAO setup + glBindVertexArray( m_vaoID[1]) ; + glGenBuffers( 1, &m_vboID[1]) ; + glBindBuffer( GL_ARRAY_BUFFER, m_vboID[1]) ; + m_nMode[1] = GL_LINE_STRIP ; + m_nCount[1] = 5 ; + 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) ; + // Third VAO setup + glBindVertexArray( m_vaoID[2]) ; + glGenBuffers( 1, &m_vboID[2]) ; + glBindBuffer( GL_ARRAY_BUFFER, m_vboID[2]) ; + m_nMode[2] = GL_LINES ; + m_nCount[2] = 8 ; + 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) ; + } +} + +//---------------------------------------------------------------------------- +void +EGrScene::SetTriangle( void) +{ + if ( ! MakeCurrent()) + return ; + + // vertici + Vert3f Point[6] ; + 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 ; + for ( int i = 0 ; i < 6 ; ++ i) + b3Ext.Add( Point[i].x, Point[i].y, Point[i].z) ; + SetExtension( b3Ext) ; + + 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 * 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) ; + // Second VAO setup + glBindVertexArray( m_vaoID[1]) ; + glGenBuffers( 1, &m_vboID[1]) ; //VBO allocation + glBindBuffer( GL_ARRAY_BUFFER, m_vboID[1]) ; + m_nMode[1] = GL_LINE_STRIP ; + m_nCount[1] = 4 ; + 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) { + 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/TestEGr.rc b/TestEGr.rc index a0d4dcf..1c9dc25 100644 Binary files a/TestEGr.rc and b/TestEGr.rc differ diff --git a/TestEGr.vcxproj b/TestEGr.vcxproj index a2d12cd..7ff9df1 100644 --- a/TestEGr.vcxproj +++ b/TestEGr.vcxproj @@ -197,7 +197,9 @@ + + @@ -216,7 +218,9 @@ - + + + Create Create diff --git a/TestEGr.vcxproj.filters b/TestEGr.vcxproj.filters index 2b435f0..65bea75 100644 --- a/TestEGr.vcxproj.filters +++ b/TestEGr.vcxproj.filters @@ -24,6 +24,12 @@ File di risorse + + File di risorse + + + File di risorse + @@ -76,7 +82,13 @@ File di origine - + + File di origine + + + File di origine + + File di origine diff --git a/TestEGrDlg.cpp b/TestEGrDlg.cpp index 18c79cd..f272791 100644 --- a/TestEGrDlg.cpp +++ b/TestEGrDlg.cpp @@ -69,13 +69,6 @@ CTestEGrDlg::CTestEGrDlg( ILogger* pLogger, CWnd* pParent) m_pLogger = pLogger ; } -//---------------------------------------------------------------------------- -void -CTestEGrDlg::DoDataExchange( CDataExchange* pDX) -{ - CDialog::DoDataExchange( pDX) ; -} - //---------------------------------------------------------------------------- BEGIN_MESSAGE_MAP( CTestEGrDlg, CDialog) ON_WM_SYSCOMMAND() @@ -83,9 +76,7 @@ BEGIN_MESSAGE_MAP( CTestEGrDlg, CDialog) ON_WM_QUERYDRAGICON() ON_WM_SIZE() ON_WM_CLOSE() - ON_BN_CLICKED( IDC_ZOOM_ALL, OnZoomAll) - ON_BN_CLICKED( IDC_ZOOM_P, OnZoomPlus) - ON_BN_CLICKED( IDC_ZOOM_M, OnZoomMinus) + ON_CONTROL_RANGE( BN_CLICKED, IDC_ZOOM_ALL, IDC_ZOOM_M, OnZoom) ON_CONTROL_RANGE( BN_CLICKED, IDC_VIEW_TOP, IDC_VIEW_ISO, OnView) ON_BN_CLICKED( IDC_CLOSE, OnClose) END_MESSAGE_MAP() @@ -125,12 +116,22 @@ CTestEGrDlg::OnInitDialog( void) m_nPrevCx = rectClient.right ; m_nPrevCy = rectClient.bottom ; - // visualizzazione scena - StartScene() ; + // salvo le dimensioni della barra di destra e di quella in basso + CRect rectView ; + GetDlgItem( IDC_SCENE)->GetWindowRect( rectView) ; + ScreenToClient( &rectView) ; + m_nSideBarW = rectClient.right - rectView.right ; + m_nBottomBarH = rectClient.bottom - rectView.bottom ; - LOG_INFO( m_pLogger, m_Scene.GetOpenGLInfo().c_str()) - LOG_INFO( m_pLogger, m_Scene.GetGLSLInfo().c_str()) - LOG_INFO( m_pLogger, m_Scene.GetPixelFormatInfo().c_str()) + // recupero i parametri della scena + 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) ; + + // creazione della scena + m_View.Create( this, IDC_SCENE) ; + m_View.StartScene( nDriver, b2Buff, nColorBits, nDepthBits, m_pLogger) ; return TRUE ; // return TRUE unless you set the focus to a control } @@ -171,9 +172,6 @@ CTestEGrDlg::OnPaint( void) else { // ridisegno dialogo CDialog::OnPaint() ; - // ridisegno finestra OpenGL - m_Scene.Draw() ; - m_View.ValidateRgn( NULL) ; } } @@ -188,9 +186,6 @@ CTestEGrDlg::OnQueryDragIcon( void) void CTestEGrDlg::OnSize( UINT nType, int cx, int cy) { - const int SIDEBAR_W = 200 ; - - CDialog::OnSize( nType, cx, cy) ; // se ridotta a icona non si fa alcunché @@ -200,140 +195,133 @@ CTestEGrDlg::OnSize( UINT nType, int cx, int cy) // se cambiata dimensione if ( nType == SIZE_RESTORED || nType == SIZE_MAXIMIZED) { // spostamento bottoni - MoveDlgItem( IDC_ZOOM_ALL, cx, cy) ; - MoveDlgItem( IDC_ZOOM_P, cx, cy) ; - MoveDlgItem( IDC_ZOOM_M, cx, cy) ; - MoveDlgItem( IDC_VIEW_TOP, cx, cy) ; - MoveDlgItem( IDC_VIEW_FRONT, cx, cy) ; - MoveDlgItem( IDC_VIEW_BACK, cx, cy) ; - MoveDlgItem( IDC_VIEW_LEFT, cx, cy) ; - MoveDlgItem( IDC_VIEW_RIGHT, cx, cy) ; - MoveDlgItem( IDC_VIEW_ISO, cx, cy) ; - MoveDlgItem( IDC_CLOSE, cx, cy) ; + MoveDlgItem( IDC_ZOOM_ALL, IP_TR, cx, cy) ; + MoveDlgItem( IDC_ZOOM_P, IP_TR, cx, cy) ; + MoveDlgItem( IDC_ZOOM_M, IP_TR, cx, cy) ; + MoveDlgItem( IDC_VIEW_TOP, IP_TR, cx, cy) ; + MoveDlgItem( IDC_VIEW_FRONT, IP_TR, cx, cy) ; + MoveDlgItem( IDC_VIEW_BACK, IP_TR, cx, cy) ; + MoveDlgItem( IDC_VIEW_LEFT, IP_TR, cx, cy) ; + MoveDlgItem( IDC_VIEW_RIGHT, IP_TR, cx, cy) ; + MoveDlgItem( IDC_VIEW_ISO, IP_TR, cx, cy) ; + MoveDlgItem( IDC_CLOSE, IP_TR, cx, cy) ; + MoveDlgItem( IDC_INFO, IP_BL, cx, cy) ; + ReshapeDlgItem( IDC_INFO, IR_W, cx - m_nSideBarW, 0) ; + MoveDlgItem( IDC_COORD, IP_BR, cx, cy) ; // adattamento finestra - if ( m_Scene.IsValid()) { - int nX = 0 ; - int nY = 0 ; - int nW = cx - nX - SIDEBAR_W ; - int nH = cy - nY ; - m_View.MoveWindow( nX, nY, nW, nH, FALSE) ; - m_Scene.Reshape( nW, nH) ; - } + m_View.Reshape( 0, 0, cx - m_nSideBarW, cy - m_nBottomBarH) ; // salvo la nuova dimensione m_nPrevCx = cx ; m_nPrevCy = cy ; // lancio ridisegno - RedrawWindow() ; + RedrawWindow( NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW) ; } } //---------------------------------------------------------------------------- -void -CTestEGrDlg::MoveDlgItem( int nID, int cx, int cy) +bool +CTestEGrDlg::MoveDlgItem( int nID, int nPos, int cx, int cy) { CWnd* pBtn ; - if ( ( pBtn = GetDlgItem( nID)) != nullptr) { - CRect rect ; - pBtn->GetWindowRect( rect) ; - ScreenToClient( &rect) ; - pBtn->SetWindowPos( NULL, rect.left + cx - m_nPrevCx, rect.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER) ; + if ( ( pBtn = GetDlgItem( nID)) == nullptr) + return false ; + + CRect rect ; + pBtn->GetWindowRect( rect) ; + ScreenToClient( &rect) ; + + int nX ; + int nY ; + switch ( nPos) { + case IP_TR : + nX = rect.left + cx - m_nPrevCx ; + nY = rect.top ; + break ; + default : // IP_TL + nX = rect.left ; + nY = rect.top ; + break ; + case IP_BR : + nX = rect.left + cx - m_nPrevCx ; + nY = rect.top + cy - m_nPrevCy ; + break ; + case IP_BL : + nX = rect.left ; + nY = rect.top + cy - m_nPrevCy ; + break ; } + + return ( pBtn->SetWindowPos( NULL, nX, nY, 0, 0, SWP_NOSIZE | SWP_NOZORDER) != 0) ; +} + +//---------------------------------------------------------------------------- +bool +CTestEGrDlg::ReshapeDlgItem( int nID, int nFlag, int nW, int nH) +{ + CWnd* pBtn ; + if ( ( pBtn = GetDlgItem( nID)) == nullptr) + return false ; + + CRect rect ; + pBtn->GetWindowRect( rect) ; + ScreenToClient( &rect) ; + + int nWu ; + int nHu ; + switch ( nFlag) { + case IR_W : + nWu = nW ; + nHu = rect.Height() ; + break ; + case IR_H : + nWu = rect.Width() ; + nHu = nH ; + break ; + default : // IR_WH + nWu = nW ; + nHu = nH ; + break ; + } + + return ( pBtn->SetWindowPos( NULL, 0, 0, nWu, nHu, SWP_NOMOVE | SWP_NOZORDER) != 0) ; } //---------------------------------------------------------------------------- void CTestEGrDlg::OnClose( void) { - m_Scene.ResetData() ; - m_Scene.Destroy() ; - m_View.DestroyWindow() ; + m_View.Destroy() ; EndDialog( IDCLOSE) ; } //---------------------------------------------------------------------------- void -CTestEGrDlg::OnZoomAll( void) +CTestEGrDlg::OnZoom( UINT nID) { - m_Scene.ZoomAll() ; - RedrawWindow() ; -} - -//---------------------------------------------------------------------------- -void -CTestEGrDlg::OnZoomPlus( void) -{ - m_Scene.ZoomChange( 0.9) ; - RedrawWindow() ; -} - -//---------------------------------------------------------------------------- -void -CTestEGrDlg::OnZoomMinus( void) -{ - m_Scene.ZoomChange( 1.1) ; - RedrawWindow() ; + m_View.Zoom( nID) ; } //---------------------------------------------------------------------------- void CTestEGrDlg::OnView( UINT nID) { - switch ( nID) { - case IDC_VIEW_TOP : - m_Scene.SetCamera( EGrScene::CT_TOP) ; - break ; - case IDC_VIEW_FRONT : - m_Scene.SetCamera( EGrScene::CT_FRONT) ; - break ; - case IDC_VIEW_BACK : - m_Scene.SetCamera( EGrScene::CT_BACK) ; - break ; - case IDC_VIEW_LEFT : - m_Scene.SetCamera( EGrScene::CT_LEFT) ; - break ; - case IDC_VIEW_RIGHT : - m_Scene.SetCamera( EGrScene::CT_RIGHT) ; - break ; - case IDC_VIEW_ISO : - m_Scene.SetCamera( EGrScene::CT_ISO_SW) ; - break ; - default : - return ; - break ; - } - - RedrawWindow() ; + m_View.View( nID) ; } //---------------------------------------------------------------------------- -void -CTestEGrDlg::StartScene( void) +BOOL +CTestEGrDlg::PreTranslateMessage( MSG* pMsg) { - // recupero i parametri - 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) ; - - // se già esistente, devo prima distruggerla - if ( m_Scene.IsValid()) { - m_Scene.Destroy() ; - m_View.DestroyWindow() ; + // se messaggio rotella mouse e non settata cattura + if ( pMsg->message == WM_MOUSEWHEEL && GetCapture() == nullptr) { + // invio il messaggio alla finestra del dialogo su cui si trova il mouse + CPoint ptClient = pMsg->pt ; + ScreenToClient( &ptClient) ; + pMsg->hwnd = ::ChildWindowFromPoint( m_hWnd, ptClient) ; + if ( pMsg->hwnd == nullptr) + return 1 ; } - - // creazione della finestra - m_View.Create( this, IDC_SCENE) ; - - // creazione della scena - m_Scene.Init( m_pLogger) ; - m_Scene.CreateContext( m_View.GetSafeHdc(), nDriver, b2Buff, nColorBits, nDepthBits) ; - - // impostazione dati geometrie - m_Scene.SetData( 3) ; - - // impostazione dati di vista - m_Scene.SetCenter( Point3d( 0, 0, 0)) ; - m_Scene.SetCamera( EGrScene::CT_ISO_SW) ; - m_Scene.ZoomAll() ; + // passo al gestore di default + return CDialog::PreTranslateMessage( pMsg) ; } diff --git a/TestEGrDlg.h b/TestEGrDlg.h index 2a26959..e1287f9 100644 --- a/TestEGrDlg.h +++ b/TestEGrDlg.h @@ -14,7 +14,6 @@ #pragma once #include "TestEgrView.h" -#include "EGrScene.h" class ILogger ; @@ -25,32 +24,33 @@ class CTestEGrDlg : public CDialog public : CTestEGrDlg( ILogger* pLogger = nullptr, CWnd* pParent = nullptr) ; - protected : - virtual void DoDataExchange( CDataExchange* pDX) ; - protected : virtual BOOL OnInitDialog( void) ; + virtual BOOL PreTranslateMessage( MSG* pMsg) ; afx_msg void OnSysCommand( UINT nID, LPARAM lParam) ; afx_msg void OnPaint( void) ; afx_msg HCURSOR OnQueryDragIcon( void) ; afx_msg void OnSize( UINT nType, int cx, int cy) ; - afx_msg void OnZoomAll( void) ; - afx_msg void OnZoomPlus( void) ; - afx_msg void OnZoomMinus( void) ; + afx_msg void OnZoom( UINT nID) ; afx_msg void OnView( UINT nID) ; afx_msg void OnClose( void) ; private : - void MoveDlgItem( int nID, int cx, int cy) ; - void StartScene( void) ; + enum ItemPos { IP_TR = 1, IP_TL, IP_BR, IP_BL} ; + enum ItemReshape { IR_W = 1, IR_H, IR_WH} ; + + private : + bool MoveDlgItem( int nID, int nPos, int cx, int cy) ; + bool ReshapeDlgItem( int nID, int nFlag, int nW, int nH) ; private : HICON m_hIcon ; TestEgrView m_View ; - EGrScene m_Scene ; ILogger* m_pLogger ; int m_nPrevCx ; int m_nPrevCy ; + int m_nSideBarW ; + int m_nBottomBarH ; DECLARE_MESSAGE_MAP() } ; diff --git a/TestEGrView.h b/TestEGrView.h index 5cf9e3c..e4c3129 100644 --- a/TestEGrView.h +++ b/TestEGrView.h @@ -2,6 +2,7 @@ #pragma once +#include "EGrScene.h" #include @@ -12,15 +13,32 @@ class TestEgrView : public CWnd TestEgrView( void) ; ~TestEgrView( void) ; bool Create( CWnd* pParent, int nID) ; - HDC GetSafeHdc( void) - { return ( ( m_pDC != nullptr) ? m_pDC->GetSafeHdc() : nullptr) ; } + bool StartScene( int nDriver, bool b2Buff, int nColorBits, int nDepthBits, ILogger* pLogger) ; + void Destroy( void) ; + bool Reshape( int nX, int nY, int nW, int nH) ; + void Zoom( UINT nID) ; + void View( UINT nID) ; protected : - afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct) ; afx_msg void OnPaint( void) ; + afx_msg void OnMButtonDown( UINT nFlags, CPoint point) ; + afx_msg void OnMButtonUp( UINT nFlags, CPoint point) ; + afx_msg void OnMouseMove( UINT nFlags, CPoint point) ; + afx_msg BOOL OnMouseWheel( UINT nFlags, short zDelta, CPoint point) ; + + private : + HDC GetSafeHdc( void) + { return ( ( m_pDC != nullptr) ? m_pDC->GetSafeHdc() : nullptr) ; } + void ShowCursorCoordinates( const Point3d& ptWin) ; + + private : + enum Status { ST_NULL = 0, ST_PAN, ST_ROT } ; private : CClientDC* m_pDC ; + EGrScene m_Scene ; + Status m_nStatus ; + CPoint m_PrevPoint ; DECLARE_MESSAGE_MAP() } ; \ No newline at end of file diff --git a/TestEgrView.cpp b/TestEgrView.cpp index 5f5f28e..ee7ef1a 100644 --- a/TestEgrView.cpp +++ b/TestEgrView.cpp @@ -15,6 +15,9 @@ #include "stdafx.h" #include "TestEgrView.h" #include "resource.h" +#include "/EgtDev/Include/EgtILogger.h" +#include "/EgtDev/Include/EgnStringUtils.h" +#include "/EgtDev/Include/EgnStringConverter.h" //---------------------------------------------------------------------------- #ifdef _DEBUG @@ -23,13 +26,18 @@ //---------------------------------------------------------------------------- BEGIN_MESSAGE_MAP( TestEgrView, CWnd) - ON_WM_CREATE() + ON_WM_PAINT() + ON_WM_MBUTTONDOWN() + ON_WM_MBUTTONUP() + ON_WM_MOUSEMOVE() + ON_WM_MOUSEWHEEL() END_MESSAGE_MAP() //---------------------------------------------------------------------------- TestEgrView::TestEgrView( void) { m_pDC = nullptr ; + m_nStatus = ST_NULL ; } //---------------------------------------------------------------------------- @@ -49,8 +57,7 @@ TestEgrView::Create( CWnd* pParent, int nID) return false ; CString className = AfxRegisterWndClass( CS_HREDRAW | CS_VREDRAW | CS_OWNDC, - AfxGetApp()->LoadCursor( IDC_POINTER), - (HBRUSH)GetStockObject(WHITE_BRUSH), NULL) ; + NULL, NULL, NULL) ; CRect rectWin ; pParent->GetDlgItem( nID)->GetWindowRect( rectWin) ; @@ -59,6 +66,8 @@ TestEgrView::Create( CWnd* pParent, int nID) if ( CreateEx( 0, className, L"TestEgrView", WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, rectWin, pParent, nID) != 0) { SetWindowPos( &wndTop, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE) ; + m_pDC = new CClientDC( this) ; + SetCursor( AfxGetApp()->LoadCursor( IDC_POINTER)) ; return true ; } else @@ -66,15 +75,223 @@ TestEgrView::Create( CWnd* pParent, int nID) } //---------------------------------------------------------------------------- -int -TestEgrView::OnCreate( LPCREATESTRUCT lpCreateStruct) +bool +TestEgrView::StartScene( int nDriver, bool b2Buff, int nColorBits, int nDepthBits, ILogger* pLogger) { - if ( CWnd::OnCreate( lpCreateStruct) == -1) - return -1 ; - - m_pDC = new CClientDC( this) ; - if ( m_pDC == nullptr) - return -1 ; + // creazione della scena + m_Scene.Init( pLogger) ; + if ( ! m_Scene.CreateContext( GetSafeHdc(), nDriver, b2Buff, nColorBits, nDepthBits)) + return false ; - return 0 ; + // impostazione dati geometrie + m_Scene.SetData( 3) ; + + // impostazione dati di vista + m_Scene.SetCenter( Point3d( 0, 0, 0)) ; + m_Scene.SetCamera( EGrScene::CT_ISO_SW) ; + m_Scene.ZoomAll() ; + + LOG_INFO( pLogger, m_Scene.GetOpenGLInfo().c_str()) + LOG_INFO( pLogger, m_Scene.GetGLSLInfo().c_str()) + LOG_INFO( pLogger, m_Scene.GetPixelFormatInfo().c_str()) + + return true ; +} + +//---------------------------------------------------------------------------- +void +TestEgrView::Destroy( void) +{ + m_Scene.ResetData() ; + m_Scene.Destroy() ; + DestroyWindow() ; +} + +//---------------------------------------------------------------------------- +bool +TestEgrView::Reshape( int nX, int nY, int nW, int nH) +{ + // se non è ancora stata creata, esco subito + if ( m_pDC == nullptr) + return true ; + + MoveWindow( nX, nY, nW, nH, FALSE) ; + m_Scene.Reshape( nW, nH) ; + return true ; +} + +//---------------------------------------------------------------------------- +void +TestEgrView::OnPaint( void) +{ + // ridisegno finestra OpenGL + m_Scene.Draw() ; + ValidateRgn( NULL) ; +} + +//---------------------------------------------------------------------------- +void +TestEgrView::Zoom( UINT nID) +{ + const double COEFF_PLUS = 0.9 ; + const double COEFF_MINUS = 1 / COEFF_PLUS ; + + switch ( nID) { + case IDC_ZOOM_ALL : + m_Scene.ZoomAll() ; + break ; + case IDC_ZOOM_P : + m_Scene.ZoomChange( COEFF_PLUS) ; + break ; + case IDC_ZOOM_M : + m_Scene.ZoomChange( COEFF_MINUS) ; + break ; + default : + return ; + break ; + } + + RedrawWindow() ; +} + +//---------------------------------------------------------------------------- +void +TestEgrView::View( UINT nID) +{ + switch ( nID) { + case IDC_VIEW_TOP : + m_Scene.SetCamera( EGrScene::CT_TOP) ; + break ; + case IDC_VIEW_FRONT : + m_Scene.SetCamera( EGrScene::CT_FRONT) ; + break ; + case IDC_VIEW_BACK : + m_Scene.SetCamera( EGrScene::CT_BACK) ; + break ; + case IDC_VIEW_LEFT : + m_Scene.SetCamera( EGrScene::CT_LEFT) ; + break ; + case IDC_VIEW_RIGHT : + m_Scene.SetCamera( EGrScene::CT_RIGHT) ; + break ; + case IDC_VIEW_ISO : + m_Scene.SetCamera( EGrScene::CT_ISO_SW) ; + break ; + default : + return ; + break ; + } + + RedrawWindow() ; +} + +//---------------------------------------------------------------------------- +void +TestEgrView::OnMButtonDown( UINT nFlags, CPoint point) +{ + if ( nFlags & MK_CONTROL) { + m_nStatus = ST_ROT ; + SetCursor( AfxGetApp()->LoadCursor( IDC_ROTATE)) ; + } + else { + m_nStatus = ST_PAN ; + SetCursor( AfxGetApp()->LoadCursor( IDC_PAN)) ; + } + // salvo il punto di riferimento + m_PrevPoint = point ; +} + +//---------------------------------------------------------------------------- +void +TestEgrView::OnMButtonUp( UINT nFlags, CPoint point) +{ + if ( m_nStatus == ST_ROT || m_nStatus == ST_PAN) { + m_nStatus = ST_NULL ; + SetCursor( AfxGetApp()->LoadCursor( IDC_POINTER)) ; + } +} + +//---------------------------------------------------------------------------- +void +TestEgrView::OnMouseMove( UINT nFlags, CPoint point) +{ + // visualizzo le coordinate del puntatore + ShowCursorCoordinates( Point3d( point.x, point.y)) ; + // se in modalità ROTATE + if ( m_nStatus == ST_ROT && nFlags & MK_MBUTTON) { + SetCursor( AfxGetApp()->LoadCursor( IDC_ROTATE)) ; + // eseguo la rotazione + m_Scene.RotateCamera( Point3d( m_PrevPoint.x, m_PrevPoint.y), Point3d( point.x, point.y)) ; + // aggiorno il disegno + RedrawWindow() ; + // salvo il punto di riferimento + m_PrevPoint = point ; + } + // se in modalità PAN + else if ( m_nStatus == ST_PAN && nFlags & MK_MBUTTON) { + SetCursor( AfxGetApp()->LoadCursor( IDC_PAN)) ; + // eseguo il pan + m_Scene.PanCamera( Point3d( m_PrevPoint.x, m_PrevPoint.y), Point3d( point.x, point.y)) ; + // aggiorno il disegno + RedrawWindow() ; + // salvo il punto di riferimento + m_PrevPoint = point ; + } + // altrimenti reset dello stato e cursore standard + else { + SetCursor( AfxGetApp()->LoadCursor( IDC_POINTER)) ; + m_nStatus = ST_NULL ; + } +} + +//---------------------------------------------------------------------------- +BOOL +TestEgrView::OnMouseWheel( UINT nFlags, short zDelta, CPoint point) +{ + // calcolo coefficiente + double dCoeff = 1 - 0.1 * abs( zDelta) / WHEEL_DELTA ; + if ( zDelta < 0) + dCoeff = 1 / dCoeff ; + + // porto il punto in coordinate client + ScreenToClient( &point) ; + + // eseguo lo zoom sul punto + m_Scene.ZoomOnPoint( Point3d( point.x, point.y), dCoeff) ; + + // aggiorno il disegno + RedrawWindow() ; + + return 0 ; +} + +//---------------------------------------------------------------------------- +void +TestEgrView::ShowCursorCoordinates( const Point3d& ptWin) +{ + // trasformo il punto da coordinate view a coordinate mondo + Point3d ptView( ptWin.x, ptWin.y, m_Scene.GetProjectedCenter().z) ; + Point3d ptWorld ; + if ( ! m_Scene.UnProject( ptView, ptWorld)) + return ; + // visualizzo le coordinate + std::string sCoord ; + switch ( m_Scene.GetCameraDir()) { + case EGrScene::CT_TOP : + case EGrScene::CT_BOTTOM : + sCoord = "X=" + ToString( ptWorld.x, 3) + " Y=" + ToString( ptWorld.y, 3) ; + break ; + case EGrScene::CT_FRONT : + case EGrScene::CT_BACK : + sCoord = "X=" + ToString( ptWorld.x, 3) + " Z=" + ToString( ptWorld.z, 3) ; + break ; + case EGrScene::CT_LEFT : + case EGrScene::CT_RIGHT : + sCoord = "Y=" + ToString( ptWorld.y, 3) + " Z=" + ToString( ptWorld.z, 3) ; + break ; + default : + sCoord = " " ; + break ; + } + GetParent()->GetDlgItem( IDC_COORD)->SetWindowText( stringtoW( sCoord)) ; } diff --git a/res/POINTER.cur b/res/POINTER.cur index cc79e95..6298d96 100644 Binary files a/res/POINTER.cur and b/res/POINTER.cur differ diff --git a/res/Rotate.cur b/res/Rotate.cur new file mode 100644 index 0000000..aa40976 Binary files /dev/null and b/res/Rotate.cur differ diff --git a/res/pan.cur b/res/pan.cur new file mode 100644 index 0000000..3909397 Binary files /dev/null and b/res/pan.cur differ diff --git a/resource.h b/resource.h index 74a18a7..df52e43 100644 Binary files a/resource.h and b/resource.h differ