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;
}
Exemple #4
0
/**
 * 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;
};