Wiki
Clone wikiPolyVox / 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