zoukankan      html  css  js  c++  java
  • 让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

  • 相关阅读:
    C语言预处理
    C语言结构体对齐
    C语言共用体、大小端、枚举
    C语言内存分配方法。
    C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用
    C语言中函数的传入值与传出值
    #define与typedef在重定义类型中的区别
    宏定义在位运算中的运用
    wait函数
    exit()与_exit()区别
  • 原文地址:https://www.cnblogs.com/dawn/p/1754244.html
Copyright © 2011-2022 走看看