From e8b10ef4e812cf7ee3123478e50e02116c501701 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 19 Feb 2024 14:50:00 +0100 Subject: [PATCH] =?UTF-8?q?EgtGraphics=202.6b4=20:=20-=20aggiunta=20possib?= =?UTF-8?q?ilit=C3=A0=20di=20un=20offset=20angolare=20in=20viste=20standar?= =?UTF-8?q?d.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EgtGraphics.rc | Bin 11606 -> 11606 bytes Scene.h | 12 ++++++++--- SceneBasic.cpp | 1 + SceneCamera.cpp | 52 +++++++++++++++++++++++++++++------------------- 4 files changed, 41 insertions(+), 24 deletions(-) diff --git a/EgtGraphics.rc b/EgtGraphics.rc index 19aa6010eabdcdf48e21de3e90333fd8afa63352..c49bb2be37082f80b82619260f2b2421ac9baa85 100644 GIT binary patch delta 92 zcmcZ>buDVcFE&P#%?J7RGfm>rnOvZ#2IO6otYqBW#%;w6meB=K7bUA1H)jc3pa^Yd L!LC(6*^LVT?zA3= delta 92 zcmcZ>buDVcFE&Qw%?J7RGfm>rnOvZ#2IO6otYqBW#%;w6meB=K7bUA1H)jc3pa^Yd L!LC(6*^LVT?Lr=a diff --git a/Scene.h b/Scene.h index 0c8a02e..bb55d4f 100644 --- a/Scene.h +++ b/Scene.h @@ -1,12 +1,13 @@ //---------------------------------------------------------------------------- // EgalTech 2014-2024 //---------------------------------------------------------------------------- -// File : Scene.h Data : 09.01.24 Versione : 2.5l7 +// 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 @@ -239,8 +244,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) ; @@ -292,6 +297,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 diff --git a/SceneBasic.cpp b/SceneBasic.cpp index 68f7ccd..989c5fe 100644 --- a/SceneBasic.cpp +++ b/SceneBasic.cpp @@ -53,6 +53,7 @@ Scene::Scene( void) m_bNewWay = false ; // Camera e viewport m_ptCenter = ORIG ; + m_nOrizzOffsCamera = 0 ; SetCamera( 0, 0, 0) ; m_nViewportW = 0 ; m_nViewportH = 0 ; diff --git a/SceneCamera.cpp b/SceneCamera.cpp index fc0fead..de14c00 100644 --- a/SceneCamera.cpp +++ b/SceneCamera.cpp @@ -83,16 +83,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() ; @@ -101,14 +101,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()) @@ -118,12 +119,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() ; } //---------------------------------------------------------------------------- @@ -157,25 +162,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 ; @@ -194,7 +201,7 @@ Scene::GetProjectedCenter( void) const //---------------------------------------------------------------------------- bool -Scene::CalcDirUp( void) +Scene::CalcDirUp( bool bUseOrizzOffsCamera) { // verifico se il calcolo è necessario if ( m_bUpOk) @@ -202,8 +209,11 @@ Scene::CalcDirUp( void) // 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 ( ! vtPerpXY.Normalize()) { vtPerpXY = -X_AX ; + if ( bUseOrizzOffsCamera) + vtPerpXY.Rotate( Z_AX, m_nOrizzOffsCamera * ANG_RIGHT) ; + } // direzione Up m_vtUp = vtPerpXY ^ m_vtDirCamera ; m_bUpOk = m_vtUp.Normalize() ;