让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

posted @ 2010-06-08 19:19  Dawnli  阅读(874)  评论(0编辑  收藏  举报