Example #1
0
void TerrainManager::EditLayerTerrain(Ogre::Terrain *terrain, const Ogre::Vector3 &centerPos, 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();
}