diff --git a/EgtGraphics.rc b/EgtGraphics.rc index 1677f1c..2a12b9d 100644 Binary files a/EgtGraphics.rc and b/EgtGraphics.rc differ diff --git a/Scene.h b/Scene.h index c92b91f..b3fe89f 100644 --- a/Scene.h +++ b/Scene.h @@ -23,6 +23,7 @@ class IGdbIterator ; class ICurve ; class ICurveComposite ; class ISurfTriMesh ; +class ISurfFlatRegion ; class IExtText ; class ObjEGrGraphics ; @@ -232,6 +233,8 @@ class Scene : public IEGrScene 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) ; diff --git a/SceneSnap.cpp b/SceneSnap.cpp index 89a9798..225c3b4 100644 --- a/SceneSnap.cpp +++ b/SceneSnap.cpp @@ -24,6 +24,7 @@ #include "/EgtDev/Include/EGkCurveComposite.h" #include "/EgtDev/Include/EGkDistPointCurve.h" #include "/EgtDev/Include/EGkSurfTriMesh.h" +#include "/EgtDev/Include/EGkSurfFlatRegion.h" #include "/EgtDev/Include/EGkExtText.h" #include "/EgtDev/Include/EgkIntersCurves.h" #include "/EgtDev/Include/EGkIntersLineSurfTm.h" @@ -328,6 +329,14 @@ Scene::FindSelectedSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH) if ( FindSurfTMSnapPoint( nSnap, ptWin, nId, frEnt, pStm, dMinSqDist)) bFound = true ; } + // se superficie flat region + else if ( pGObj->GetType() == SRF_FLATRGN) { + // recupero la superficie + const ISurfFlatRegion* pSfr = GetSurfFlatRegion( pGObj) ; + // verifico i punti notevoli della regione + if ( FindSurfFRSnapPoint( nSnap, ptWin, nId, frEnt, pSfr, dMinSqDist)) + bFound = true ; + } // se testo else if ( pGObj->GetType() == EXT_TEXT) { // recupero il testo @@ -768,6 +777,102 @@ Scene::FindSurfTMSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram return bFound ; } +//---------------------------------------------------------------------------- +bool +Scene::FindSurfFRSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3d& frEnt, + const ISurfFlatRegion* pSfr, double& dMinSqDist) +{ + // il punto di riferimento deriva da XY su viewport e Z minima (più vicina a osservatore) da selezione + Point3d ptWinZ( ptWin.x, ptWin.y, GetSelectedObjMinWinZ()) ; + // punto di riferimento nello spazio geometrico 3d + Point3d ptRef ; + if ( ! UnProject( ptWinZ, ptRef)) + return false ; + // porto il punto nel riferimento della superficie + ptRef.ToLoc( frEnt) ; + // recupero la direzione di mira e la porto nel riferimento della superficie + Vector3d vtDir = - m_vtDirCamera ; + vtDir.ToLoc( frEnt) ; + + // determino se oggetto trasparente + Color cCol ; + bool bAlpha = ( m_pGeomDB->GetCalcMaterial( nId, cCol) && cCol.GetIntAlpha() <= ALPHA_LIM) ; + + // se richiesto il centro di gravità (baricentro, centroide) + if ( nSnap == SP_CENTROID) { + Point3d ptP ; + bool bFound = false ; + if ( pSfr->GetCentroid( ptP)) { + // il punto di confronto è quello sulla linea di mira a minima distanza dal centro + Point3d ptCfr = ptRef + (( ptP - ptRef) * vtDir) * vtDir ; + // determino la distanza e la confronto con il minimo + double dSqDist = SqDist( ptP, ptCfr) ; + if ( dSqDist < dMinSqDist) { + bFound = true ; + dMinSqDist = dSqDist ; + m_nLastSnapId = nId ; + m_ptLastSnapPnt = ptP ; + m_ptLastSnapPnt.ToGlob( frEnt) ; + m_bLastSnapDirOk = false ; + } + } + // se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive + if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME)) + dMinSqDist = 0 ; + return bFound ; + } + // se richiesto il centro (è il centroide del chunk più vicino) + else if ( nSnap == SP_CENTER) { + Point3d ptP ; + bool bFound = false ; + for ( int i = 0 ; i < pSfr->GetChunkCount() ; ++ i) { + if ( pSfr->GetChunkCentroid( i, ptP)) { + // il punto di confronto è quello sulla linea di mira a minima distanza dal centro + Point3d ptCfr = ptRef + (( ptP - ptRef) * vtDir) * vtDir ; + // determino la distanza e la confronto con il minimo + double dSqDist = SqDist( ptP, ptCfr) ; + if ( dSqDist < dMinSqDist) { + bFound = true ; + dMinSqDist = dSqDist ; + m_nLastSnapId = nId ; + m_ptLastSnapPnt = ptP ; + m_ptLastSnapPnt.ToGlob( frEnt) ; + m_bLastSnapDirOk = false ; + } + } + } + // se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive + if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME)) + dMinSqDist = 0 ; + return bFound ; + } + + // cerco sui contorni della regione + bool bFound = false ; + for ( int i = 0 ; i < pSfr->GetChunkCount() ; ++ i) { + for ( int j = 0 ; j < pSfr->GetLoopCount( i) ; ++ j) { + ICurve* pCrv = pSfr->GetLoop( i, j) ; + if ( pCrv == nullptr) + return false ; + if ( pCrv->GetType() == CRV_COMPO) { + ICurveComposite* pCrvCompo = GetCurveComposite( pCrv) ; + if ( FindCurveCompoSnapPoint( nSnap, ptWin, nId, frEnt, pCrvCompo, dMinSqDist)) + bFound = true ; + } + else { + if ( FindCurveSnapPoint( nSnap, ptWin, nId, frEnt, pCrv, dMinSqDist)) + bFound = true ; + } + } + } + + // se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive + if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME)) + dMinSqDist = 0 ; + + return bFound ; +} + //---------------------------------------------------------------------------- bool Scene::FindTextSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Frame3d& frEnt,