//---------------------------------------------------------------------------- // EgalTech 2013-2014 //---------------------------------------------------------------------------- // File : Scene.h Data : 03.02.14 Versione : 1.5b1 // 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 IExtText ; 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 ; int nAlpha ; bool bShowAux ; double dZmin ; double dZmax ; AlphaSurf( const Frame3d& frMV, ObjEGrGraphics* pG, int nS, int nM, int nA, bool bSA, double dZm, double dZM) : frModView( frMV), pGraph( pG), nStat( nS), nMark( nM), nAlpha( nA), bShowAux( bSA), dZmin( dZm), dZmax( dZM) {} } ; typedef std::vector ASURFVECTOR ; //---------------------------------------------------------------------------- class Scene : public IEGrScene { public : // Basic virtual ~Scene( void) ; virtual bool Init( IGeomDB* pGeomDB) ; virtual bool CreateContext( HDC hDC, int nDriver, bool b2Buff, int nColorBits, int nDepthBits) ; virtual bool IsValid( void) { return ( m_hDC != nullptr && m_hRC != nullptr) ; } virtual std::string GetOpenGLInfo( void) ; virtual std::string GetGLSLInfo( void) ; virtual std::string GetPixelFormatInfo( void) ; virtual IGeomDB* GetGeomDB( void) { return m_pGeomDB ; } virtual bool RedrawWindow( void) ; virtual bool Resize( int nW, int nH) ; virtual bool SetBackground( Color colBackTop, Color colBackBottom) ; virtual bool Draw( void) ; virtual bool Project( const Point3d& ptWorld, Point3d& ptView) ; virtual bool UnProject( const Point3d& ptView, Point3d& ptWorld) ; virtual void Destroy( void) ; // Camera virtual bool SetCenter( const Point3d& ptCenter) ; virtual bool SetCamera( double dAngVertDeg, double dAngOrizzDeg, double dDist) ; virtual bool SetCamera( int nDir, double dDist = 0) ; virtual const Point3d& GetCenter( void) { return m_ptCenter ; } virtual Point3d GetProjectedCenter( void) ; virtual void GetCamera( double* pdAngVertDeg, double* pdAngOrizzDeg, double* pdDist = nullptr) ; virtual int GetCameraDir( void) ; virtual bool PanCamera( const Point3d& ptWinOld, const Point3d& ptWinNew) ; virtual bool RotateCamera( const Point3d& ptWinOld, const Point3d& ptWinNew) ; virtual bool ZoomAll( void) ; virtual bool ZoomRadius( double dRadius) ; virtual bool ZoomChange( double dCoeff) ; virtual bool ZoomOnPoint( const Point3d& ptWin, double dCoeff) ; virtual bool ZoomWin( const Point3d& ptWin1, const Point3d& ptWin2) ; // ShowMode virtual bool SetShowMode( int nShowMode) { if ( nShowMode != SM_WIREFRAME && nShowMode != SM_HIDDENLINE && nShowMode != SM_SHADING) return false ; m_nShowMode = nShowMode ; return true ; } virtual int GetShowMode( void) { return m_nShowMode ; } virtual void SetShowCurveDirection( bool bShow) { m_bShowCurveDirection = bShow ; } virtual bool GetShowCurveDirection( void) { return m_bShowCurveDirection ; } virtual void SetShowTriaAdvanced( bool bAdvanced) { m_bShowTriaAdvanced = bAdvanced ; } virtual bool GetShowTriaAdvanced( void) { return m_bShowTriaAdvanced ; } virtual void SetShowZmap( int nMode) { m_nShowZmap = nMode ; } virtual int GetShowZmap( void) { return m_nShowZmap ; } // Geometry virtual bool SetExtension( const BBox3d& b3Ext) ; virtual bool UpdateExtension( void) ; virtual bool SetMark( Color colMark) ; virtual bool SetSelSurf( Color colSelSurf) ; // Grid virtual bool SetGridShow( bool bShowGrid, bool bShowFrame) ; virtual bool SetGridGeo( double dSnapStep, int nMinLineSstep, int nMajLineSstep, int nExtSstep) ; virtual bool SetGridColor( Color colMinLine, Color colMajLine) ; // Glob Frame virtual bool SetGlobFrameShow( bool bShow) ; // Direct virtual bool SetGeoLineAttribs( Color GLcol) ; virtual bool SetGeoLine( const Point3d& ptP1, const Point3d& ptP2) ; virtual bool ResetGeoLine( void) ; virtual bool SetGeoTriaAttribs( Color GTcol) ; virtual bool SetGeoTria( const Point3d& ptP1, const Point3d& ptP2, const Point3d& ptP3) ; virtual bool ResetGeoTria( void) ; virtual bool SetWinRectAttribs( bool bOutline, Color WRcol) ; virtual bool SetWinRect( const Point3d& ptWinRectP1, const Point3d& ptWinRectP2) ; virtual bool ResetWinRect( void) ; // Select virtual bool Select( const Point3d& ptView, int nW, int nH, int& nSel) ; virtual bool SetObjFilterForSelect( bool bZerodim, bool bCurve, bool bSurf, bool bVolume, bool bExtra) ; virtual bool UnselectableAdd( int nId) ; virtual bool UnselectableRemove( int nId) ; virtual bool UnselectableClearAll( void) ; virtual bool UnselectableFind( int nId) ; virtual bool GetSelectedObjs( INTVECTOR& nIds) ; virtual int GetFirstSelectedObj( void) ; virtual int GetNextSelectedObj( void) ; virtual double GetSelectedObjWinZ( int nSel = - 1) ; virtual double GetSelectedObjMinWinZ( int nSel = - 1) ; virtual bool GetPointFromSelect( int nSelId, const Point3d& ptView, Point3d& ptSel, int& nAux) ; // Snap // anche per lo snap valgono SetObjFilterForSelect e Unselectable* virtual bool GetGraphicSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Point3d& ptSel) ; virtual bool GetGridSnapPointZ( bool bSketch, const Point3d& ptWin, const Point3d& ptGrid, Point3d& ptSel) ; virtual int GetLastSnapId( void) { return m_nLastSnapId ; } virtual bool GetLastSnapDir( Vector3d& vtDir) { if ( ! m_bLastSnapDirOk) return false ; vtDir = m_vtLastSnapDir ; return true ; } // Texture virtual bool LoadTexture( const std::string& sName, const std::string& sFile, double dMMxPix, double dDimX, double dDimY, int nRepeat) ; virtual bool UnloadTexture( const std::string& sName) ; virtual bool UnloadAllTextures( void) ; virtual bool ExistsTexture( const std::string& sName) ; virtual bool GetTexturePixels( const std::string& sName, int& nWidth, int& nHeight) ; virtual bool GetTextureDimensions( const std::string& sName, double& dDimX, double& dDimY) ; virtual bool ChangeTextureDimensions( const std::string& sName, double dDimX, double dDimY) ; public : // Basic Scene( void) ; bool MakeCurrent( void) ; GLEWContext* glewGetContext( void) { return &m_glewc ; } int GetOpenGLver( void) { return m_nOglVer ; } // Geometry Color GetMark( void) { return m_colMark ; } Color GetSelSurf( void) { return m_colSelSurf ; } private : // Basic int ChooseGenPixelFormat( int nPfd, bool b2Buff, int nColorBits, int nDepthBits) ; WGLEWContext* wglewGetContext( void) { return &m_wglewc ; } bool CalcExtView( void) ; bool CalcDimViewFromExtView( void) ; bool AdjustDimView( double dHalfWidth, double dHalfHeight) ; bool CalcClippingPlanesFromExtView( void) ; 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) { 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) ; 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 FindTextSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3d& frEnt, const IExtText* pTxt, double& dMinSqDist) ; private : // Basic HDC m_hDC ; // Device Context HGLRC m_hRC ; // OpenGL Rendering Context WGLEWContext m_wglewc ; // WGLEW Context GLEWContext m_glewc ; // GLEW 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, 3=entrambi) // 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 ; // semialtezza della vista double m_dHalfHeight ; // semilarghezza 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 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 } ;