createTerrainDecal("Ogre/Eyes"); void BasisManager::createTerrainDecal(char* szMaterialName)
{ mTerrainDecal = new Ogre::ManualObject("decal"); mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(mTerrainDecal); mTerrainDecal->setCastShadows(false); int x_size = 1; int z_size = 1; mTerrainDecal->begin(szMaterialName, Ogre::RenderOperation::OT_TRIANGLE_LIST); for (int i=0; i<x_size; i++) { for (int j=0; j<=z_size; j++) { mTerrainDecal->position(Ogre::Vector3(i, 0, j)); mTerrainDecal->textureCoord((float)i / (float)x_size, (float)j / (float)z_size); } } for (int i=0; i<x_size; i++) { for (int j=0; j<z_size; j++) { mTerrainDecal->quad( i * (x_size+1) + j, i * (x_size+1) + j + 1, (i + 1) * (x_size+1) + j + 1,(i + 1) * (x_size+1) + j); } } mTerrainDecal->end(); } //------------------------------------------------------------------------------------------ void BasisManager::setTerrainDecal(float x, float z, float radius) { Ogre::Real x1 = x - radius; Ogre::Real z1 = z - radius; int x_size = 64; int z_size = 64; Ogre::Real x_step = radius * 2/ x_size; Ogre::Real z_step = radius * 2/ z_size; mTerrainDecal->beginUpdate(0); for (int i=0; i<=x_size; i++) { for (int j=0; j<=z_size; j++) { mTerrainDecal->position(Ogre::Vector3(x1, HeightFunction::getTerrainHeight(x1, z1)+0.5, z1)); mTerrainDecal->textureCoord((float)i / (float)x_size, (float)j / (float)z_size); z1 += z_step; } x1 += x_step; z1 = z - radius; } for (int i=0; i<x_size; i++) { for (int j=0; j<z_size; j++) { mTerrainDecal->quad( i * (x_size+1) + j, i * (x_size+1) + j + 1, (i + 1) * (x_size+1) + j + 1, (i + 1) * (x_size+1) + j); } } mTerrainDecal->end(); } |
|