Wiki

Clone wiki

PolyVox / Rendering a volume in Ogre


Last tested version of PolyVox: Unknown


It is assumed that you have an already fully working ogre SceneManager called ogreSceneManager

Ogre::ManualObject* ogreMesh;
// create something to draw the PolyVox stuff to
ogreMesh = ogreSceneManager->createManualObject("PolyVox Mesh");
// YES we do intend to change the mesh later -.-
ogreMesh->setDynamic(true);
ogreMesh->begin("BaseWhiteNoLighting", Ogre::RenderOperation::OT_TRIANGLE_LIST);
{
    // do nothing, this will be updated
}
ogreMesh->end();
Ogre::SceneNode* ogreNode = ogreSceneManager->getRootSceneNode()->createChildSceneNode("testnode1", Ogre::Vector3(20, 0, 0));
ogreNode->attachObject(ogreMesh);

PolyVox::Volume<Material8> volume(128,128,128);
// now add some data to it
std::cout << "smoothing volume" << std::endl;
PolyVox::smoothRegion<PolyVox::Material8>(volume, volume.getEnclosingRegion());
std::cout << "updating volume surface" << std::endl;
{
  PolyVox::MarchingCubesSurfaceExtract<PolyVox::Material8> suf(&volume, volume.getEnclosingRegion(), &mesh);
  suf.execute();
}
std::cout << "decimating meshes" << std::endl;
{
  PolyVox::MeshDecimator<PolyVox::PositionMaterialNormal> decim(&mesh, &mesh2);
  decim.execute();
}
std::cout << "drawing mesh: " << mesh2.getNoOfVertices() << std::endl;
ogreMesh->beginUpdate(0);
{
  const vector<PolyVox::PositionMaterialNormal>& vecVertices = mesh2.getVertices();
  const vector<uint32_t>& vecIndices = mesh2.getIndices();
  unsigned int uLodLevel = 0;
  int beginIndex = mesh2.m_vecLodRecords[uLodLevel].beginIndex;
  int endIndex = mesh2.m_vecLodRecords[uLodLevel].endIndex;
  for(int index = beginIndex; index < endIndex; ++index) {
    const PolyVox::PositionMaterialNormal& vertex = vecVertices[vecIndices[index]];
    const PolyVox::Vector3DFloat& v3dVertexPos = vertex.getPosition();
    const PolyVox::Vector3DFloat& v3dVertexNormal = vertex.getNormal();
    //const Vector3DFloat v3dRegionOffset(uRegionX * g_uRegionSideLength, uRegionY * g_uRegionSideLength, uRegionZ * g_uRegionSideLength);
    const PolyVox::Vector3DFloat v3dFinalVertexPos = v3dVertexPos + static_cast<PolyVox::Vector3DFloat>(mesh2.m_Region.getLowerCorner());
    ogreMesh->position(v3dFinalVertexPos.getX(), v3dFinalVertexPos.getY(), v3dFinalVertexPos.getZ());
    ogreMesh->normal(v3dVertexNormal.getX(), v3dVertexNormal.getY(), v3dVertexNormal.getZ());
    uint8_t mat = vertex.getMaterial() + 0.5;
    uint8_t red = mat & 0xF0;
    uint8_t green = mat & 0x03;
    uint8_t blue = mat & 0x0C;
    ogreMesh->colour(red*2, green*4, blue*4);// just some random colors, I'm too lazy for hsv
  }
}
ogreMesh->end();

Updated