ManualObject * m_pTerrainMeshDecal = NULL;
int res = 6;
void CreateMeshDecal(char *szMaterialName)
{
if (m_pTerrainMeshDecal == NULL)
{
m_pTerrainMeshDecal = new Ogre::ManualObject("SDK_TerrainMeshDecal");
m_pTerrainMeshDecal->setCastShadows(false);
m_pTerrainMeshDecal->setDynamic(true);
m_pTerrainMeshDecal->setRenderQueueGroup(RENDER_QUEUE_WORLD_GEOMETRY_2);
m_pTerrainMeshDecal->begin(szMaterialName);
for(unsigned int i = 0; i <= res; i++)
{
for(unsigned int j = 0; j <= res; j++)
{
m_pTerrainMeshDecal->position(Ogre::Vector3(i, 0, j));
m_pTerrainMeshDecal->textureCoord(i / (Real)res, j / (Real)res);
}
}
for(unsigned int i = 0; i < res; i++)
{
for(unsigned int j = 0; j < res; j++)
{
m_pTerrainMeshDecal->quad(
i * (res + 1) + j,
i * (res + 1) + j + 1,
(i + 1) * (res + 1) + j + 1,
(i + 1) * (res + 1) + j);
}
}
m_pTerrainMeshDecal->end();
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(m_pTerrainMeshDecal);
}
return;
}
void SetMeshDecal(const Vector2 &position, float radius)
{
Real xBegin = position.x - (radius/2);
Real zBegin = position.y - (radius/2);
Real xWidth = radius / res;
Real zWidth = radius / res;
m_pTerrainMeshDecal->beginUpdate(0);
for(unsigned int i = 0; i <= res; i++)
{
for(unsigned int j = 0; j <= res; j++)
{
Real x = xBegin + (xWidth * i);
Real z = zBegin + (zWidth * j);
Real y = Ogre_MFC::getSingletonPtr()->mTerrainInfo->getHeightAt(x, z) + 0.5;
m_pTerrainMeshDecal->position(x, y, z);
m_pTerrainMeshDecal->textureCoord(i / (Real)res, j / (Real)res);
}
}
for(unsigned int i = 0; i < res; i++)
{
for(unsigned int j = 0; j < res; j++)
{
m_pTerrainMeshDecal->quad(
i * (res+ 1) + j,
i * (res+ 1) + j + 1,
(i + 1) * (res+ 1) + j + 1,
(i + 1) * (res+ 1) + j);
}
}
m_pTerrainMeshDecal->end();
}