您的位置:首页 > 其它

Ogre的地形编辑Demo(一)

2013-01-02 15:29 351 查看
一直想用Ogre 1.8来实现一个拥有较高自由度的地形编辑Demo,在Ogre的地形sample中,只有一块Terrain,明显是满足不了地表纹理丰富的大型地形块的。于是,我的解决办法是,将加入的地形高度图分几个区域,每个区域以一个Terrain的形式加入,这样就生成了一个由多个Terrain组成的大地形,每个Terrain的纹理可以保持不同样式。

需要注意的是关于Ogre::Image的运用,用Image类动态生成图片,申请内存必须用Ogre申请内存的方式,如果用new,最后在释放内存的时候,会造成程序的崩溃。= =当时找这个BUG找的真悲剧。其实还有一个更好的实现方式吧,不用申请内存,直接在原高度图那里拿到需要的高度数据就行了,不过应该会比较麻烦,这里自己偷懒了。

View Code

bool CImageSplitter::SplitterImage(const size_t x, const size_t y, const size_t width, const size_t height, Ogre::Image &ImageSource, Ogre::Image &ImageOut)
{
Ogre::PixelBox pb = ImageSource.getPixelBox();

//划分区域
Ogre::Box box;
box.left = x;
box.top = y;
box.right = box.left + width;
box.bottom = box.top + height;

//创建内存
size_t bit =  ImageSource.getBPP();
size_t ByteCount = bit/8;
Ogre::uchar *pImageBuffer = OGRE_ALLOC_T(Ogre::uchar, width * height * ByteCount, Ogre::MEMCATEGORY_GENERAL);
if(pImageBuffer == NULL)
return false;
Ogre::PixelBox NewPb = pb.getSubVolume(box);
Ogre::uchar *pCurrData = pImageBuffer;
Ogre::uchar *pFindData = reinterpret_cast<Ogre::uchar*>(NewPb.data);
for(int i = 0; i < height; ++i)
{
for(int j = 0; j < width; ++j)
{
size_t n = ByteCount;
while(n)
{
*pCurrData++ = *pFindData++;
--n;
}
}
pFindData += NewPb.getRowSkip();
}

ImageOut.loadDynamicImage(pImageBuffer, width, height, 1, ImageSource.getFormat(), true);

return true;
}


如果完成了这一步,接下来就是地表纹理的编辑了,待续...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: