[CodeSnippet] My code for building ETM Shape with NxOgre

ahmedali

02-11-2008 08:41:42

may be useful for someone. My ETM terrain corner starts at the Origin and terrain is not centered aligned.

void comGameWorld::rebuildTerrainCollisionShape()
{
if (mTerrainActor)
{
mNxScene->destroyActor(mTerrainActor->getName());
mTerrainActor = 0;
}

std::size_t rows, cols;
rows = mTerrainMgr->getTerrainInfo().getWidth();
cols = mTerrainMgr->getTerrainInfo().getHeight();

//Start the heighfield creation by initializing the manual heightfield
NxOgre::Resources::ManualHeightfield* mhf = new NxOgre::Resources::ManualHeightfield();
// mhf->setTesselation(NxOgre::Resources::ManualHeightfield::TT_TopLeft_to_BottomRight);
mhf->setTesselation(NxOgre::Resources::ManualHeightfield::TT_TopRight_to_BottomLeft);
mhf->begin(cols, rows);

short maxShort = 32767;
//Add each data point to the heightfield (row major order)
for(size_t i = 0; i < rows; ++i)
for(size_t j = 0; j < cols; ++j)
{
NxMaterialIndex matInd = 0;
short datum = short( maxShort * mTerrainMgr->getTerrainInfo().at(i,j) );
//Add sample to heightfield
mhf->sample(datum, matInd);
}

//Set how far down the bottom of the heighfield extends
mhf->setThickness(-100);

NxOgre::Resources::Heightfield* hf = mhf->end(true);

//Calculate size of the terrain
Vector3 extents_size = mTerrainMgr->getTerrainInfo().getExtents().getSize();

//Set up the terrain parameters
NxOgre::TerrainParams tparams;
tparams.mCentering = NxOgre::TerrainParams::TC_None;
//tparams.mHoleMaterial = 65535;
tparams.mHoleMaterial = 3500;
tparams.mFlags.mVisualiseTerrain = true;

//Create the terrain
NxOgre::Terrain* terrain = new NxOgre::Terrain(hf, NxOgre::float3(extents_size.x,extents_size.y,extents_size.z), "", tparams);
mTerrainActor = mNxScene->createActor("terrain_actor", terrain, Ogre::Vector3(0,0,0), "static: yes");

}