源码魅力:Tool_MapSplitter的Bug之分割高度图后命名的错误

 最近在用PLSM2处理超大地形,虽然PLSM2有些高贵,但是总算熬过来了,感觉还可以。PLSM2白送的几张地形图都成功地渲染出来了。其中我用到了那个Tool_MapSplitter工程。该工程产生的MapSplitter.exe专门擅长于分割地图。(PLSM2需要你把配制好的地图分割成Pages(Even just One page)才能使用。)

    在使用MapSplitter.exe的过程中,我发现如果地图被分成了不止一个Page时,分割后的高度图块不能被PLSM2识别,我对比了纹理分块后的命名规律,确定这是MapSplitter.exe的一个Bug。

    源码魅力!感谢上帝!我们只需要在源码里修改一下就可以了。

    先说存在的问题:

    比如说我们要分割那个gcanyon_height_4k2k.png(4097X2049),分成4行8列的32个Pages,如果不修改Bug,分成的结果是如下的样子:(竖线右侧是PLSM2能识别的格式,也是修改Bug后的成果)

 

    最近在用PLSM2处理超大地形,虽然PLSM2有些高贵,但是总算熬过来了,感觉还可以。PLSM2白送的几张地形图都成功地渲染出来了。其中我用到了那个Tool_MapSplitter工程。该工程产生的MapSplitter.exe专门擅长于分割地图。(PLSM2需要你把配制好的地图分割成Pages(Even just One page)才能使用。)

    在使用MapSplitter.exe的过程中,我发现如果地图被分成了不止一个Page时,分割后的高度图块不能被PLSM2识别,我对比了纹理分块后的命名规律,确定这是MapSplitter.exe的一个Bug。

    源码魅力!感谢上帝!我们只需要在源码里修改一下就可以了。

    先说存在的问题:

    比如说我们要分割那个gcanyon_height_4k2k.png(4097X2049),分成4行8列的32个Pages,如果不修改Bug,分成的结果是如下的样子:(竖线右侧是PLSM2能识别的格式,也是修改Bug后的成果)

 

    现在我们来看看存在问题的函数的源代码:

void MapSplitter::SplitAndSpaceHeightData (const String &filename, uchar *BaseData,
                                                const uint width, const uint height,
                                                const int tile_spacing, const int page_size,
                                                const bool saveasRaw, const String &extension)

    对于单个的Page分割,最后的文件名是这样形成的:(没问题)

    String SplitFileName =  pure_file_name + String(".0.0.") + ext_name;

    对于多个页,先处理除了最后一行和最后一列的内部Page,然后处理最后一行,随后处理最后一列,最后处理最后一行且最后一列。这四处的文件名在源码中是这样形成的:(有大问题)

    SplitFileName =  pure_file_name  + StringConverter::toString(i) + String(".") + StringConverter::toString(width_split_count) + String(".") + ext_name;

    应该把这四处都修改为:

SplitFileName =  pure_file_name + String(".") + StringConverter::toString(i) + String(".") + StringConverter::toString(width_split_count) + String(".") + ext_name;

    细心的读者应该很容易看到修改后和源码的区别。

    祝各位好运。

 现在我们来看看存在问题的函数的源代码:

void MapSplitter::SplitAndSpaceHeightData (const String &filename, uchar *BaseData,
                                                const uint width, const uint height,
                                                const int tile_spacing, const int page_size,
                                                const bool saveasRaw, const String &extension)

    对于单个的Page分割,最后的文件名是这样形成的:(没问题)

    String SplitFileName =  pure_file_name + String(".0.0.") + ext_name;

    对于多个页,先处理除了最后一行和最后一列的内部Page,然后处理最后一行,随后处理最后一列,最后处理最后一行且最后一列。这四处的文件名在源码中是这样形成的:(有大问题)

    SplitFileName =  pure_file_name  + StringConverter::toString(i) + String(".") + StringConverter::toString(width_split_count) + String(".") + ext_name;

    应该把这四处都修改为:

SplitFileName =  pure_file_name + String(".") + StringConverter::toString(i) + String(".") + StringConverter::toString(width_split_count) + String(".") + ext_name;

    细心的读者应该很容易看到修改后和源码的区别。

    祝各位好运。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值