EgtGraphics 2.5l6 :

- aggiunta gestione disegno grid asimmetrica, impostabile con SetGridGeoAdv.
This commit is contained in:
Dario Sassi
2024-01-09 18:30:04 +01:00
parent fec352f37b
commit 4081ff7830
4 changed files with 146 additions and 70 deletions
+120 -53
View File
@@ -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 ;
}
}