diff --git a/VolZmap.cpp b/VolZmap.cpp index ad12015..2227ed6 100644 --- a/VolZmap.cpp +++ b/VolZmap.cpp @@ -139,7 +139,7 @@ VolZmap::CopyFrom( const VolZmap& vzmSrc) // dimensiono membri legati ai blocchi m_BlockToUpdate = vzmSrc.m_BlockToUpdate ; - m_BlockUpGradingCounter = vzmSrc.m_BlockUpGradingCounter ; + m_BlockUpdatingCounter = vzmSrc.m_BlockUpdatingCounter ; m_InterBlockVox = vzmSrc.m_InterBlockVox ; m_InterBlockOriginalSharpTria = vzmSrc.m_InterBlockOriginalSharpTria ; m_InterBlockToBeFlippedSharpTria = vzmSrc.m_InterBlockToBeFlippedSharpTria ; @@ -388,7 +388,7 @@ VolZmap::Load( NgeReader& ngeIn) // imposto aggiornamento obbligatorio su tutti i blocchi m_BlockToUpdate.resize( m_nNumBlock, true) ; - m_BlockUpGradingCounter.resize( m_nNumBlock + ( m_nMapNum == 1 ? 0 : 1), 0) ; + m_BlockUpdatingCounter.resize( m_nNumBlock + ( m_nMapNum == 1 ? 0 : 1), 0) ; // per triangoli di feature di frontiera tra blocchi m_InterBlockVox.resize( m_nNumBlock) ; @@ -1113,7 +1113,7 @@ VolZmap::ClonePart( int nPart) const pVolume->m_nNumBlock = pVolume->m_nFracLin[0] * pVolume->m_nFracLin[1] * pVolume->m_nFracLin[2] ; pVolume->m_BlockToUpdate.resize( pVolume->m_nNumBlock, true) ; // Dimensiono il vettore dei contatori degli aggiornamenti della grafica dei blocchi - pVolume->m_BlockUpGradingCounter.resize( pVolume->m_nNumBlock + 1, 0) ; + pVolume->m_BlockUpdatingCounter.resize( pVolume->m_nNumBlock + 1, 0) ; // Dimensiono raccolta di voxel di confine pVolume->m_InterBlockVox.resize( pVolume->m_nNumBlock) ; // Dimensiono raccolta triangoli di feature tra blocchi @@ -1601,7 +1601,7 @@ VolZmap::Compact( void) m_nNumBlock = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ; m_BlockToUpdate.resize( m_nNumBlock, true) ; // Dimensiono il vettore dei contatori di aggiornamenti dei blocchi - m_BlockUpGradingCounter.resize( m_nNumBlock, 0) ; + m_BlockUpdatingCounter.resize( m_nNumBlock, 0) ; // Dimensiono raccolta di voxel di confine m_InterBlockVox.resize( m_nNumBlock) ; // Dimensiono raccolta triangoli di feature tra blocchi diff --git a/VolZmap.h b/VolZmap.h index 49d8aed..81d57bf 100644 --- a/VolZmap.h +++ b/VolZmap.h @@ -189,8 +189,8 @@ class VolZmap : public IVolZmap, public IGeoObjRW bool AddDexelSideFace( int nPos, int nPosAdj, const Point3d& ptP, const Point3d& ptQ, const Vector3d& vtZ, const Vector3d& vtNorm, int nBlock) const ; bool ProcessCell( int nGrid, int nCellI, int nCellJ, const Plane3d& plPlane, std::vector& vLine) const ; - bool UpGradeGraphics( bool bAllBlocks, INTVECTOR& nModifiedBlocks) const ; - bool UpGradeGraphicsSingleMap( bool bAllBlocks, INTVECTOR& nModifiedBlocks) const ; + bool UpdateTripleMapGraphics( INTVECTOR& nModifiedBlocks) const ; + bool UpdateSingleMapGraphics( INTVECTOR& nModifiedBlocks) const ; bool ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const ; bool RegulateFeaturesChain( std::vector& vVecVox) const ; bool CreateSharpFeatureTriangle( int nBlock, const VoxelContainer& vVox) const ; @@ -389,7 +389,7 @@ class VolZmap : public IVolZmap, public IGeoObjRW int m_nNumBlock ; // Numero totale di blocchi mutable BOOLVECTOR m_BlockToUpdate ; - mutable INTVECTOR m_BlockUpGradingCounter ; + mutable INTVECTOR m_BlockUpdatingCounter ; int m_nConnectedCompoCount ; // Se == - 1 il numero di componenti non è noto // Se >= 0 è il numero di componenti connesse diff --git a/VolZmapCalculus.cpp b/VolZmapCalculus.cpp index 6822448..aebd0f6 100644 --- a/VolZmapCalculus.cpp +++ b/VolZmapCalculus.cpp @@ -410,13 +410,8 @@ VolZmap::GetDepthWithVoxel( const Point3d& ptP, const Vector3d& vtD, double& dIn } // Se la grafica non è aggiornata la ricalcolo - bool bUpGrade = false ; - for ( int nBl = 0 ; nBl < int( m_nNumBlock) ; ++ nBl) { - bUpGrade = bUpGrade || m_BlockToUpdate[nBl] ; - } INTVECTOR nModifiedBlocks ; - if ( bUpGrade) - UpGradeGraphics( false, nModifiedBlocks) ; + UpdateTripleMapGraphics( nModifiedBlocks) ; // Determino il voxel di partenza int nVoxI, nVoxJ, nVoxK ; diff --git a/VolZmapCreation.cpp b/VolZmapCreation.cpp index ee2970a..f38c9c9 100644 --- a/VolZmapCreation.cpp +++ b/VolZmapCreation.cpp @@ -137,8 +137,8 @@ VolZmap::Create( const Point3d& ptO, double dLengthX, double dLengthY, double dL m_nNumBlock = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ; m_BlockToUpdate.clear() ; m_BlockToUpdate.resize( m_nNumBlock, true) ; - m_BlockUpGradingCounter.clear() ; - m_BlockUpGradingCounter.resize( m_nNumBlock + ( m_nMapNum == 1 ? 0 : 1), 0) ; + m_BlockUpdatingCounter.clear() ; + m_BlockUpdatingCounter.resize( m_nNumBlock + ( m_nMapNum == 1 ? 0 : 1), 0) ; // Tipologia m_nShape = BOX ; @@ -451,8 +451,8 @@ VolZmap::CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double m_nNumBlock = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ; m_BlockToUpdate.clear() ; m_BlockToUpdate.resize( m_nNumBlock, true) ; - m_BlockUpGradingCounter.clear() ; - m_BlockUpGradingCounter.resize( m_nNumBlock + ( m_nMapNum == 1 ? 0 : 1), 0) ; + m_BlockUpdatingCounter.clear() ; + m_BlockUpdatingCounter.resize( m_nNumBlock + ( m_nMapNum == 1 ? 0 : 1), 0) ; // Dimensiono raccolta di voxel, triangoli di feature tra blocchi e di segnalatori di materiale fra voxel m_InterBlockVox.resize( m_nNumBlock) ; @@ -654,8 +654,8 @@ VolZmap::CreateFromTriMesh( const ISurfTriMesh& Surf, double dStep, bool bTriDex m_nNumBlock = m_nFracLin[0] * m_nFracLin[1] * m_nFracLin[2] ; m_BlockToUpdate.clear() ; m_BlockToUpdate.resize( m_nNumBlock, true) ; - m_BlockUpGradingCounter.clear() ; - m_BlockUpGradingCounter.resize( m_nNumBlock + ( m_nMapNum == 1 ? 0 : 1), 0) ; + m_BlockUpdatingCounter.clear() ; + m_BlockUpdatingCounter.resize( m_nNumBlock + ( m_nMapNum == 1 ? 0 : 1), 0) ; // Dimensiono raccolta di voxel, triangoli di feature tra blocchi e di segnalatori di materiale fra voxel m_InterBlockVox.resize( m_nNumBlock) ; diff --git a/VolZmapGraphics.cpp b/VolZmapGraphics.cpp index 7c4aae5..0c6dae9 100644 --- a/VolZmapGraphics.cpp +++ b/VolZmapGraphics.cpp @@ -19,8 +19,8 @@ #include "MC_Tables.h" #include "PolygonPlane.h" #include "/EgtDev/Include/EGkIntervals.h" -#include "/EgtDev/Include/EgtNumUtils.h" #include "/EgtDev/Include/EGkStringUtils3d.h" +#include "/EgtDev/Include/EgtNumUtils.h" #include "/EgtDev/Extern/Eigen/Core" #include "/EgtDev/Extern/Eigen/SVD" @@ -30,7 +30,7 @@ using namespace std ; static const int MAX_FAN_BASE_VERTS = 7 ; typedef Eigen::Matrix SvdMatrix ; typedef Eigen::Matrix SvdVector ; -typedef Eigen::JacobiSVD SvdDecomposer ; +typedef Eigen::JacobiSVD SvdDecomposer ; // ------------------------- TABELLA BLOCCHI ADIACENTI ---------------------------------------------------------------------------- static int NeighbourTable[8][4] = { @@ -481,24 +481,19 @@ VolZmap::GetAllTriangles( TRIA3DEXLIST& lstTria) const bool VolZmap::GetTriangles( bool bAllBlocks, INTVECTOR& nModifiedBlocks, TRIA3DEXLISTVECTOR& vLstTria) const { - // Se nessun blocco modificato, è richiesta esterna e li considero tutti modificati - bool bSomeModif = false ; - for ( int i = 0 ; i < m_nNumBlock ; ++ i) { - if ( m_BlockToUpdate[i]) { - bSomeModif = true ; - break ; - } - } - if ( ! bSomeModif) - bAllBlocks = true ; - // Caso di singola mappa if ( m_nMapNum == 1) { nModifiedBlocks.resize( m_nNumBlock) ; vLstTria.reserve( m_nNumBlock) ; - UpGradeGraphicsSingleMap( bAllBlocks, nModifiedBlocks) ; + UpdateSingleMapGraphics( nModifiedBlocks) ; + + // Se richiesti tutti, dichiaro tutti modificati + if ( bAllBlocks) { + for ( int i = 0 ; i < m_nNumBlock ; ++ i) + nModifiedBlocks[i] = i ; + } for ( int t = 0 ; t < m_nNumBlock ; ++ t) { if ( nModifiedBlocks[t] >= 0) { @@ -512,10 +507,16 @@ VolZmap::GetTriangles( bool bAllBlocks, INTVECTOR& nModifiedBlocks, TRIA3DEXLIST // Caso con tre mappe else { - nModifiedBlocks.resize( m_nNumBlock + 1) ; - vLstTria.reserve( m_nNumBlock + 1) ; + UpdateTripleMapGraphics( nModifiedBlocks) ; - UpGradeGraphics( bAllBlocks, nModifiedBlocks) ; + // Se richiesti tutti, dichiaro tutti modificati + if ( bAllBlocks) { + for ( int i = 0 ; i < m_nNumBlock + 1 ; ++ i) + nModifiedBlocks[i] = i ; + } + + // Alloco lo spazio + vLstTria.reserve( m_nNumBlock + 1) ; // Calcolo i triangoli sui blocchi for ( int t = 0 ; t < m_nNumBlock ; ++ t) { @@ -549,15 +550,6 @@ VolZmap::GetTriangles( bool bAllBlocks, INTVECTOR& nModifiedBlocks, TRIA3DEXLIST for ( int t2 = 0 ; t2 < int( m_BlockSharpTria[t][t1].vCompoTria.size()) ; ++ t2) { // ciclo sui triangoli delle componenti connesse for ( int t3 = 0 ; t3 < int( m_BlockSharpTria[t][t1].vCompoTria[t2].size()) ; ++ t3) { - // Controllo normali - Vector3d vtN = m_BlockSharpTria[t][t1].vCompoTria[t2][t3].GetN() ; - bool bNormN = vtN.IsNormalized() ; - for ( int nV = 0 ; nV < 3 ; ++ nV) { - Vector3d vtNV = m_BlockSharpTria[t][t1].vCompoTria[t2][t3].GetVertexNorm( nV) ; - bool bNormV = vtNV.IsNormalized() ; - if ( bNormN && bNormV && vtN * vtNV < 0.7) - m_BlockSharpTria[t][t1].vCompoTria[t2][t3].SetVertexNorm( nV, vtN) ; - } // aggiungo triangolo alla lista vLstTria[nModifiedBlocks[t]].emplace_back( m_BlockSharpTria[t][t1].vCompoTria[t2][t3]) ; } @@ -567,7 +559,7 @@ VolZmap::GetTriangles( bool bAllBlocks, INTVECTOR& nModifiedBlocks, TRIA3DEXLIST } // Inserisco in lista i triangoli di frontiera tra feature di blocchi diversi - if ( nModifiedBlocks[nModifiedBlocks.size() - 1] >= 0) { + if ( nModifiedBlocks[m_nNumBlock] >= 0) { vLstTria.resize( vLstTria.size() + 1) ; int nPos = int( vLstTria.size()) - 1 ; for ( int t = 0 ; t < int( m_InterBlockToBeFlippedSharpTria.size()) ; ++ t) { @@ -575,22 +567,12 @@ VolZmap::GetTriangles( bool bAllBlocks, INTVECTOR& nModifiedBlocks, TRIA3DEXLIST for ( int t2 = 0 ; t2 < int( m_InterBlockToBeFlippedSharpTria[t][t1].vCompoTria.size()) ; ++ t2) { for ( int t3 = 0 ; t3 < int( m_InterBlockToBeFlippedSharpTria[t][t1].vCompoTria[t2].size()) ; ++ t3) { if ( m_InterBlockToBeFlippedSharpTria[t][t1].vCompoTria[t2][t3].GetArea() > SQ_EPS_SMALL) { - // Controllo normali - Vector3d vtN = m_InterBlockToBeFlippedSharpTria[t][t1].vCompoTria[t2][t3].GetN() ; - bool bNormN = vtN.IsNormalized() ; - for ( int nV = 0 ; nV < 3 ; ++ nV) { - Vector3d vtNV = m_InterBlockToBeFlippedSharpTria[t][t1].vCompoTria[t2][t3].GetVertexNorm( nV) ; - bool bNormV = vtNV.IsNormalized() ; - if ( bNormN && bNormV && vtN * vtNV < 0.7) - m_InterBlockToBeFlippedSharpTria[t][t1].vCompoTria[t2][t3].SetVertexNorm( nV, vtN) ; - } // aggiungo triangolo alla lista vLstTria[nPos].emplace_back( m_InterBlockToBeFlippedSharpTria[t][t1].vCompoTria[t2][t3]) ; } } } } - m_InterBlockToBeFlippedSharpTria[t].clear() ; } } } @@ -798,20 +780,9 @@ VolZmap::AddDexelSideFace( int nPos, int nPosAdj, const Point3d& ptP, const Poin //---------------------------------------------------------------------------- bool -VolZmap::UpGradeGraphics( bool bAllBlocks, INTVECTOR& nModifiedBlocks) const +VolZmap::UpdateTripleMapGraphics( INTVECTOR& nModifiedBlocks) const { - // Se nessun blocco modificato, è richiesta esterna e li considero tutti modificati - bool bSomeModif = false ; - for ( int i = 0 ; i < m_nNumBlock ; ++ i) { - if ( m_BlockToUpdate[i]) { - bSomeModif = true ; - break ; - } - } - if ( ! bSomeModif) - bAllBlocks = true ; - - nModifiedBlocks.resize( m_nNumBlock + 1) ; + nModifiedBlocks.resize( m_nNumBlock + 1, -1) ; vector vVoxContainerVec ; vVoxContainerVec.resize( m_nNumBlock) ; @@ -894,71 +865,100 @@ VolZmap::UpGradeGraphics( bool bAllBlocks, INTVECTOR& nModifiedBlocks) const } } - bool bCalcInterBlock = false ; - - int nUpDatedBlockCount = 0 ; - // Calcolo i triangoli sui blocchi + int nUpdatedBlockCount = 0 ; for ( int t = 0 ; t < m_nNumBlock ; ++ t) { // Se il blocco deve essere processato - if ( bAllBlocks || m_BlockToUpdate[t]) { + if ( m_BlockToUpdate[t]) { // processo ... - nModifiedBlocks[t] = nUpDatedBlockCount ; - ++ nUpDatedBlockCount ; + nModifiedBlocks[t] = nUpdatedBlockCount ; + ++ nUpdatedBlockCount ; ExtMarchingCubes( int( t), vVoxContainerVec[t]) ; } - else - nModifiedBlocks[t] = -1 ; } // Regolarizzo la catena RegulateFeaturesChain( vVoxContainerVec) ; // Costruisco i triangoli di feature + bool bCalcInterBlock = false ; for ( int t = 0 ; t < int( m_nNumBlock) ; ++ t) { // Se il blocco è stato processato - if ( bAllBlocks || m_BlockToUpdate[t]) { + if ( m_BlockToUpdate[t]) { CreateSharpFeatureTriangle( t, vVoxContainerVec[t]) ; - ++ m_BlockUpGradingCounter[t] ; + ++ m_BlockUpdatingCounter[t] ; // Flipping fra voxel interni FlipEdgesII( t) ; bCalcInterBlock = true ; m_BlockToUpdate[t] = false ; + // Sistemo le normali ai vertici (ciclo sui voxel) + for ( int t1 = 0 ; t1 < int( m_BlockSharpTria[t].size()) ; ++ t1) { + // ciclo sulle componenti connesse del voxel + for ( int t2 = 0 ; t2 < int( m_BlockSharpTria[t][t1].vCompoTria.size()) ; ++ t2) { + // ciclo sui triangoli delle componenti connesse + for ( int t3 = 0 ; t3 < int( m_BlockSharpTria[t][t1].vCompoTria[t2].size()) ; ++ t3) { + // Controllo normali + Vector3d vtN = m_BlockSharpTria[t][t1].vCompoTria[t2][t3].GetN() ; + bool bNormN = vtN.IsNormalized() ; + for ( int nV = 0 ; nV < 3 ; ++ nV) { + Vector3d vtNV = m_BlockSharpTria[t][t1].vCompoTria[t2][t3].GetVertexNorm( nV) ; + bool bNormV = vtNV.IsNormalized() ; + if ( bNormN && bNormV && vtN * vtNV < 0.7) + m_BlockSharpTria[t][t1].vCompoTria[t2][t3].SetVertexNorm( nV, vtN) ; + } + } + } + } } } - // Calcolo i triangoli di frontiera tra feature di blocchi diversi - // copio i triangoli di frontiera in una matrice gemella - // di m_InterBlockTria per avere sempre a disposizione i triangoli non flippati. + // Calcolo i triangoli di frontiera tra feature di blocchi diversi (lavoro su copia e conservo gli originali) SharpTriaMatrix InterBlockTria ; if ( bCalcInterBlock) { + // Eseguo m_InterBlockToBeFlippedSharpTria = m_InterBlockOriginalSharpTria ; - ++ m_BlockUpGradingCounter[m_nNumBlock] ; + ++ m_BlockUpdatingCounter[m_nNumBlock] ; FlipEdgesBB() ; + // Aggiungo indice modificati + nModifiedBlocks.back() = nUpdatedBlockCount ; + // Sistemo le normali ai vertici + for ( int t = 0 ; t < int( m_InterBlockToBeFlippedSharpTria.size()) ; ++ t) { + for ( int t1 = 0 ; t1 < int( m_InterBlockToBeFlippedSharpTria[t].size()) ; ++ t1) { + for ( int t2 = 0 ; t2 < int( m_InterBlockToBeFlippedSharpTria[t][t1].vCompoTria.size()) ; ++ t2) { + for ( int t3 = 0 ; t3 < int( m_InterBlockToBeFlippedSharpTria[t][t1].vCompoTria[t2].size()) ; ++ t3) { + if ( m_InterBlockToBeFlippedSharpTria[t][t1].vCompoTria[t2][t3].GetArea() > SQ_EPS_SMALL) { + // Controllo normali + Vector3d vtN = m_InterBlockToBeFlippedSharpTria[t][t1].vCompoTria[t2][t3].GetN() ; + bool bNormN = vtN.IsNormalized() ; + for ( int nV = 0 ; nV < 3 ; ++ nV) { + Vector3d vtNV = m_InterBlockToBeFlippedSharpTria[t][t1].vCompoTria[t2][t3].GetVertexNorm( nV) ; + bool bNormV = vtNV.IsNormalized() ; + if ( bNormN && bNormV && vtN * vtNV < 0.7) + m_InterBlockToBeFlippedSharpTria[t][t1].vCompoTria[t2][t3].SetVertexNorm( nV, vtN) ; + } + } + } + } + } + } } - // Inserisco in lista i triangoli di frontiera tra feature di blocchi diversi - if ( bCalcInterBlock) - nModifiedBlocks.back() = nUpDatedBlockCount ; - else - nModifiedBlocks.back() = - 1 ; - return true ; } //---------------------------------------------------------------------------- bool -VolZmap::UpGradeGraphicsSingleMap( bool bAllBlocks, INTVECTOR& nModifiedBlocks) const +VolZmap::UpdateSingleMapGraphics( INTVECTOR& nModifiedBlocks) const { const int MAX_DIM_CHUNK = 128 ; - int nUpDatedBlockCount = 0 ; + int nUpdatedBlockCount = 0 ; // Ciclo sui blocchi for ( int t = 0 ; t < m_nNumBlock ; ++ t) { // Se il blocco deve essere aggiornato, eseguo - if ( bAllBlocks || m_BlockToUpdate[t]) { + if ( m_BlockToUpdate[t]) { m_SingleMapTria[t].clear() ; @@ -985,11 +985,11 @@ VolZmap::UpGradeGraphicsSingleMap( bool bAllBlocks, INTVECTOR& nModifiedBlocks) } } - ++ m_BlockUpGradingCounter[t] ; + ++ m_BlockUpdatingCounter[t] ; - nModifiedBlocks[t] = nUpDatedBlockCount ; + nModifiedBlocks[t] = nUpdatedBlockCount ; - ++ nUpDatedBlockCount ; + ++ nUpdatedBlockCount ; m_BlockToUpdate[t] = false ; }