From cae0f2fc91e05518ef93a62c40554e0b03ca1522 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Tue, 5 Jan 2016 11:28:30 +0000 Subject: [PATCH] EgtGraphics 1.6l5 : - aggiunta gestione snap point a SurfFlatRegion. --- EgtGraphics.rc | Bin 11612 -> 11612 bytes Scene.h | 3 ++ SceneSnap.cpp | 105 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+) diff --git a/EgtGraphics.rc b/EgtGraphics.rc index 1677f1c0f6e075798ac49f5b57e529d1b242e156..2a12b9d178542a952ca9b621977b19ad2cd059c3 100644 GIT binary patch delta 119 zcmcZ;bth`WA2vqQ&41YhnHfzdGxF$8RuJ07Xf}DT)Wppl+%`Z#pxl0@$!U^#$nu+S U3!TO(w^!;cL=KCYV#;n@0FJvR+yDRo delta 119 zcmcZ;bth`WA2vqA&41YhnHdcyGxF$8RuJ07XgYbX)Wppl+%`Z#pxl0@$!U^#$nu+S U3!TO(w^!;cL=KCYV#;n@0EOcwxBvhE 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,