void TerrainManager::EditLayerTerrain(Ogre::Terrain *terrain, const Ogre::Vector3 ¢erPos, float timeElapsed) { Ogre::Vector3 tsPos; terrain->getTerrainPosition(centerPos, &tsPos); Ogre::TerrainLayerBlendMap* layer = terrain->getLayerBlendMap(m_nLayerNum); int d(terrain->getLayerBlendMapSize()); int t(terrain->getLayerCount()); // we need image coords float imgSize = terrain->getLayerBlendMapSize(); long startx = (tsPos.x - m_fBrushSize) * imgSize; long starty = (tsPos.y - m_fBrushSize) * imgSize; long endx = (tsPos.x + m_fBrushSize) * imgSize; long endy= (tsPos.y + m_fBrushSize) * imgSize; startx = std::max(startx, 0L); starty = std::max(starty, 0L); endx = std::min(endx, (long)imgSize); endy = std::min(endy, (long)imgSize); for (long y = starty; y <= endy; ++y) { for (long x = startx; x <= endx; ++x) { float tsXdist = (x / imgSize) - tsPos.x; float tsYdist = (y / imgSize) - tsPos.y; float weight = std::min((float)1.0, Ogre::Math::Sqrt(tsYdist * tsYdist + tsXdist * tsXdist) / float(0.5 * m_fBrushSize)); weight = 1.0 - (weight * weight); float paint = weight * timeElapsed; size_t imgY = imgSize - y; float val = 0; if(GetAsyncKeyState(VK_UP)) val = layer->getBlendValue(x, imgY) + paint; else if(GetAsyncKeyState(VK_DOWN)) val = layer->getBlendValue(x, imgY) - paint; val = Ogre::Math::Clamp(val, 0.0f, 1.0f); layer->setBlendValue(x, imgY, val); } } layer->update(); }