版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://stdsoft.blogbus.com/logs/35976808.html
据说这就是从程序加载地形的标准方法,但我觉得还不够灵活:
setWorldGeometry()有重载形式,一种用于加载配置文件,另一种我们可在程序中使用,以
达到手工加载的功能。这里,SceneData被 typedef 为std:map,它存储了如我们在terrain.cfg
中看到那些值对。假设我们已经从某个二进制文件读入我们想要的内容到SceneData中。我们要做
的就是把读入的内容转换成setWorldGeometry()需要的类型。先看一下函数原型:
Ogre::SceneManager::setWorldGeometry (? DataStreamPtr &? stream,?
? const String &? typeName = StringUtil::BLANK
?)?
DataStreamPtr是一个智能指针,因此从局部变量中返回是安全的,程序相当直观,不再多说了。 Ogre::DataStreamPtr Process_Loader::getSceneDataStream(SceneData &data) {
// create what looks like a config file for the edification of Ogre
std::string mem;
SceneData::iterator it;
for (it=data.begin(); it!=data.end(); it++) {
mem += it->first;
mem += "=";
mem += it->second;
mem += "/n";
}
void *pMem = (void *)new unsigned char[mem.length()+1];
memset(pMem, 0, mem.length()+1);
memcpy(pMem, mem.c_str(), mem.length() + 1);
// stuff this into a MemoryDataStream
Ogre::DataStreamPtr pStr(new Ogre::MemoryDataStream(pMem, mem.length() + 1));
return pStr;
}
// and then elsewhere in the world loader:
Ogre::DataStreamPtr pStr = getSceneDataStream(terrainDef);
m_sceneMgr->setWorldGeometry(pStr);