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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值