diff --git a/EgtGraphics.rc b/EgtGraphics.rc index dee72de..c49bb2b 100644 Binary files a/EgtGraphics.rc and b/EgtGraphics.rc differ diff --git a/EgtGraphics.vcxproj b/EgtGraphics.vcxproj index ddffdcd..cccf81a 100644 --- a/EgtGraphics.vcxproj +++ b/EgtGraphics.vcxproj @@ -205,7 +205,7 @@ copy $(TargetPath) \EgtProg\Dll32 true - AdvancedVectorExtensions2 + NotSet false true CompileAsCpp diff --git a/Scene.h b/Scene.h index 9db9134..a21e746 100644 --- a/Scene.h +++ b/Scene.h @@ -1,12 +1,13 @@ //---------------------------------------------------------------------------- -// EgalTech 2014-2020 +// EgalTech 2014-2024 //---------------------------------------------------------------------------- -// File : Scene.h Data : 02.01.20 Versione : 2.2a1 +// File : Scene.h Data : 16.02.24 Versione : 2.6b4 // Contenuto : Dichiarazione della classe gestione scena. // // // // Modifiche : 29.01.14 DS Creazione modulo. +// 16.02.24 DS Aggiunte Set/Get CameraDirOrizzOffset. // // //---------------------------------------------------------------------------- @@ -89,11 +90,15 @@ class Scene : public IEGrScene void Destroy( void) override ; // Camera bool SetCenter( const Point3d& ptCenter) override ; + bool SetCameraDirOrizzOffset( int nRightStepOffset = 0) override + { m_nOrizzOffsCamera = nRightStepOffset ; return true ; } bool SetCamera( double dAngVertDeg, double dAngOrizzDeg, double dDist) override ; bool SetCamera( int nDir, double dDist = 0) override ; const Point3d& GetCenter( void) const override { return m_ptCenter ; } Point3d GetProjectedCenter( void) const override ; + int GetCameraDirOrizzOffset( void) const override + { return m_nOrizzOffsCamera ; } void GetCamera( double* pdAngVertDeg, double* pdAngOrizzDeg, double* pdDist = nullptr) const override ; int GetCameraDir( void) const override ; const Vector3d& GetCameraUp( void) const override @@ -152,6 +157,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 ; @@ -224,26 +231,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 : @@ -257,8 +264,8 @@ class Scene : public IEGrScene bool Background( void) ; bool Prepare( void) ; // Camera - bool VerifyCamera( void) ; - bool CalcDirUp( void) ; + bool VerifyCamera( bool bUseOrizzOffsCamera = false) ; + bool CalcDirUp( bool bUseOrizzOffsCamera = false) ; bool CalcCameraFrame( Frame3d& frView) ; // Geometry bool DrawGroup( int nId, int nPass, const MdStMkCol& siParent) ; @@ -322,6 +329,7 @@ class Scene : public IEGrScene // Camera Point3d m_ptCenter ; // centro verso cui è rivolta la camera Vector3d m_vtDirCamera ; // versore direzione dal centro alla camera + int m_nOrizzOffsCamera ; // offset orizzontale viste camera in multipli di 90deg double m_dDistCamera ; // distanza dal centro alla camera Vector3d m_vtUp ; // versore direzione Su della camera bool m_bUpOk ; // flag per stato aggiornamento di Up @@ -387,9 +395,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_dGridWidth ; // lunghezza della griglia rettangolare - double m_dGridHeight ; // altezza della griglia rettangolare - int m_nGridFrame_Flag ; // posizione dell'origine con gli assi sulla griglia + 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 // Axis Frame diff --git a/SceneBasic.cpp b/SceneBasic.cpp index c656c58..552ee39 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) @@ -63,6 +62,7 @@ Scene::Scene( void) m_cColCorner = Color( 200, 200, 200, 1) ; // Camera e viewport m_ptCenter = ORIG ; + m_nOrizzOffsCamera = 0 ; SetCamera( 0, 0, 0) ; m_nViewportW = 0 ; m_nViewportH = 0 ; @@ -71,7 +71,7 @@ Scene::Scene( void) // Sfondo m_colBackTop.Set( 176, 176, 176) ; m_colBackBottom.Set( 176, 176, 176) ; - // Modalità di visualizzazione + // Modalit� di visualizzazione m_nShowMode = SM_WIREFRAME ; m_bShowCurveDirection = false ; m_bShowTriaAdvanced = true ; @@ -105,30 +105,20 @@ Scene::Scene( void) SetExtension( BBox3d( -MIN_EXTENSION, -MIN_EXTENSION, -MIN_EXTENSION, MIN_EXTENSION, MIN_EXTENSION, MIN_EXTENSION)) ; // Grid - m_bShowGrid = false ; - m_bShowFrame = false ; - m_dSnapStep = 1 ; - m_nMinLineSstep = 10 ; - m_nMajLineSstep = 100 ; - m_nExtSstep = 500 ; - m_colMinLine.Set( 160, 160, 160) ; - m_colMajLine.Set( 160, 160, 160) ; - m_dGridWidth = 1000 ; - m_dGridHeight = 1000 ; - m_nGridFrame_Flag = 1 ; - // Axis Frame - m_bShowGlobFrame = true ; - m_nAxisFrame_Flag = 3 ; - m_dFrame_DistX = 40.0 ; - m_dFrame_DistY = 120.0 ; - m_dFrameLineL = 25.0; - m_dFrameLineW = 2.0 ; - // Global Cube - m_bShowGlobCube = true ; - m_nCube_Flag = 3 ; - m_dCubeEdge = 80.0 ; - m_dCubeX = 70.0 ; - m_dCubeY = 70.0 ; + m_bShowGrid = false ; + m_bShowFrame = false ; + 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 + m_bShowGlobFrame = false ; // Direct m_colorGL.Set( 255, 0, 0) ; m_bGeoLine = false ; @@ -156,7 +146,7 @@ Scene::Init( IGeomDB* pGeomDB) bool Scene::CreateContext( HDC hDC, int nDriver, bool b2Buff, int nColorBits, int nDepthBits) { - // verifico validità Device Context + // verifico validit� Device Context if ( hDC == nullptr) return false ; m_hDC = hDC ; @@ -233,7 +223,7 @@ Scene::CreateContext( HDC hDC, int nDriver, bool b2Buff, int nColorBits, int nDe LOG_INFO( GetEGrLogger(), "WGL_ARB_create_context missing !") } - // verifico validità Rendering Context + // verifico validit� Rendering Context if ( m_hRC == nullptr) return false ; @@ -244,7 +234,7 @@ Scene::CreateContext( HDC hDC, int nDriver, bool b2Buff, int nColorBits, int nDe if ( GlewInitResult != GLEW_OK) LOG_INFO( GetEGrLogger(), "GLEW is not initialized !") - // verifico se posso lavorare in modalità nuova + // verifico se posso lavorare in modalit� nuova m_bNewWay = ( nDriver == OD_NEW && glewIsSupported( "GL_VERSION_3_0") == 1) ; if ( ! m_bNewWay) LOG_INFO( GetEGrLogger(), "OpenGL old way rendering !") @@ -306,11 +296,11 @@ Scene::ChooseGenPixelFormat( int nPfd, bool b2Buff, int nColorBits, int nDepthBi bool Scene::MakeCurrent( void) const { - // se RC della scena non è definito, errore + // se RC della scena non � definito, errore if ( m_hRC == nullptr) return false ; - // se RC della scena è quello corrente, ok + // se RC della scena � quello corrente, ok HGLRC hRC = wglGetCurrentContext() ; if ( m_hRC == hRC) return true ; @@ -437,7 +427,7 @@ Scene::SetExtension( const BBox3d& b3Ext) bool Scene::CalcExtView( void) { - // verifico se il calcolo è necessario + // verifico se il calcolo � necessario if ( m_bExtViewOk && m_bUpOk) return true ; // calcolo direzione camera Up @@ -750,12 +740,12 @@ Scene::MyDraw( bool bSwapBF) if ( m_pGeomDB != nullptr) m_pGeomDB->GetDefaultMaterial( m_colDef) ; - // impostazioni dipendenti dalla modalità di visualizzazione + // impostazioni dipendenti dalla modalit� di visualizzazione switch ( m_nShowMode) { case SM_WIREFRAME : // disabilito illuminazione glDisable( GL_LIGHTING) ; - // disegno griglia senza illuminazione (già impostato) + // disegno griglia senza illuminazione (gi� impostato) DrawGrid() ; // imposto dati standard per punti e linee glPointSize( (float) GetPointSize()) ; @@ -768,7 +758,7 @@ Scene::MyDraw( bool bSwapBF) case SM_HIDDENLINE : // disabilito illuminazione glDisable( GL_LIGHTING) ; - // disegno griglia senza illuminazione (già impostato) + // disegno griglia senza illuminazione (gi� impostato) DrawGrid() ; // imposto dati standard per punti e linee glPointSize( (float) GetPointSize()) ; diff --git a/SceneCamera.cpp b/SceneCamera.cpp index 0b2b0e8..96b1667 100644 --- a/SceneCamera.cpp +++ b/SceneCamera.cpp @@ -88,16 +88,16 @@ Scene::SetCamera( int nDir, double dDist) m_vtDirCamera.Set( 0, 0, -1) ; break ; case CT_ISO_SW : - m_vtDirCamera.Set( - SQRT1_3, - SQRT1_3, SQRT1_3) ; + m_vtDirCamera.Set( -SQRT1_3, -SQRT1_3, SQRT1_3) ; break ; case CT_ISO_SE : - m_vtDirCamera.Set( SQRT1_3, - SQRT1_3, SQRT1_3) ; + m_vtDirCamera.Set( SQRT1_3, -SQRT1_3, SQRT1_3) ; break ; case CT_ISO_NE : m_vtDirCamera.Set( SQRT1_3, SQRT1_3, SQRT1_3) ; break ; case CT_ISO_NW : - m_vtDirCamera.Set( - SQRT1_3, SQRT1_3, SQRT1_3) ; + m_vtDirCamera.Set( -SQRT1_3, SQRT1_3, SQRT1_3) ; break ; case CT_CPLANE : m_vtDirCamera = GetGridFrame().VersZ() ; @@ -106,14 +106,15 @@ Scene::SetCamera( int nDir, double dDist) return false ; break ; } + if ( nDir != CT_CPLANE) + m_vtDirCamera.Rotate( Z_AX, m_nOrizzOffsCamera * ANG_RIGHT) ; m_dDistCamera = dDist ; - - return VerifyCamera() ; + return VerifyCamera( nDir != CT_CPLANE) ; } //---------------------------------------------------------------------------- bool -Scene::VerifyCamera( void) +Scene::VerifyCamera( bool bUseOrizzOffsCamera) { // verifico il versore if ( ! m_vtDirCamera.Normalize()) @@ -123,12 +124,16 @@ Scene::VerifyCamera( void) m_dDistCamera = STD_DIST_CAMERA ; else m_dDistCamera = max( m_dDistCamera, MIN_DIST_CAMERA) ; - // invalido Up e ExtView + // ricalcolo direzione Up m_bUpOk = false ; + if ( ! CalcDirUp( bUseOrizzOffsCamera)) + return false ; + // ricalcolo ExtView m_bExtViewOk = false ; + if ( ! CalcExtView()) + return false ; // calcolo nuovi dati di Z clipping - CalcClippingPlanesFromExtView() ; - return true ; + return CalcClippingPlanesFromExtView() ; } //---------------------------------------------------------------------------- @@ -162,25 +167,27 @@ Scene::GetCamera( double* pdAngVertDeg, double* pdAngOrizzDeg, double* pdDist) c int Scene::GetCameraDir( void) const { - if ( m_vtDirCamera.IsZplus()) + Vector3d vtDir = m_vtDirCamera ; + vtDir.Rotate( Z_AX, - m_nOrizzOffsCamera * ANG_RIGHT) ; + if ( vtDir.IsZplus()) return CT_TOP ; - else if ( m_vtDirCamera.IsYminus()) + else if ( vtDir.IsYminus()) return CT_FRONT ; - else if ( m_vtDirCamera.IsXplus()) + else if ( vtDir.IsXplus()) return CT_RIGHT ; - else if ( m_vtDirCamera.IsYplus()) + else if ( vtDir.IsYplus()) return CT_BACK ; - else if ( m_vtDirCamera.IsXminus()) + else if ( vtDir.IsXminus()) return CT_LEFT ; - else if ( m_vtDirCamera.IsZminus()) + else if ( vtDir.IsZminus()) return CT_BOTTOM ; - else if ( AreSameVectorApprox( m_vtDirCamera, Vector3d( - SQRT1_3, - SQRT1_3, SQRT1_3))) + else if ( AreSameVectorApprox( vtDir, Vector3d( - SQRT1_3, - SQRT1_3, SQRT1_3))) return CT_ISO_SW ; - else if ( AreSameVectorApprox( m_vtDirCamera, Vector3d( SQRT1_3, - SQRT1_3, SQRT1_3))) + else if ( AreSameVectorApprox( vtDir, Vector3d( SQRT1_3, - SQRT1_3, SQRT1_3))) return CT_ISO_SE ; - else if ( AreSameVectorApprox( m_vtDirCamera, Vector3d( SQRT1_3, SQRT1_3, SQRT1_3))) + else if ( AreSameVectorApprox( vtDir, Vector3d( SQRT1_3, SQRT1_3, SQRT1_3))) return CT_ISO_NE ; - else if ( AreSameVectorApprox( m_vtDirCamera, Vector3d( - SQRT1_3, SQRT1_3, SQRT1_3))) + else if ( AreSameVectorApprox( vtDir, Vector3d( - SQRT1_3, SQRT1_3, SQRT1_3))) return CT_ISO_NW ; else return CT_NONE ; @@ -199,7 +206,7 @@ Scene::GetProjectedCenter( void) const //---------------------------------------------------------------------------- bool -Scene::CalcDirUp( void) +Scene::CalcDirUp( bool bUseOrizzOffsCamera) { // verifico se il calcolo è necessario if ( m_bUpOk) @@ -208,10 +215,9 @@ Scene::CalcDirUp( void) // ( 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 ; + vtPerpXY = -X_AX ; + if ( bUseOrizzOffsCamera) + vtPerpXY.Rotate( Z_AX, m_nOrizzOffsCamera * ANG_RIGHT) ; } // direzione Up m_vtUp = vtPerpXY ^ m_vtDirCamera ; diff --git a/SceneGeom.cpp b/SceneGeom.cpp index b5aeb12..634e03c 100644 --- a/SceneGeom.cpp +++ b/SceneGeom.cpp @@ -465,6 +465,8 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj) int nCount = 0 ; // numero di colori const int ZMAP_COL = 2 ; + // indicazione se tridexel + bool bIsTriDexel = pZmap->IsTriDexel() ; // se triangoli da disegnare if ( ( m_nShowZmap & ZSM_SURF) != 0) { // definizione materiali @@ -524,7 +526,7 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj) for ( const auto& Tria : vTria) { if ( ( j == 0 && Tria.GetGrade() != 0) || ( j == 1 && Tria.GetGrade() == 0)) continue ; - if ( m_bShowTriaAdvanced) + if ( m_bShowTriaAdvanced && bIsTriDexel) pGraphics->AddTriangle( Tria, Tria.GetTriFlags(), Tria.GetTriNormals()) ; else pGraphics->AddTriangle( Tria, TriFlags3d(), TriNormals3d( Tria.GetN())) ; @@ -646,7 +648,7 @@ Scene::DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj) POLYLINELIST lstPL ; if ( pUserObj->GetDrawPolyLines( lstPL)) { for ( const auto& PL : lstPL) - pGraphics->AddPolyLine( PL, true) ; + pGraphics->AddPolyLine( PL, ( PL.GetTempProp() == 0)) ; } } } @@ -972,18 +974,18 @@ static bool CalcCurveConnectingLines( const PolyLine& plCrv, const Vector3d& vtTh, bool bDense, PNTVECTOR& vPnt) { // assegno coefficiente - double dDelta = ( bDense ? 0.25 : 1) ; + double dDelta = ( bDense ? 0.25 : 0.5) ; // ciclo per creare i segmenti di raccordo double dU, dUprev = - dDelta ; vPnt.reserve( 5) ; for ( bool bFound = plCrv.GetFirstU( dU) ; bFound ; bFound = plCrv.GetNextU( dU)) { - if ( ( dU - dUprev) > dDelta - EPS_PARAM) { + if ( ( dU - dUprev) > dDelta - EPS_PARAM || fmod( dU, 1.) < EPS_PARAM) { Point3d ptP ; plCrv.GetCurrPoint( ptP) ; vPnt.push_back( ptP) ; ptP += vtTh ; vPnt.push_back( ptP) ; - dUprev += dDelta ; + dUprev = dU ; } } return true ; diff --git a/SceneGrid.cpp b/SceneGrid.cpp index 39847b7..7ee0f8a 100644 --- a/SceneGrid.cpp +++ b/SceneGrid.cpp @@ -20,10 +20,8 @@ using namespace std ; -// costanti parametri per la griglia -const double GRID_MIN_LEN_X = 10 ; -const double GRID_MIN_LEN_Y = 10 ; -const double GRID_AXIS_WIDTH = 1 ; +//--------------------------- Constants -------------------------------------- +const double MIN_SNAP_STEP = 0.1 ; //---------------------------------------------------------------------------- bool @@ -38,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 ; } @@ -98,6 +126,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) ; @@ -115,17 +147,25 @@ Scene::DrawGrid( void) if ( ( i % m_nMajLineSstep) != 0) { float dPos = float( i * m_dSnapStep) ; // X + - glVertex3f( dPos, - dExt, Z_DOWN) ; - glVertex3f( dPos, dExt, Z_DOWN) ; + if ( dPos >= dExtMinX && dPos <= dExtMaxX) { + glVertex3f( dPos, dExtMinY, Z_DOWN) ; + glVertex3f( dPos, dExtMaxY, Z_DOWN) ; + } // X - - glVertex3f( - dPos, - dExt, Z_DOWN) ; - glVertex3f( - dPos, dExt, Z_DOWN) ; + if ( -dPos >= dExtMinX && -dPos <= dExtMaxX) { + glVertex3f( -dPos, dExtMinY, Z_DOWN) ; + glVertex3f( -dPos, dExtMaxY, Z_DOWN) ; + } // Y + - glVertex3f( - dExt, dPos, Z_DOWN) ; - glVertex3f( dExt, dPos, Z_DOWN) ; + if ( dPos >= dExtMinY && dPos <= dExtMaxY) { + glVertex3f( dExtMinX, dPos, Z_DOWN) ; + glVertex3f( dExtMaxX, dPos, Z_DOWN) ; + } // Y - - glVertex3f( - dExt, - dPos, Z_DOWN) ; - glVertex3f( dExt, - dPos, Z_DOWN) ; + if ( -dPos >= dExtMinY && -dPos <= dExtMaxY) { + glVertex3f( dExtMinX, -dPos, Z_DOWN) ; + glVertex3f( dExtMaxX, -dPos, Z_DOWN) ; + } } } glEnd() ; @@ -139,17 +179,25 @@ Scene::DrawGrid( void) 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) ; + if ( dPos >= dExtMinX && dPos <= dExtMaxX) { + glVertex3f( dPos, dExtMinY, Z_DOWN) ; + glVertex3f( dPos, dExtMaxY, Z_DOWN) ; + } // X - - glVertex3f( - dPos, - dExt, Z_DOWN) ; - glVertex3f( - dPos, dExt, Z_DOWN) ; + if ( -dPos >= dExtMinX && -dPos <= dExtMaxX) { + glVertex3f( -dPos, dExtMinY, Z_DOWN) ; + glVertex3f( -dPos, dExtMaxY, Z_DOWN) ; + } // Y + - glVertex3f( - dExt, dPos, Z_DOWN) ; - glVertex3f( dExt, dPos, Z_DOWN) ; + if ( dPos >= dExtMinY && dPos <= dExtMaxY) { + glVertex3f( dExtMinX, dPos, Z_DOWN) ; + glVertex3f( dExtMaxX, dPos, Z_DOWN) ; + } // Y - - glVertex3f( - dExt, - dPos, Z_DOWN) ; - glVertex3f( dExt, - dPos, Z_DOWN) ; + if ( -dPos >= dExtMinY && -dPos <= dExtMaxY) { + glVertex3f( dExtMinX, -dPos, Z_DOWN) ; + glVertex3f( dExtMaxX, -dPos, Z_DOWN) ; + } } glEnd() ; } @@ -164,24 +212,34 @@ Scene::DrawGrid( void) float fLenZ = float( min( m_dSnapStep, dLenZ)) ; glBegin( GL_LINES) ; // asse X+ - glColor3f( m_cColX.GetRed(), m_cColX.GetGreen(), m_cColX.GetBlue()) ; - glVertex3f( 0, 0, Z_DOWN) ; - glVertex3f( dExt, 0, Z_DOWN) ; + 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+ - glColor3f( m_cColY.GetRed(), m_cColY.GetGreen(), m_cColY.GetBlue()) ; - glVertex3f( 0, 0, Z_DOWN) ; - glVertex3f( 0, dExt, Z_DOWN) ; + 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+ - glColor3f( m_cColZ.GetRed(), m_cColZ.GetGreen(), m_cColZ.GetBlue()) ; - glVertex3f( 0, 0, Z_DOWN) ; - glVertex3f( 0, 0, fLenZ) ; + 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() ; } @@ -190,11 +248,15 @@ Scene::DrawGrid( void) 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) ; + if ( 0 >= dExtMinY && 0 <= dExtMaxY) { + glVertex3f( dExtMinX, 0, Z_DOWN) ; + glVertex3f( dExtMaxX, 0, Z_DOWN) ; + } // asse Y - glVertex3f( 0, - dExt, Z_DOWN) ; - glVertex3f( 0, dExt, Z_DOWN) ; + if ( 0 >= dExtMinX && 0 <= dExtMaxX) { + glVertex3f( 0, dExtMinY, Z_DOWN) ; + glVertex3f( 0, dExtMaxY, Z_DOWN) ; + } glEnd() ; } @@ -366,7 +428,7 @@ Scene::DrawRectangularGrid() bool Scene::SetGlobGridParameters( int nPosFlag, double dLenX, double dLenY) { - // controllo validità dei parametri... + // controllo validit� dei parametri... if ( dLenX < GRID_MIN_LEN_X || dLenY < GRID_MIN_LEN_Y || nPosFlag < 0 || nPosFlag > 3 ) { m_bShowFrame = false ; @@ -401,4 +463,4 @@ bool Scene::GetShowGrid() { return m_bShowGrid ; -} \ No newline at end of file +} diff --git a/SceneSnap.cpp b/SceneSnap.cpp index 58c0d33..d99b535 100644 --- a/SceneSnap.cpp +++ b/SceneSnap.cpp @@ -32,6 +32,7 @@ #include "/EgtDev/Include/EGkIntersCurves.h" #include "/EgtDev/Include/EGkIntersLinePlane.h" #include "/EgtDev/Include/EGkIntersLineSurfTm.h" +#include "/EgtDev/Include/EGkIntersLineVolZmap.h" #include "/EgtDev/Include/EgtPointerOwner.h" #include @@ -969,7 +970,7 @@ Scene::FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fra // cerco i triangoli intersecati dalla linea di mira ILZIVECTOR vInfo ; - if ( ! pVzm->GetLineIntersection( ptMir, vtDir, vInfo)) + if ( ! IntersLineVolZmap( ptMir, vtDir, *pVzm, vInfo)) return false ; // se non trovato alcunchè, cerco le linee che partono dagli angoli del rettangolo di mira Vector3d vtWinD( -1, -1, 0) ; @@ -984,7 +985,7 @@ Scene::FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fra ptMir2.ToLoc( frEnt) ; ptMir2 -= vtDir * 2 * dBlRad ; // interseco con la superficie - if ( ! pVzm->GetLineIntersection( ptMir2, vtDir, vInfo)) + if ( ! IntersLineVolZmap( ptMir2, vtDir, *pVzm, vInfo)) return false ; } if ( vInfo.size() == 0)