//---------------------------------------------------------------------------- // EgalTech 2014-2024 //---------------------------------------------------------------------------- // File : Scene.h Data : 09.01.24 Versione : 2.5l7 // Contenuto : Dichiarazione della classe gestione scena. // // // // Modifiche : 29.01.14 DS Creazione modulo. // // //---------------------------------------------------------------------------- #pragma once //---------------------------------------------------------------------------- #include "TextureMgr.h" #include "/EgtDev/Include/EGrScene.h" #include "/EgtDev/Include/EGkGeomDB.h" #include "OpenGL.h" class IGdbIterator ; class ICurve ; class ICurveComposite ; class ISurfTriMesh ; class ISurfFlatRegion ; class IVolZmap ; class IExtText ; class IExtDimension ; class ObjEGrGraphics ; //---------------------------------------------------------------------------- struct MdStMkCol { int nMode ; int nStat ; int nMark ; Color colObj ; MdStMkCol( int nMd, int nSt, int nMk, Color colC) : nMode( nMd), nStat( nSt), nMark( nMk), colObj( colC) {} } ; //---------------------------------------------------------------------------- struct SelRec { // record di selezione per OpenGL (buffer di GLuint) GLuint nLen ; // numero di Id sullo stack dei nomi al momento del disegno (sempre 1) GLuint nZmin ; // Zdepth minima GLuint nZmax ; // Zdepth massima GLuint nId ; // nome dell'oggetto } ; //---------------------------------------------------------------------------- struct AlphaSurf { Frame3d frModView ; ObjEGrGraphics* pGraph ; int nStat ; int nMark ; bool bSurf ; int nAlpha ; bool bShowAux ; double dZmin ; double dZmax ; AlphaSurf( const Frame3d& frMV, ObjEGrGraphics* pG, int nS, int nM, bool bS, int nA, bool bSA, double dZm, double dZM) : frModView( frMV), pGraph( pG), nStat( nS), nMark( nM), bSurf( bS), nAlpha( nA), bShowAux( bSA), dZmin( dZm), dZmax( dZM) {} } ; typedef std::vector ASURFVECTOR ; //---------------------------------------------------------------------------- class Scene : public IEGrScene { public : // Basic ~Scene( void) override ; bool Init( IGeomDB* pGeomDB) override ; bool CreateContext( HDC hDC, int nDriver, bool b2Buff, int nColorBits, int nDepthBits) override ; bool IsValid( void) const override { return ( m_hDC != nullptr && m_hRC != nullptr) ; } std::string GetOpenGLInfo( void) const override ; std::string GetGLSLInfo( void) const override ; std::string GetPixelFormatInfo( void) const override ; IGeomDB* GetGeomDB( void) const override { return m_pGeomDB ; } bool RedrawWindow( void) override ; bool Resize( int nW, int nH) override ; bool SetBackground( Color colBackTop, Color colBackBottom) override ; bool GetBackground( Color& colBackTop, Color& colBackBottom) override ; bool Draw( void) override ; bool Project( const Point3d& ptWorld, Point3d& ptView) const override ; bool UnProject( const Point3d& ptView, Point3d& ptWorld) const override ; void Destroy( void) override ; // Camera bool SetCenter( const Point3d& ptCenter) override ; 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 ; void GetCamera( double* pdAngVertDeg, double* pdAngOrizzDeg, double* pdDist = nullptr) const override ; int GetCameraDir( void) const override ; const Vector3d& GetCameraUp( void) const override { return m_vtUp ; } bool PanCamera( const Point3d& ptWinOld, const Point3d& ptWinNew) override ; bool RotateCamera( const Point3d& ptWinOld, const Point3d& ptWinNew) override ; bool ZoomAll( void) override ; bool ZoomObject( int nId) override ; bool ZoomRadius( double dRadius) override ; bool ZoomChange( double dCoeff) override ; bool ZoomOnPoint( const Point3d& ptWin, double dCoeff) override ; bool ZoomWin( const Point3d& ptWin1, const Point3d& ptWin2) override ; void GetOrthoCamParam( double* pdWidth, double* pdHeight, double* pdNear, double* pdFar) const override ; // ShowMode bool SetShowMode( int nShowMode) override { if ( nShowMode != SM_WIREFRAME && nShowMode != SM_HIDDENLINE && nShowMode != SM_SHADING) return false ; m_nShowMode = nShowMode ; return true ; } int GetShowMode( void) const override { return m_nShowMode ; } void SetShowCurveDirection( bool bShow) override { m_bShowCurveDirection = bShow ; } bool GetShowCurveDirection( void) const override { return m_bShowCurveDirection ; } void SetShowTriaAdvanced( bool bAdvanced) override { m_bShowTriaAdvanced = bAdvanced ; } bool GetShowTriaAdvanced( void) const override { return m_bShowTriaAdvanced ; } void SetShowZmap( int nMode) override { m_nShowZmap = nMode ; } int GetShowZmap( void) const override { return m_nShowZmap ; } void SetShowText( int nMode) override { m_nShowText = nMode ; } int GetShowText( void) const override { return m_nShowText ; } // Geometry bool SetExtension( const BBox3d& b3Ext) override ; bool UpdateExtension( void) override ; bool SetMark( Color colMark) override ; bool SetSelSurf( Color colSelSurf) override ; bool SetLineWidth( int nW) override ; // 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 ; // Glob Frame bool SetGlobFrameShow( bool bShow) override ; // Direct bool SetGeoLineAttribs( Color GLcol) override ; bool SetGeoLine( const Point3d& ptP1, const Point3d& ptP2) override ; bool ResetGeoLine( void) override ; bool SetGeoTriaAttribs( Color GTcol) override ; bool SetGeoTria( const Point3d& ptP1, const Point3d& ptP2, const Point3d& ptP3) override ; bool ResetGeoTria( void) override ; bool SetWinRectAttribs( bool bOutline, Color WRcol) override ; bool SetWinRect( const Point3d& ptWinRectP1, const Point3d& ptWinRectP2) override ; bool ResetWinRect( void) override ; // Select bool Select( const Point3d& ptView, int nW, int nH, int& nSel) override ; bool SetObjFilterForSelect( bool bZerodim, bool bCurve, bool bSurf, bool bVolume, bool bExtra) override ; bool UnselectableAdd( int nId) override ; bool UnselectableRemove( int nId) override ; bool UnselectableClearAll( void) override ; bool UnselectableFind( int nId) override ; bool GetSelectedObjs( INTVECTOR& nIds) const override ; int GetFirstSelectedObj( void) override ; int GetNextSelectedObj( void) override ; double GetSelectedObjWinZ( int nSel = - 1) const override ; double GetSelectedObjMinWinZ( int nSel = - 1) const override ; bool GetPointFromSelect( int nSelId, const Point3d& ptView, Point3d& ptSel, int& nAux) override ; // Snap // anche per lo snap valgono SetObjFilterForSelect e Unselectable* bool GetGraphicSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Point3d& ptSel) override ; bool GetGridSnapPointZ( bool bSketch, const Point3d& ptWin, const Point3d& ptGrid, Point3d& ptSel) const override ; int GetLastSnapId( void) const override { return m_nLastSnapId ; } bool GetLastSnapDir( Vector3d& vtDir) const override { if ( ! m_bLastSnapDirOk) return false ; vtDir = m_vtLastSnapDir ; return true ; } bool GetPlaneSnapPoint( const Point3d& ptWin, const Plane3d& plPlane, Point3d& ptSel) const override ; // Texture bool SetTextureMaxLinPixels( int nMaxLinPix) override ; bool LoadTexture( const std::string& sName, const std::string& sFile, double dMMxPix, double dDimX, double dDimY, int nRepeat) override ; bool UnloadTexture( const std::string& sName) override ; bool UnloadAllTextures( void) override ; bool ExistsTexture( const std::string& sName) const override ; bool GetTexturePixels( const std::string& sName, int& nWidth, int& nHeight) const override ; bool GetTextureImagePixels( const std::string& sName, int& nWidth, int& nHeight) const override ; bool GetTextureDimensions( const std::string& sName, double& dDimX, double& dDimY) const override ; bool ChangeTextureDimensions( const std::string& sName, double dDimX, double dDimY) override ; // Image bool GetImage( int nShowMode, Color colBackTop, Color colBackBottom, int nDestWidth, int nDestHeight, const std::string& sFile) override ; public : // Basic Scene( void) ; bool MakeCurrent( void) const ; int GetOpenGLver( void) { return m_nOglVer ; } // PointSize - LineWidth double GetPointSize( void) const { return m_dPointSize ; } double GetSelPointSize( void) const { return m_dSelPointSize ; } double GetMarkPointSize( void) const { return m_dMarkPointSize ; } double GetLineWidth( void) const { return m_dLineWidth ; } double GetSelLineWidth( void) const { return m_dSelLineWidth ; } double GetMarkLineWidth( void) const { return m_dMarkLineWidth ; } double GetGridLineWidth( void) const { return m_dGridLineWidth ; } double GetFrameLineWidth( void) const { return m_dFrameLineWidth ; } // Geometry Color GetMark( void) const { return m_colMark ; } Color GetSelSurf( void) const { return m_colSelSurf ; } private : // Basic int ChooseGenPixelFormat( int nPfd, bool b2Buff, int nColorBits, int nDepthBits) ; bool CalcExtView( void) ; bool CalcDimViewFromExtView( void) ; bool AdjustDimView( double dHalfWidth, double dHalfHeight) ; bool CalcClippingPlanesFromExtView( void) ; bool MyDraw( bool bSwapBF) ; bool Background( void) ; bool Prepare( void) ; // Camera bool VerifyCamera( void) ; bool CalcDirUp( void) ; bool CalcCameraFrame( Frame3d& frView) ; // Geometry bool DrawGroup( int nId, int nPass, const MdStMkCol& siParent) ; bool DrawGroup( const IGdbIterator& iIter, int nPass, const MdStMkCol& siParent) ; bool DrawGeoObj( const IGdbIterator& iIter, int nPass, const MdStMkCol& siObj) ; bool DrawAlphaSurfVector( void) ; bool DeleteObjGraphicsGroup( int nId) ; // Grid const Frame3d& GetGridFrame( void) const { if ( m_pGeomDB != nullptr) return m_pGeomDB->GetGridFrame() ; static Frame3d frGrid ; return frGrid ; } bool DrawGrid( void) ; // Glob Frame bool DrawGlobFrame( void) ; // Direct bool DrawDirect( void) ; bool DrawGeoLine( void) ; bool DrawGeoTria( void) ; bool DrawWinRect( void) ; // Snap bool FindGridSnapPoint( bool bSketch, const Point3d& ptWin) ; bool FindSelectedIntersectionPoint( const Point3d& ptWin, int nW, int nH) ; bool FindSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH) ; bool FindCurveSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3d& frEnt, const ICurve* pCrv, double& dMinSqDist) ; bool VerifySnapPoint( const Point3d& ptP, const Point3d& ptWin, double& dMinSqDist) const ; bool AdjustForCurveExtr( const Point3d& ptWin, const Frame3d& frEnt, const ICurve* pCrv, Point3d& ptP) ; bool FindCurveCompoSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3d& frEnt, const ICurveComposite* pCrvCompo, double& dMinSqDist) ; bool FindSurfTMSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3d& frEnt, const ISurfTriMesh* pStm, double& dMinSqDist) ; bool FindSurfFRSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3d& frEnt, const ISurfFlatRegion* pSfr, double& dMinSqDist) ; bool FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3d& frEnt, const IVolZmap* pVzm, double& dMinSqDist) ; bool FindTextSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3d& frEnt, const IExtText* pTxt, double& dMinSqDist) ; bool FindDimensionSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3d& frEnt, const IExtDimension* pDim, double& dMinSqDist) ; private : // Basic HDC m_hDC ; // Device Context HGLRC m_hRC ; // OpenGL Rendering Context int m_nOglVer ; // OpenGL Version bool m_bNewWay ; // flag che indica nuova modalità (OpenGL 3.0 in poi) // Camera Point3d m_ptCenter ; // centro verso cui è rivolta la camera Vector3d m_vtDirCamera ; // versore direzione dal centro alla camera 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 int m_nViewportW ; // larghezza della finestra int m_nViewportH ; // altezza della finestra // Textures TextureMgr m_TextMgr ; // gestore di textures // Background Color m_colBackTop ; // colore di sfondo in alto Color m_colBackBottom ; // colore di sfondo in basso // ShowMode int m_nShowMode ; // modo di visualizzazione (wireframe, hiddenline, shading) bool m_bShowCurveDirection ; // flag di visualizzazione direzione curve bool m_bShowTriaAdvanced ; // flag per abilitare la visualizzazione avanzata dei triangoli int m_nShowZmap ; // modo visualizzazione Zmap (+1=surf, +2=spilloni, +4=normali, +8=più colori) int m_nShowText ; // modo visualizzazione scritte (1=solo contorni, 2=con riempimento) // PointSize - LineWidth double m_dPointSize ; // dimensione punti double m_dSelPointSize ; // dimensione punti selezionati double m_dMarkPointSize ; // dimensione punti marcati double m_dLineWidth ; // spessore linee double m_dSelLineWidth ; // spessore linee selezionate double m_dMarkLineWidth ; // spessore linee marcate double m_dGridLineWidth ; // spessore linee della griglia double m_dFrameLineWidth ; // spessore linee del riferimento // Selection bool m_bSelect ; // flag di selezione attiva int m_nObjFilterForSelect ; // tipi di oggetti che possono essere selezionati INTVECTOR m_Unsel ; // vettore indici oggetti non selezionabili Point3d m_ptSelCent ; // centro di selezione int m_nSelW ; // larghezza finestra di selezione int m_nSelH ; // altezza finestra di selezione int m_nSelNbr ; // numero di selezioni registrate int m_nSelCurr ; // indice oggetto selezionato corrente static const int DIM_SEL_BUF = 65536 ; // numero di record nel baffer static const int SIZE_SEL_BUF = 4 * DIM_SEL_BUF ; // dimensioni del buffer come interi (1 record = 4 uint) SelRec m_nSelBuff[DIM_SEL_BUF] ; // buffer per selezione con OpenGL // Snap // lo snap a oggetti usa la select, quindi anche per esso valgono m_nObjFilterForSelect e m_Unsel int m_nLastSnapId ; // Id dell'entità generatrice dell'ultimo punto snap Point3d m_ptLastSnapPnt ; // ultimo punto di snap bool m_bLastSnapDirOk ; // flag validità direzione associata a ultimo punto snap Vector3d m_vtLastSnapDir ; // direzione associata a ultimo punto snap // Geometry IGeomDB* m_pGeomDB ; // puntatore al DB geometrico Color m_colDef ; // colore di default Color m_colMark ; // colore per marcatura Color m_colSelSurf ; // colore di superficie selezionata // Superfici semitrasparenti ASURFVECTOR m_vAlphaSurf ; // vettore temporaneo di superfici semitrasparenti // Extension BBox3d m_b3ExtWorld ; // estensione della geometria nel riferimento globale (mondo) BBox3d m_b3ExtView ; // estensione nel riferimento di vista bool m_bExtViewOk ; // flag per stato aggiornamento di EView double m_dHalfWidth ; // semilarghezza della vista double m_dHalfHeight ; // semialtezza della vista double m_dZNear ; // distanza del piano di clipping vicino double m_dZFar ; // distanza del piano di clipping lontano // Grid bool m_bShowGrid ; // flag di visualizzazione della griglia bool m_bShowFrame ; // flag di visualizzazione del frame della griglia double m_dSnapStep ; // passo di snap 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 bool m_bShowGlobFrame ; // flag di visualizzazione del riferimento globale // Direct Color m_colorGL ; // colore per GeoLine bool m_bGeoLine ; // flag esistenza linea diretta in finestra Point3d m_ptGeoLineP1 ; // primo estremo della linea diretta Point3d m_ptGeoLineP2 ; // secondo estremo della linea diretta Color m_colorGT ; // colore per GeoTria bool m_bGeoTria ; // flag esistenza triangolo diretto in finestra Point3d m_ptGeoTriaP1 ; // primo estremo del triangolo diretto Point3d m_ptGeoTriaP2 ; // secondo estremo del triangolo diretto Point3d m_ptGeoTriaP3 ; // terzo estremo del triangolo diretto bool m_bOutlineWR ; // flag per disegno WinRect con solo contorno o pieno Color m_colorWR ; // colore per WinRect bool m_bWinRect ; // flag esistenza rettangolo diretto in finestra Point3d m_ptWinRectP1 ; // primo estremo del rettangolo diretto Point3d m_ptWinRectP2 ; // secondo estremo del rettangolo diretto } ;