让Ogre的资源管理器为我们服务
必须说的是,我是一个懒人。程序员常有个懒习惯就是,耗费心力去创建个Tool或找条便捷的路子为自己的工作服务。
最近觉得程序里的资源(纹理、Mesh、ShaderFile等)分布得太乱,想整理整理,于是便希望能将Ogre的资源管理器剥离,为我所用。
初步的成果剥离了ResourceGroupManager类。
//------------------------------------------------------------------------------
// 初始化root Ogre::Root* mRoot;
//------------------------------------------------------------------------------
mRoot = new Ogre::Root();
//------------------------------------------------------------------------------
// 载入资源文件
//------------------------------------------------------------------------------
// Load resource paths from config file
Ogre::ConfigFile cf;
cf.load(resFileName);
// Go through all sections & settings in the file
Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
Ogre::String secName, typeName, archName;
while (seci.hasMoreElements())
{
secName = seci.peekNextKey();
Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
Ogre::ConfigFile::SettingsMultiMap::iterator i;
for (i = settings->begin(); i != settings->end(); ++i)
{
typeName = i->first;
archName = i->second;
Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
archName, typeName, secName);
}
}
//------------------------
1.经过以上设置后,Ogre的Image类便可以为我们所用了,因为内部的ResourceGroupManager已经被初始化,举例如下:
Ogre::Image image;
image.load("Terrain/heightMap.png", "TEX");
为什么强调Image类的使用呢。因为它可以载入基本所有的2D图片资源,Image里保存了所有像素的颜色,如果要进行图像处理,是非常方便,因为图片上每个像素的颜色都可以自由访问及修改。修改完后,调用image.save("fileImage.png");便可保存修改后的图片。
2.使用如下的方法,可以获得某文件的流
DataStreamPtr dstream = ResourceGroupManager::getSingleton().openResource("Terrain/heightMap.png", "TEX", true);
MemoryDataStream stream(dstream);
然后使用D3D中的D3DXCreateTextureFromFileInMemoryEx函数可创建纹理Buffer,这样便可在D3D程序中使用Ogre的资源管理器Load纹理图片。
HRESULT hr = D3DXCreateTextureFromFileInMemoryEx(
mpDev,
stream.getPtr(),
stream.size(),
D3DX_DEFAULT, D3DX_DEFAULT, // dims
numMips,
usage,
D3DFMT_UNKNOWN,
pool,
D3DX_DEFAULT,
D3DX_DEFAULT,
0, // colour key
NULL, // src box
NULL, // palette
&mpNormTex);
//------------------------
貌似还没涉及详细的资源管理,这些下次再说吧。。。容我再研究研究。
PS:基于Ogre1.6.4 SDK