Files
Dario Sassi 4081ff7830 EgtGraphics 2.5l6 :
- aggiunta gestione disegno grid asimmetrica, impostabile con SetGridGeoAdv.
2024-01-09 18:30:04 +01:00

384 lines
21 KiB
C++

//----------------------------------------------------------------------------
// 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<AlphaSurf> 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
} ;