在etm的ETTerrainManager.cpp中增加以下函数即可,目前算法还很简单,以后可能会在丰富一些
//-----------------------------------------------------------------------------
// name: 推平
// Desc:
//-----------------------------------------------------------------------------
void TerrainImpl::deformToPlane(int x, int z, const Brush& brush, float intensity)
{
//声明推平高度
float fFinalHeight=1.0f;
//把x.z定在刷子的左上角
x -= (int)brush.getWidth()/2;
z -= (int)brush.getHeight()/2;
//确定推平高度
for (size_t i = 0; i < brush.getWidth(); ++i) //循环刷子的每个点
{
//更新x位置
int posX = x + (int)i;
//如果x位置超出边界,则不处理
if (posX < 0 || posX >= (int)mInfo.getWidth())
continue;
//如果x在地图内,则循环z的位置
for (size_t j = 0; j < brush.getHeight(); ++j)
{
//更新z位置
int posZ = z + (int)j;
//如果z位置超出边界,则不处理
if (posZ < 0 || posZ >= (int)mInfo.getHeight())
continue;
//如果x,z都在正确的范围内
float& height = mInfo.at(size_t(posX), size_t(posZ)); //获得这一坐标的高度
if (height
}
}
//应用推平高度
for (size_t i = 0; i < brush.getWidth(); ++i) //循环刷子的每个点
{
//更新x位置
int posX = x + (int)i;
//如果x位置超出边界,则不处理
if (posX < 0 || posX >= (int)mInfo.getWidth())
continue;
//如果x在地图内,则循环z的位置
for (size_t j = 0; j < brush.getHeight(); ++j)
{
//更新z位置
int posZ = z + (int)j;
//如果z位置超出边界,则不处理
if (posZ < 0 || posZ >= (int)mInfo.getHeight())
continue;
//如果x,z都在正确的范围内
float& height = mInfo.at(size_t(posX), size_t(posZ)); //获得这一坐标的高度
height = fFinalHeight; //设置为推平高度
//如果高度超出范围则做范围调整
if (height > 1)
height = 1;
if (height < 0)
height = 0;
}
}
//应用高度,使改动生效
updateTiles(x, z, x+(int)brush.getWidth(), z+(int)brush.getHeight());
}
//-----------------------------------------------------------------------------
// name: 噪波
// Desc:
//-----------------------------------------------------------------------------
void TerrainImpl::deformToWave(int x, int z, const Brush& brush, float intensity)
{
//把x.z定在刷子的左上角
x -= (int)brush.getWidth()/2;
z -= (int)brush.getHeight()/2;
for (size_t i = 0; i < brush.getWidth(); ++i) //循环刷子的每个点
{
//更新x位置
int posX = x + (int)i;
//如果x位置超出边界,则不处理
if (posX < 0 || posX >= (int)mInfo.getWidth())
continue;
//如果x在地图内,则循环z的位置
for (size_t j = 0; j < brush.getHeight(); ++j)
{
//更新z位置
int posZ = z + (int)j;
//如果z位置超出边界,则不处理
if (posZ < 0 || posZ >= (int)mInfo.getHeight())
continue;
//如果x,z都在正确的范围内
float& height = mInfo.at(size_t(posX), size_t(posZ)); //获得这一坐标的高度
height += GetRandomF()*intensity * brush.at(i, j); //随机增加或降低高度
//如果高度超出范围则做范围调整
if (height > 1)
height = 1;
if (height < 0)
height = 0;
}
}
//应用高度,使改动生效
updateTiles(x, z, x+(int)brush.getWidth(), z+(int)brush.getHeight());
}
//-----------------------------------------------------------------------------
// name: 平滑
// Desc:
//-----------------------------------------------------------------------------
void TerrainImpl::deformToSmooth(int x, int z, const Brush& brush, float intensity)
{
//把x.z定在刷子的左上角
x -= (int)brush.getWidth()/2;
z -= (int)brush.getHeight()/2;
for (size_t i = 0; i < brush.getWidth(); ++i) //循环刷子的每个点
{
//更新x位置
int posX = x + (int)i;
//如果x-1或+1的位置超出边界,则不处理
if ( (posX-1)<0 || (posX+1)>=(int)mInfo.getWidth() )
continue;
//如果x在平滑范围内,则循环z的位置
for (size_t j = 0; j < brush.getHeight(); ++j)
{
//更新z位置
int posZ = z + (int)j;
//如果z-1或+1的位置超出边界,则不处理
if ( (posZ-1)<0 || (posZ+1)>=(int)mInfo.getHeight() )
continue;
//如果x,z都在正确的平滑范围内
float& height = mInfo.at(size_t(posX), size_t(posZ)); //获得这一坐标的高度
float& leftHeight = mInfo.at(size_t(posX), size_t(posZ-1)); //获得左边高度
float& topHeight = mInfo.at(size_t(posX-1), size_t(posZ)); //获得上边高度
float& rightHeight = mInfo.at(size_t(posX), size_t(posZ+1)); //获得右边高度
float& bottomHeight = mInfo.at(size_t(posX+1), size_t(posZ)); //获得下边高度
height=(leftHeight+topHeight+rightHeight+bottomHeight)/4.0f; //求出四面高度的平均值
//如果高度超出范围则做范围调整
if (height > 1)
height = 1;
if (height < 0)
height = 0;
}
}
//应用高度,使改动生效
updateTiles(x, z, x+(int)brush.getWidth(), z+(int)brush.getHeight());
}