void Timer::printThreadTime(std::string name, TIME_FORMAT format) const { double time = getThreadTime(name); std::cout << "Timer:"; std::cout << name << " "; printLine(time,format); std::cout << std::endl; }
void IsoSurfacePolygonizer::saveStatistics(double startTime) { m_statistics.m_threadTime = getThreadTime() - startTime; m_statistics.m_vertexCount = (UINT)m_vertexArray.size(); m_statistics.m_cornerCount = (UINT)m_cornerMap.size(); m_statistics.m_edgeCount = (UINT)m_edgeMap.size(); m_statistics.m_hashStat = _T(" CornerMap:") + intArrayToString(m_cornerMap.getLength()) + _T("\n") + _T(" EdgeMap :") + intArrayToString(m_edgeMap.getLength()) + _T("\n") + _T(" DoneSet :") + intArrayToString(m_cubesDoneSet.getLength()) + _T("\n"); for(int i = 0; i < ARRAYSIZE(m_statistics.m_faceCount); i++) { m_statistics.m_faceCount[i] = m_faceCount[i]; } }
void IsoSurfacePolygonizer::polygonize(const Point3D &start ,double cellSize ,const Cube3D &boundingBox ,bool tetrahedralMode ,bool tetraOptimize4 ,bool adaptiveCellSize ) { const double startTime = getThreadTime(); m_cellSize = cellSize; m_boundingBox = boundingBox; m_delta = cellSize/(double)(RES*RES); m_tetrahedralMode = tetrahedralMode; m_tetraOptimize4 = tetraOptimize4; m_adaptiveCellSize = adaptiveCellSize; m_statistics.clear(); resetTables(); #ifdef _DEBUG _standardRandomGenerator->setSeed(87); #else randomize(); #endif // _DEBUG m_start = start; for(int i = 0; i < 10; i++) { m_start = findStartPoint(m_start); if(putInitialCube()) { break; } } m_vertexArray.setCapacity( HASHSIZE); m_cubesDoneSet.setCapacity(HASHSIZE); m_edgeMap.setCapacity( HASHSIZE); m_currentLevel = 0; while(hasActiveCubes()) { while(hasActiveCubes()) { // process active cubes until none left const StackedCube cube = getActiveCube(); #ifdef DEBUG_POLYGONIZER m_eval.markCurrentCube(cube); #endif // DEBUG_POLYGONIZER const bool done = addSurfaceVertices(cube); if(cube.getLevel() == 0) { // test six face directions, maybe add to stack: testFace(cube.m_key.i-1 , cube.m_key.j , cube.m_key.k , cube, LFACE, LBN, LBF, LTN, LTF); testFace(cube.m_key.i+1 , cube.m_key.j , cube.m_key.k , cube, RFACE, RBN, RBF, RTN, RTF); testFace(cube.m_key.i , cube.m_key.j-1 , cube.m_key.k , cube, BFACE, LBN, LBF, RBN, RBF); testFace(cube.m_key.i , cube.m_key.j+1 , cube.m_key.k , cube, TFACE, LTN, LTF, RTN, RTF); testFace(cube.m_key.i , cube.m_key.j , cube.m_key.k-1 , cube, NFACE, LBN, LTN, RBN, RTN); testFace(cube.m_key.i , cube.m_key.j , cube.m_key.k+1 , cube, FFACE, LBF, LTF, RBF, RTF); } if(!done) { splitCube(cube); } } m_faceCount[m_currentLevel] = (UINT)m_faceArray.size(); if(m_currentLevel>0) m_faceCount[m_currentLevel] -= m_faceCount[m_currentLevel-1]; prepareNextLevel(); m_currentLevel++; } saveStatistics(startTime); flushFaceArray(); #ifdef DUMP_STATISTICS debugLog(_T("%s\n"), m_statistics.toString().cstr()); #endif #ifdef DUMP_CORNERMAP dumpCornerMap(); #endif #ifdef DUMP_EDGEMAP dumpEdgeMap(); #endif #ifdef DUMP_VERTEXARRAY dumpVertexArray(); #endif #ifdef DUMP_FACEARRAY dumpFaceArray(); #endif }