修改ETM源码,增加了平滑、澡波等地形编辑算法

来源:互联网 发布:军团td4.2 兵种数据 编辑:程序博客网 时间:2024/04/25 02:24

在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());
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/miaolinvip/archive/2008/07/20/2680307.aspx