d35475a6c8
- aggiunta gestione flag ShowZmap (solo surf, solo linee, entrambe).
331 lines
17 KiB
C++
331 lines
17 KiB
C++
//----------------------------------------------------------------------------
|
|
// 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<AlphaSurf> 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
|
|
} ;
|