diff --git a/EgtGraphics.rc b/EgtGraphics.rc index e658069..8caf842 100644 Binary files a/EgtGraphics.rc and b/EgtGraphics.rc differ diff --git a/Scene.h b/Scene.h index b3a22c7..0c8a02e 100644 --- a/Scene.h +++ b/Scene.h @@ -1,7 +1,7 @@ //---------------------------------------------------------------------------- -// EgalTech 2014-2020 +// EgalTech 2014-2024 //---------------------------------------------------------------------------- -// File : Scene.h Data : 02.01.20 Versione : 2.2a1 +// File : Scene.h Data : 09.01.24 Versione : 2.5l7 // Contenuto : Dichiarazione della classe gestione scena. // // @@ -142,6 +142,8 @@ class Scene : public IEGrScene // Grid bool SetGridShow( bool bShowGrid, bool bShowFrame) override ; bool SetGridGeo( double dSnapStep, int nMinLineSstep, int nMajLineSstep, int nExtSstep) override ; + bool SetGridGeoAdv( double dSnapStep, int nMinLineSstep, int nMajLineSstep, + double dXmin, double dXmax, double dYmin, double dYmax) override ; bool SetGridColor( Color colMinLine, Color colMajLine) override ; void GetGridParam( double& dSnapStep, int& nExtStep) const override ; bool GetShowGrid() override ; @@ -204,26 +206,26 @@ class Scene : public IEGrScene int GetOpenGLver( void) { return m_nOglVer ; } // PointSize - LineWidth - double GetPointSize( void) + double GetPointSize( void) const { return m_dPointSize ; } - double GetSelPointSize( void) + double GetSelPointSize( void) const { return m_dSelPointSize ; } - double GetMarkPointSize( void) + double GetMarkPointSize( void) const { return m_dMarkPointSize ; } - double GetLineWidth( void) + double GetLineWidth( void) const { return m_dLineWidth ; } - double GetSelLineWidth( void) + double GetSelLineWidth( void) const { return m_dSelLineWidth ; } - double GetMarkLineWidth( void) + double GetMarkLineWidth( void) const { return m_dMarkLineWidth ; } - double GetGridLineWidth( void) + double GetGridLineWidth( void) const { return m_dGridLineWidth ; } - double GetFrameLineWidth( void) + double GetFrameLineWidth( void) const { return m_dFrameLineWidth ; } // Geometry - Color GetMark( void) + Color GetMark( void) const { return m_colMark ; } - Color GetSelSurf( void) + Color GetSelSurf( void) const { return m_colSelSurf ; } private : @@ -355,6 +357,10 @@ class Scene : public IEGrScene int m_nMinLineSstep ; // interasse tra due linee minori come numero di passi di snap int m_nMajLineSstep ; // interasse tra due linee maggiori come numero di passi di snap int m_nExtSstep ; // estensione della griglia come numero di passi di snap + double m_dGridMinX ; // minima estensione in X della griglia + double m_dGridMaxX ; // massima estensione in X della griglia + double m_dGridMinY ; // minima estensione in Y della griglia + double m_dGridMaxY ; // massima estensione in Y della griglia Color m_colMinLine ; // colore delle linee minori Color m_colMajLine ; // colore delle linee maggiori // Glob Frame diff --git a/SceneBasic.cpp b/SceneBasic.cpp index 10c498b..68f7ccd 100644 --- a/SceneBasic.cpp +++ b/SceneBasic.cpp @@ -32,7 +32,6 @@ static const double MIN_EXTENSION = 250 ; static const double MIN_W_H = 0.01 ; static const double MIN_ZCLIP_EXT = 25000 ; - //---------------------------------------------------------------------------- IEGrScene* CreateEGrScene( void) @@ -98,10 +97,14 @@ Scene::Scene( void) // Grid m_bShowGrid = false ; m_bShowFrame = false ; - m_dSnapStep = 1 ; - m_nMinLineSstep = 10 ; - m_nMajLineSstep = 100 ; - m_nExtSstep = 500 ; + m_dSnapStep = 10 ; + m_nMinLineSstep = 1 ; + m_nMajLineSstep = 10 ; + m_nExtSstep = 100 ; + m_dGridMinX = -INFINITO ; + m_dGridMaxX = INFINITO ; + m_dGridMinY = -INFINITO ; + m_dGridMaxY = INFINITO ; m_colMinLine.Set( 160, 160, 160) ; m_colMajLine.Set( 160, 160, 160) ; // Global Frame diff --git a/SceneGrid.cpp b/SceneGrid.cpp index afa901f..bb5a42b 100644 --- a/SceneGrid.cpp +++ b/SceneGrid.cpp @@ -20,6 +20,9 @@ using namespace std ; +//--------------------------- Constants -------------------------------------- +const double MIN_SNAP_STEP = 0.1 ; + //---------------------------------------------------------------------------- bool Scene::SetGridShow( bool bShowGrid, bool bShowFrame) @@ -33,11 +36,41 @@ Scene::SetGridShow( bool bShowGrid, bool bShowFrame) bool Scene::SetGridGeo( double dSnapStep, int nMinLineSstep, int nMajLineSstep, int nExtSstep) { - const double MIN_SNAP_STEP = 0.1 ; - m_dSnapStep = max( abs( dSnapStep), MIN_SNAP_STEP) ; - m_nMinLineSstep = abs( nMinLineSstep) ; - m_nMajLineSstep = max( abs( nMajLineSstep), m_nMinLineSstep) ; + if ( dSnapStep > 0) + m_dSnapStep = max( dSnapStep, MIN_SNAP_STEP) ; + if ( nMinLineSstep > 0) + m_nMinLineSstep = nMinLineSstep ; + if ( nMajLineSstep > 0) + m_nMajLineSstep = max( nMajLineSstep, m_nMinLineSstep) ; m_nExtSstep = max( abs( nExtSstep), m_nMajLineSstep) ; + m_dGridMinX = -INFINITO ; + m_dGridMaxX = INFINITO ; + m_dGridMinY = -INFINITO ; + m_dGridMaxY = INFINITO ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +Scene::SetGridGeoAdv( double dSnapStep, int nMinLineSstep, int nMajLineSstep, + double dXmin, double dXmax, double dYmin, double dYmax) +{ + if ( dSnapStep > 0) + m_dSnapStep = max( dSnapStep, MIN_SNAP_STEP) ; + if ( nMinLineSstep > 0) + m_nMinLineSstep = nMinLineSstep ; + if ( nMajLineSstep > 0) + m_nMajLineSstep = max( nMajLineSstep, m_nMinLineSstep) ; + if ( dXmin > dXmax) + swap( dXmin, dXmax) ; + if ( dYmin > dYmax) + swap( dYmin, dYmax) ; + int nExtSstep = int( ceil( max( max( abs( dXmin), abs( dYmin)), max( abs( dXmax), abs( dYmax))) / m_dSnapStep)) ; + m_nExtSstep = max( abs( nExtSstep), m_nMajLineSstep) ; + m_dGridMinX = dXmin ; + m_dGridMaxX = dXmax ; + m_dGridMinY = dYmin ; + m_dGridMaxY = dYmax ; return true ; } @@ -89,6 +122,10 @@ Scene::DrawGrid( void) // semi-estensione della griglia float dExt = float( m_nExtSstep * m_dSnapStep) ; + float dExtMinX = max( float( m_dGridMinX), -dExt) ; + float dExtMaxX = min( float( m_dGridMaxX), dExt) ; + float dExtMinY = max( float( m_dGridMinY), -dExt) ; + float dExtMaxY = min( float( m_dGridMaxY), dExt) ; // abbassamento in Z per evitare sovrapposizioni con geometria const float Z_DOWN = float( - 0.01) ; @@ -105,18 +142,26 @@ Scene::DrawGrid( void) // se non si sovrappongono alle maggiori if ( ( i % m_nMajLineSstep) != 0) { float dPos = float( i * m_dSnapStep) ; - // X + - glVertex3f( dPos, - dExt, Z_DOWN) ; - glVertex3f( dPos, dExt, Z_DOWN) ; - // X - - glVertex3f( - dPos, - dExt, Z_DOWN) ; - glVertex3f( - dPos, dExt, Z_DOWN) ; - // Y + - glVertex3f( - dExt, dPos, Z_DOWN) ; - glVertex3f( dExt, dPos, Z_DOWN) ; - // Y - - glVertex3f( - dExt, - dPos, Z_DOWN) ; - glVertex3f( dExt, - dPos, Z_DOWN) ; + // X + + if ( dPos >= dExtMinX && dPos <= dExtMaxX) { + glVertex3f( dPos, dExtMinY, Z_DOWN) ; + glVertex3f( dPos, dExtMaxY, Z_DOWN) ; + } + // X - + if ( -dPos >= dExtMinX && -dPos <= dExtMaxX) { + glVertex3f( -dPos, dExtMinY, Z_DOWN) ; + glVertex3f( -dPos, dExtMaxY, Z_DOWN) ; + } + // Y + + if ( dPos >= dExtMinY && dPos <= dExtMaxY) { + glVertex3f( dExtMinX, dPos, Z_DOWN) ; + glVertex3f( dExtMaxX, dPos, Z_DOWN) ; + } + // Y - + if ( -dPos >= dExtMinY && -dPos <= dExtMaxY) { + glVertex3f( dExtMinX, -dPos, Z_DOWN) ; + glVertex3f( dExtMaxX, -dPos, Z_DOWN) ; + } } } glEnd() ; @@ -129,50 +174,68 @@ Scene::DrawGrid( void) glColor3f( m_colMajLine.GetRed(), m_colMajLine.GetGreen(), m_colMajLine.GetBlue()) ; for ( int i = min( nCoeff * m_nMajLineSstep, m_nExtSstep) ; i <= m_nExtSstep ; i += nCoeff * m_nMajLineSstep) { float dPos = float( i * m_dSnapStep) ; - // X + - glVertex3f( dPos, - dExt, Z_DOWN) ; - glVertex3f( dPos, dExt, Z_DOWN) ; - // X - - glVertex3f( - dPos, - dExt, Z_DOWN) ; - glVertex3f( - dPos, dExt, Z_DOWN) ; - // Y + - glVertex3f( - dExt, dPos, Z_DOWN) ; - glVertex3f( dExt, dPos, Z_DOWN) ; - // Y - - glVertex3f( - dExt, - dPos, Z_DOWN) ; - glVertex3f( dExt, - dPos, Z_DOWN) ; + // X + + if ( dPos >= dExtMinX && dPos <= dExtMaxX) { + glVertex3f( dPos, dExtMinY, Z_DOWN) ; + glVertex3f( dPos, dExtMaxY, Z_DOWN) ; + } + // X - + if ( -dPos >= dExtMinX && -dPos <= dExtMaxX) { + glVertex3f( -dPos, dExtMinY, Z_DOWN) ; + glVertex3f( -dPos, dExtMaxY, Z_DOWN) ; + } + // Y + + if ( dPos >= dExtMinY && dPos <= dExtMaxY) { + glVertex3f( dExtMinX, dPos, Z_DOWN) ; + glVertex3f( dExtMaxX, dPos, Z_DOWN) ; + } + // Y - + if ( -dPos >= dExtMinY && -dPos <= dExtMaxY) { + glVertex3f( dExtMinX, -dPos, Z_DOWN) ; + glVertex3f( dExtMaxX, -dPos, Z_DOWN) ; + } } glEnd() ; } // se richiesto, disegno assi del frame if ( m_bShowFrame) { - // calcolo lunghezza asse Z + // calcolo lunghezza asse Z GLint Viewport[4] ; glGetIntegerv(GL_VIEWPORT, Viewport) ; const double LEN_AX = 28 ; double dLenZ = LEN_AX * ( 2 * m_dHalfWidth) / Viewport[2] ; float fLenZ = float( min( m_dSnapStep, dLenZ)) ; glBegin( GL_LINES) ; - // asse X+ - glColor3f( 0.8f, 0, 0) ; - glVertex3f( 0, 0, Z_DOWN) ; - glVertex3f( dExt, 0, Z_DOWN) ; - // asse Y+ - glColor3f( 0, 0.8f, 0) ; - glVertex3f( 0, 0, Z_DOWN) ; - glVertex3f( 0, dExt, Z_DOWN) ; - // asse Z+ - glColor3f( 0, 0, 0.8f) ; - glVertex3f( 0, 0, Z_DOWN) ; - glVertex3f( 0, 0, fLenZ) ; - // se richiesta griglia, assi X- e Y- + // asse X+ + if ( 0 >= dExtMinY && 0 <= dExtMaxY && 0 >= dExtMinY) { + glColor3f( 0.8f, 0, 0) ; + glVertex3f( max( 0.0f, dExtMinX), 0, Z_DOWN) ; + glVertex3f( dExtMaxX, 0, Z_DOWN) ; + } + // asse Y+ + if ( 0 >= dExtMinX && 0 <= dExtMaxX && 0 <= dExtMaxY) { + glColor3f( 0, 0.8f, 0) ; + glVertex3f( 0, max( 0.0f, dExtMinY), Z_DOWN) ; + glVertex3f( 0, dExtMaxY, Z_DOWN) ; + } + // asse Z+ + if ( 0 >= dExtMinX && 0 <= dExtMaxX && 0 >= dExtMinY && 0 <= dExtMaxY) { + glColor3f( 0, 0, 0.8f) ; + glVertex3f( 0, 0, Z_DOWN) ; + glVertex3f( 0, 0, fLenZ) ; + } + // se richiesta griglia, assi X- e Y- if ( m_bShowGrid) { glColor3f( m_colMajLine.GetRed(), m_colMajLine.GetGreen(), m_colMajLine.GetBlue()) ; - glVertex3f( 0, 0, Z_DOWN) ; - glVertex3f( -dExt, 0, Z_DOWN) ; - glVertex3f( 0, 0, Z_DOWN) ; - glVertex3f( 0, -dExt, Z_DOWN) ; + if ( 0 >= dExtMinY && 0 <= dExtMaxY && 0 >= dExtMinX) { + glVertex3f( min( 0.0f, dExtMaxX), 0, Z_DOWN) ; + glVertex3f( dExtMinX, 0, Z_DOWN) ; + } + if ( 0 >= dExtMinX && 0 <= dExtMaxX && 0 >= dExtMinY) { + glVertex3f( 0, min( 0.0f, dExtMaxY), Z_DOWN) ; + glVertex3f( 0, dExtMinY, Z_DOWN) ; + } } glEnd() ; } @@ -180,12 +243,16 @@ Scene::DrawGrid( void) else if ( m_bShowGrid) { glBegin( GL_LINES) ; glColor3f( m_colMajLine.GetRed(), m_colMajLine.GetGreen(), m_colMajLine.GetBlue()) ; - // asse X - glVertex3f( - dExt, 0, Z_DOWN) ; - glVertex3f( dExt, 0, Z_DOWN) ; - // asse Y - glVertex3f( 0, - dExt, Z_DOWN) ; - glVertex3f( 0, dExt, Z_DOWN) ; + // asse X + if ( 0 >= dExtMinY && 0 <= dExtMaxY) { + glVertex3f( dExtMinX, 0, Z_DOWN) ; + glVertex3f( dExtMaxX, 0, Z_DOWN) ; + } + // asse Y + if ( 0 >= dExtMinX && 0 <= dExtMaxX) { + glVertex3f( 0, dExtMinY, Z_DOWN) ; + glVertex3f( 0, dExtMaxY, Z_DOWN) ; + } glEnd() ; } @@ -211,4 +278,4 @@ bool Scene::GetShowGrid() { return m_bShowGrid ; -} \ No newline at end of file +}