4081ff7830
- aggiunta gestione disegno grid asimmetrica, impostabile con SetGridGeoAdv.
384 lines
21 KiB
C++
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
|
|
} ;
|