void IsoSurfacePolygonizer::prepareNextLevel() { if(m_currentLevel > 0) { const int lastLevelFaceCount = m_faceCount[m_currentLevel-1]; CompactIntArray prfaces; prfaces.add(0,0,lastLevelFaceCount); const size_t n = m_vertexArray.size(); for(size_t i = 0; i < n; i++) { const IsoSurfaceVertex &v = m_vertexArray[i]; if(hasSplitFaces(v, lastLevelFaceCount)) { const size_t fn = v.m_faceArray.size(); for(size_t j = 0; j < fn; j++) { const int findex = v.m_faceArray[j]; if(findex < lastLevelFaceCount) prfaces[findex]++; } } } const size_t faceCount = prfaces.size(); for(size_t i = 0; i < faceCount; i++) { if(prfaces[i] >= 2) { debugLog(_T("problem face[%5zu]:%d\n"), i, prfaces[i]); } } } while(!m_cubeStack[1].isEmpty()) { pushCube(m_cubeStack[1].pop()); } }
// testface: given cube at lattice (i, j, k), and four corners of face, // if surface crosses face, compute other four corners of adjacent cube // and add new cube to cube stack void IsoSurfacePolygonizer::testFace(int i, int j, int k, const StackedCube &oldCube, CubeFace face, CubeCorner c1, CubeCorner c2, CubeCorner c3, CubeCorner c4) { static int facebit[6] = {2, 2, 1, 1, 0, 0}; int bit = facebit[face]; bool c1Positive = oldCube.m_corners[c1]->m_positive; // test if no surface crossing, cube out of bounds, or already visited: if(oldCube.m_corners[c2]->m_positive == c1Positive && oldCube.m_corners[c3]->m_positive == c1Positive && oldCube.m_corners[c4]->m_positive == c1Positive) { return; } // create new cube: StackedCube newCube(i, j, k,0); if(!addToDoneSet(newCube.m_key)) { return; } newCube.m_corners[FLIP(c1, bit)] = oldCube.m_corners[c1]; newCube.m_corners[FLIP(c2, bit)] = oldCube.m_corners[c2]; newCube.m_corners[FLIP(c3, bit)] = oldCube.m_corners[c3]; newCube.m_corners[FLIP(c4, bit)] = oldCube.m_corners[c4]; for(int n = 0; n < ARRAYSIZE(newCube.m_corners); n++) { if(newCube.m_corners[n] == NULL) { newCube.m_corners[n] = getCorner(i+BIT(n,2), j+BIT(n,1), k+BIT(n,0)); } } if( !m_boundingBox.contains(*newCube.m_corners[LBN]) || !m_boundingBox.contains(*newCube.m_corners[RTF])) { return; } pushCube(newCube); }
bool IsoSurfacePolygonizer::putInitialCube() { StackedCube cube(0,0,0, 0); m_cornerMap.clear(); // set corners of initial cube: for(int i = 0; i < ARRAYSIZE(cube.m_corners); i++) { cube.m_corners[i] = getCorner(BIT(i,2), BIT(i,1), BIT(i,0)); } if(cube.intersectSurface()) { addToDoneSet(cube.m_key); pushCube(cube); return true; } return false; }
/** * Produces a new dynamic scene for every frame */ int step_compute_dynamic_scene::execute (const int & frame, ray_tracer & rt ) const { int current_frame = frame; // Consume - nothing to consume // Execute std::vector<Primitive*> dynamic_scene; pushCube(dynamic_scene, (0.1*current_frame)); // Produce rt.dynamic_scene.put(current_frame, dynamic_scene); return CnC::CNC_Success; };