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