EgtGeomKernel 2.2f6 :

- in calcolo triangoli Zmap parallelizzato calcolo ExtMarchingCubes.
This commit is contained in:
Dario Sassi
2020-06-23 09:26:59 +00:00
parent 94b16e2e29
commit 1c0749e0aa
4 changed files with 43 additions and 10 deletions
+37 -6
View File
@@ -24,6 +24,8 @@
#include "/EgtDev/Include/EgtNumUtils.h"
#include "/EgtDev/Extern/Eigen/Core"
#include "/EgtDev/Extern/Eigen/SVD"
#include <thread>
#include <future>
using namespace std ;
@@ -916,11 +918,25 @@ VolZmap::UpdateTripleMapGraphics( void) const
}
// Calcolo i triangoli sui blocchi
for ( int t = 0 ; t < m_nNumBlock ; ++ t) {
int nBlockUpdated = 0 ;
vector< future<bool>> vRes ;
vRes.resize( m_nNumBlock) ;
for ( int i = 0 ; i < m_nNumBlock ; ++ i) {
// Se il blocco deve essere processato
if ( m_BlockToUpdate[t]) {
if ( m_BlockToUpdate[i]) {
// processo ...
ExtMarchingCubes( int( t), vVoxContainerVec[t]) ;
++ nBlockUpdated ;
vRes[i] = async( launch::async, &VolZmap::ExtMarchingCubes, this, i, ref( vVoxContainerVec[i])) ;
}
}
bool bOk = true ;
int nTerminated = 0 ;
while ( nTerminated < nBlockUpdated) {
for ( int i = 0 ; i < m_nNumBlock ; ++ i) {
if ( m_BlockToUpdate[i] && vRes[i].valid() && vRes[i].wait_for( chrono::microseconds{ 1 }) == future_status::ready) {
bOk = vRes[i].get() && bOk ;
++ nTerminated ;
}
}
}
@@ -1205,11 +1221,13 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const
bDefTopology = true ;
}
if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) {
SliceMutex.lock() ;
auto it = m_SliceYZ[nSlBlockN].find( nSliceN) ;
if ( it != m_SliceYZ[nSlBlockN].end()) {
bMatOnSlice = it->second ;
bDefTopology = true ;
}
SliceMutex.unlock() ;
}
}
else if ( abs( nAdjVox3[nCount]) == 2) {
@@ -1219,11 +1237,13 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const
bDefTopology = true ;
}
if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) {
SliceMutex.lock() ;
auto it = m_SliceXZ[nSlBlockN].find( nSliceN) ;
if ( it != m_SliceXZ[nSlBlockN].end()) {
bMatOnSlice = it->second ;
bDefTopology = true ;
}
SliceMutex.unlock() ;
}
}
else if ( abs( nAdjVox3[nCount]) == 3) {
@@ -1233,11 +1253,13 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const
bDefTopology = true ;
}
if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) {
SliceMutex.lock() ;
auto it = m_SliceXY[nSlBlockN].find( nSliceN) ;
if ( it != m_SliceXY[nSlBlockN].end()) {
bMatOnSlice = it->second ;
bDefTopology = true ;
}
SliceMutex.unlock() ;
}
}
}
@@ -1301,20 +1323,29 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const
if ( abs(nAdjVox3[nCount]) == 1) {
if ( nSlBlockN == nBlock)
SliceYZ.emplace( nSliceN, bMatOnSlice) ;
else
else {
SliceMutex.lock() ;
m_SliceYZ[nSlBlockN].emplace( nSliceN, bMatOnSlice) ;
SliceMutex.unlock() ;
}
}
else if ( abs(nAdjVox3[nCount]) == 2) {
if ( nSlBlockN == nBlock)
SliceXZ.emplace( nSliceN, bMatOnSlice) ;
else
else {
SliceMutex.lock() ;
m_SliceXZ[nSlBlockN].emplace( nSliceN, bMatOnSlice) ;
SliceMutex.unlock() ;
}
}
else if ( abs(nAdjVox3[nCount]) == 3) {
if ( nSlBlockN == nBlock)
SliceXY.emplace(nSliceN, bMatOnSlice) ;
else
else {
SliceMutex.lock();
m_SliceXY[nSlBlockN].emplace( nSliceN, bMatOnSlice) ;
SliceMutex.unlock() ;
}
}
}