精华内容
下载资源
问答
  • Ogre源代码

    热门讨论 2012-02-13 20:28:09
    OGRE(Object-Oriented Graphics Rendering Engine,即:面向对象图形渲染引擎)是一个用C++开发的面向场景、非常灵活的3D引擎,它旨在让开发人员更容易、更直接地利用硬件加速的3D图形系统开发应用。这个类库隐藏了...
  • OGRE源代码编译超详细步骤

    千次阅读 2015-09-02 18:01:29
    第一步: 了解OGRE是什么东东,这个我就不说了,直接上官网逛吧:http://www.ogre3d.org/... 第二步: ...下载OGRE源代码,http://sourceforge.net/projects/ogre/files/ogre/1.7/ogre-v1-7-0.zip/download 第三步

    第一步:

    了解OGRE是什么东东,这个我就不说了,直接上官网逛吧:http://www.ogre3d.org/ ;还有对应的中文比较好的网站:http://www.ogre3d.cn/

    第二步:

    下载OGRE源代码http://sourceforge.net/projects/ogre/files/ogre/1.7/ogre-v1-7-0.zip/download

    第三步:

    下载依赖文件,

    http://sourceforge.net/projects/ogre/files/ogre-dependencies-vc%2B%2B/1.7/OgreDependencies_MSVC_20100106.zip/download

    第四步:

    解压源代码和依赖文件

    将源代码解压,解压的时候建议修改文件名,通过右键,解压文件来操作,或则解压文件之后修改文件夹名字。建议名字为:ogre-v1-7-0ogre-版本号)。

    解压依赖文件,将依赖文件加压到ogre解压目录(ogre-v1-7-0)下。这里更推荐用解压到。

    解压之后ogre-v1-7-0的目录结构为:

    OGRE源代码编译超详细步骤 - Android砖家 - Android iPhone HTML5

    注意里面的Dependencies 文件夹,这个名字不能变,他里面的目录结构为:

    OGRE源代码编译超详细步骤 - Android砖家 - Android iPhone HTML5
    。这样解压就算完成了。

    要注意Dependencies的目录位置。

    第五

    编译Dependencies 下面的工程。

    打开(你的目录)\ogre-v1-7-0\Dependencies\src下面的OgreDependencies.VS2008.sln

    分别编译DebugRelease版本。

    注意两个版本都需要编译。编译成功之后,依赖库编译完成。一般这里了没有什么错误的,如果有错误,我也没有办法。嘻嘻。。

    第六步

    下载安装DirextX

    可以去微软官方网站下载:

    http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=2c7da5fb-ffbb-4af6-8c66-651cbd28ca15

    不过这里要求正版验证,也可以去其他地方搜索下载。

    安装过程就不说了。。。。

    安装结束之后,要设置VS2008的工程配置路径。

    选择Tools->Options->VC++ Directories:设置里面的Executable Files中添加一项:

    $(DXSDK_DIR)\Lib\x86

    同理分别在:Include Files添加:$(DXSDK_DIR)\Include

    在Libary Files 添加:$(DXSDK_DIR)\Lib\x86

    第七步:

    下载安装CMake

    在如下地址安装:http://www.cmake.org/cmake/resources/software.html

    具体安装细节也不说了。。。。。

    第八步:

    用CMake生成工程

    1.通过开始->所有程序->CMake2.8->CMake (cmake-gui)打开CAMKE

    2."Where is the source code"文本框中,输入或者“browse”到OGRE源代码的根目录(E:\mylearning\OGRE\ogre-v1-7-0

    3,新建一个目录,用来保存生成的项目输出路径,理论上时可以任何你喜欢的路径,建议和ogre-v1-7-0同级,我的目录为:E:\mylearning\OGRE\ogreOut。特别不建议和源代码放在一起。他的作用是生成工程的输出目录。

    4.在"Where to build the binaries" 文本框中,输入或者“browse”到刚才新建的目录。(E:\mylearning\OGRE\ogreOut)

    现在CMAKE的情况为:OGRE源代码编译超详细步骤 - Android砖家 - Android iPhone HTML5

    5..单击屏幕下方的'Configure'按键。 选择你的目标编译平台,例如"Visual Studio 9 2008"

    6.等待configure执行结束,屏幕上现在会有一些配置设置,并用红色标记(这是用来指出你是第一次看到他们)。你可以在这里手动配置这些选项,不过现在我们只需要再次选择'Configure'。 (这里不用做任何操作,只需要再次点击configure)

    如果这里提示出错,说明前面几步没有做好。确保dependencies文件路径是否正确,确定dependcies里面的工程是否编译正常。

    查询如果没有DirectX相关的工程,说明你的Direct设置有问题。确认SDK安装正确并设置VS2008的工程配置路径。

    7.等运行结束了选择"Generate"按键。

    第九步:

    编译OGRE-V1.7.0

    进入CMAKE生成工程的输出目录,即:E:\mylearning\OGRE\ogreOut。里面结构为:

    OGRE源代码编译超详细步骤 - Android砖家 - Android iPhone HTML5
    双击Ogre.sln,进入里面编译界面。

    右键ALL_BUILD工程->BUILD。等待编译结束。

    这里有个问题,仅我机器上出现,就是在编译OgreMain工程的时候,出现

    fatal error C1060: compiler is out of heap spac的错误,这个我至今都不清楚什么原因,去掉里面的/Zm1000 就可以了,我以前一直以为是要修改为更大才可行。期待大牛解答。

    这个编译好过很久很久的时间。。慢慢等待吧。。。

    编译结束之后,选择INSTALL->右键->Project Only->Build Only INSTALL 将工程的dll,头文件等输出到SDK目录。

    这查看E:\mylearning\OGRE\ogreOut\sdk这个目录里面多了什么东西。。

    Rlesase/Debug都需要编译。

    第十步:

    运行例子程序。

    选择:SampleBrowser工程,右键->Debug->Start New Instance


    http://hi.baidu.com/yanyiliu01/blog/item/58deff5cf894b8cb9d820422.html
    展开全文
  • Ogre源代码浅析——Archive对象  3D图形渲染引擎所需的外部资源,根据其作用可分为纹理、模型、骨骼动画、材质数据等多种类型。这些资源一般都以不同格式的文件形式保存在外部存储器上。Ogre在处理这些不同结构...

    Ogre源代码浅析——Archive对象

          3D图形渲染引擎所需的外部资源,根据其作用可分为纹理、模型、骨骼动画、材质数据等多种类型。这些资源一般都以不同格式的文件形式保存在外部存储器上。Ogre在处理这些不同结构的资源文件时,又根据文件形态将其分为两大类——普通文件和压缩文件。在加载外部资源文件资源时,由于不同形态的文件后期处理的方式不同,所以要在加载之前就对其进行相应的区分。Ogre引入的Archive类可以达到这一目的。

          Archive类有三个成员变量:

    protected :
         /// Archive name
         String mName;
     
         /// Archive type code
         String mType;
     
         /// Read-only flag
         bool  mReadOnly;

      Archive主要对应着各资源文件所在目录,其中mName用来保存目录字符串,即保存在同一目录下的资源文件有着相同的mName,对应着同一个Archive类对象;mType变量表示当前目录下保存的资源文件是普通文件还是压缩文件;mReadOnly变量用来表示当前目录是只读的还是可读写的。Archive有两个派生类——FileSystemArchive和ZipArchive,它们分别对应着普通资源目录和压缩资源。下面以FileSystemArchive为例来讨论一下Archive对象的运行机制。

         Ogre是通过ArchiveManager类对象来创建和管理Archive类对象的。

         ArchiveManager对象有以下两个成员变量:

    protected :
            typedef  map<String, ArchiveFactory*>::type ArchiveFactoryMap;
            /// Factories available to create archives, indexed by archive type (String identifier e.g. 'Zip')
            ArchiveFactoryMap mArchFactories;
            /// Currently loaded archives
            typedef  map<String, Archive*>::type ArchiveMap;
            ArchiveMap mArchives;

      Ogre采用抽象工厂(Abstract Factory)模式,生成了ArchiveFactory的两个派生类FileSystemArchiveFactory和ZipArchiveFactory的实例对象,并将其保存在mArchFactories中。在Archive* ArchiveManager::load( const String& filename, const String& archiveType)方法被调用时,ArchiveManager会根据第二个参数archiveType找到相应的工厂对象实例,并调用相应工厂对象的createInstance方法,生成对应的Archive对象。FileSystemArchiveFactory将生成FileSystemArchive类对象,它的mName值是由外部(在.cfg配制文件中设定)传入的;mType值由FileSystemArchiveFactory在创建FileSystemArchive对象时设定为“FileSystem”并传入;接下来ArchiveManager会在其load过程中调用FileSystemArchive的load方法,在FileSystemArchive的load方法中将试着对相应目录进行写操作,如果写操作失败则证明此目录为只读,从而将mReadOnly变量设为true,否则设为false。最后以Archive对象的路径字符串为key,将创建好的Archive对象保存在mArchives中。

     

     

          

    作者: yzwalkman
    转载请注明出处。
    展开全文
  • OGRE源代码ogre_src_v1-8-1.zip.002 part2 对照part1 放在同一个文件夹,解压即可
  • Ogre源代码浅析——插件(Plugin)工作原理》 这里就是我在学习中,不理解问题的笔记。 1、上期结尾问题 平平疑问记录如下: Ogre会在每个要被动态加载的dll库对象中声明一个名为“dllStartPlugin”的函数, ...

    插件(Plugin)结构的具体内容 我转载的文章里说的很系统清楚了。
    《Ogre源代码浅析——插件(Plugin)工作原理》

    待解决问题列表:

    1. 这样调用“dllStartPlugin”的函数
    2. DynLib类、plugin类和sample类的区别。
    3. DynLib类、plugin类和sample类直接的调用具体流程。

    针对以上问题整理记录的学习笔记。(这里是jean7155的博客 在 csdn

    这三个类的关系是

    DynLib类 > plugin类 > sample类

    即:每个 DynLib类里可以包含多个plugin类,每个plugin类可以包含多个sample类。

    从小向大逐层分析。

    (1)sample类

    sample类的规范框架包括 实例的启动/结束,实例资源的加载/卸载,鼠标键盘注入,渲染刷新的响应,场景创建,窗口重绘。

    (2)plugin类

    Ogre::Plugin类 相当于一个接口,定义了几个纯虚函数(getName、install、initialise、shutdown、uninstall)。
    SampleBrowser项目中的SamplePlugin类继承了Ogre::Plugin类。SamplePlugin类功能如下:

     //实现父类Ogre::Plugin类中的纯虚函数。这里实现的都是空函数。
     //管理SampleSet mSamples;(里面保存多个Sample)。
     //实现了Ogre::String mName;
    

    如上,运行实例SamplePlugin类中保存并管理类一个Sample对象集。所以每个SamplePlugin类可以包含多个sample类。
    所以,sample和plugin不对等,sample保存在SampleBrowser类的

      SampleSet mLoadedSamples; // loaded samples 保存所有实例指针
    

    (3)DynLib类

     //这个类用 宏定义 适配了不同平台上面的dll或者dylib等文件的操作。
     //操作包括加载、卸载、获得函数指针(load、unload、getSymbol)。
     //获得函数指针(getSymbol)可以获得dll中定义的函数,调用dllStartPlugin函数和dllStopPlugin函数。
    

    在类中可以定义多个类,可以是plugin,也可以是别的任意的类。在dllStartPlugin函数中对这个类进行new初始化后,将它指针和plugin类相关联,通过plugin类注册到Ogre内核中,就可以在以后的调用了。

    (4)调用流程

    加载配置文件cfg,解析待加载的文件路径和文件名。(这里以后学)

    • 1、调用 **Root::loadPlugin(pluginName)**函数加载。
    • 1.1、通过DynLibManager类加载管理DynLib类。加载dll或dynLib等文件。保存到 mPluginLibs中。

        DynLib* lib = DynLibManager::getSingleton().load( pluginName );
      
    • 1.2、调用dllStartPlugin函数。通过DynLib类获得函数指针(getSymbol),可以获得dll中定义的函数调用dllStartPlugin函数和dllStopPlugin函数。

      /*
        new 一个Sample类的子类,记作sampleInstance。
        new 一个SamplePlugin类,将sampleInstance添加到SamplePlugin对象中。
        将SamplePlugin对象注册到Ogre内核中。注册的时候会保存mPlugins中用于管理。
        下面是一个骨骼动画的代码作为例子。
      */
      extern "C" _OgreSampleExport void dllStartPlugin()
      {
      	s = new Sample_Character;
      	sp = OGRE_NEW SamplePlugin(s->getInfo()["Title"] + " Sample");
      	sp->addSample(s);
      	Root::getSingleton().installPlugin(sp);
      }
      
    • RenderSystem_GL项目中实例如下:

      extern "C" void _OgreGLExport dllStartPlugin(void) throw()
      {
        plugin = new GLPlugin();
        Root::getSingleton().installPlugin(plugin);
      }
      
    • 2、获得Ogre::Plugin* ,强制类型转换成 SamplePlugin*,通过SamplePlugin* 获得SampleSet。

      SampleSet newSamples = sp->getSamples();
      
    • 3、遍历SampleSet,加载所有sample,并将加载好的实例保存到SampleBrowser类的

       SampleSet mLoadedSamples; // loaded samples 保存所有实例指针
      

    ————完————

    展开全文
  • Ogre源代码浅析——脚本及其解析(一) Ogre的许多外部资源数据都有着相应的脚本格式,现例举如下: Material(材质):Ogre使用的是“大材质”的概念。狭义的“材质”概念往往是与“贴图”等概念区分开的,...

    Ogre源代码浅析——脚本及其解析(一)

    Ogre的许多外部资源数据都有着相应的脚本格式,现例举如下:

    • Material(材质):Ogre使用的是“大材质”的概念。狭义的“材质”概念往往是与“贴图”等概念区分开的,比如在Lambert光照模型中,它一般用来指物体表面对模拟光的环境分量、漫反射分量和镜面反射分量的作用的响应属性。而在Ogre中,“材质”既包括了上述狭义的材质含义,又包括对要使用的贴图的描述,还可以包括要使用的shader的相关信息。这些都是用Ogre的材质脚本来描述的。其实仔细思考一下就会发现,Ogre对材质概念的定义是恰当的,因为贴图实际上是图形学为了模拟光照效果的一种方法;而后期引入的shader其原意也是为了让程序员能更自由、更精确地表达各种光照效果;再结合狭义的材质概念就可以明白,在Ogre中,所谓的“材质”实际上就是物体表面对光照的响应最终结果的整体描述,它综合了现有图形学的各种技术手段。材质脚本是以.material为后缀的文本文件。

     

    • Program:各种shader语言都有自身的定义和表达方式,但不论用哪种语言写的shader,从调用者的角度看来,都需要知道shader的源文件在哪儿?是什么类型的?用的是什么版本?入口函数是什么?等方面的内容。Program脚本就负责回答这些问题,实际上program脚本是为Material脚本服务的,它们之间是“被引用者”和“引用者”之间的关系。Program脚本是以.program为后缀的文本文件。program脚本中定义的内容,有时也直接写在Material文本文件里。

     

    • Particle:Ogre中的粒子系统的实例化即是以此脚本文件为基础的。Particle脚本是以.particle为后缀的文本文件。

     

    • Compositor:游戏场景中的一些特殊光照效果,有时需要以不同的方式对场景进行多次渲染然后综合处理;有时要在上次渲染的结果上作进一步的图像处理,并把处理结果作为下一次处理的输入数据;或者用多次渲染与重复处理组合起来行成一个渲染链,渲染链的输出就是最后要的光照效果(比如常见的"Bloom"、"Flur"等)。这大概也是Ogre为什么把这种处理方法定义为Compositor的原因吧。底层的图形渲染引擎如DirectX,OpenGL等只提供对场景数据的直接渲染的支持,对这种特殊光效的处理过程鲜有现成的接口可以调用,而Ogre为了实现这种功能所引入的Compositor的概念,就是用来实现以上的组合渲染过程的。Compositor脚本是以.compositor为后缀的文本文件。

     

    • Overlay:作为覆盖层的Overlay的用途是多方面的。在渲染过程中,Overlay渲染队列是被放在最后进行处理的,所以Overlay对象总是会覆盖整个场景而显示在最前面。Overlay常用作系统中二维对象或特殊对象的显示,比如UI界面、游戏场景中的HUD(Head Up Display)等。Overlay中的contain对象可以相互叠加或嵌套。对场景中要显示的Overlay对象内容及其相互关系,Ogre用overlay脚本对其进行描述。overlay脚本是以.overlay为后缀的文本文件。

     

    • Font:在Ogre中显示的文字,都是以纹理的方式来处理的。其处理方法大致有两种,第一种是把要显示的文字内容处理成图片,然后作为贴图资源进行加载和处理;第二种方法是使用操作系统提供的或第三方提供的字库,Ogre会根据字库和用户要显示的内容,自动在内部渲染为纹理。如果要使用第二种方法,就要用Ogre提供的Font脚本。Font脚本是以.fontdef为后缀的文本文件。

     

    • 其他。Ogre还为脚本的扩展提供了可能。Ogre的某些插件使用的资源可以有自已的脚本格式,对这些脚本文件的解析同样可以依靠Ogre原有的脚本解析机制。

        

          Ogre的资源管理器都是从ResourceManager派生出来的,而ResourceManager又以ScriptLoader为基类。有相应脚本的的资源管理器,在其构造函数中会调用ResourceGroupManager::_registerScriptLoader()函数,将资源管理器对象指针保存到ResourceGroupManager的mScriptLoaderOrderMap容器中。在之后的资源初始化过程中(见前面相关文章的讨论),ResourceGroupManager::initialiseResourceGroup()会调用ResourceGroupManager::parseResourceGroupScripts()函数,对相应ResourceGroup中的脚本文件进行解析。新版本的Ogre引入了ScriptCompilerManager类后,以“.material”、“.program”、“.particle”和“.compositor”为后缀的文件都统一由ScriptCompilerManager类型对象统一进行管理和解析(而原来各自对应的资源管理器不再注册到mScriptLoaderOrderMap中)。ScriptCompilerManager自身也是以ScriptLoader为基类的,Oger在初始化Root对象时,会创建一个ScriptCompilerManager对象,并通过ResourceGroupManager::_registerScriptLoader()函数,将它的指针保存到ResourceGroupManager的mScriptLoaderOrderMap容器中。因此,新版本的ResourceGroupManager的mScriptLoaderOrderMap中保存的第一个ScriptLoader对象,实际上就是ScriptCompilerManager的对象指针。

          ResourceGroupManager::parseResourceGroupScripts()函数的代码如下:

    复制代码
     1     void ResourceGroupManager::parseResourceGroupScripts(ResourceGroup* grp)
     2     {
     3 
     4         LogManager::getSingleton().logMessage(
     5             "Parsing scripts for resource group " + grp->name);
     6 
     7         // Count up the number of scripts we have to parse
     8         typedef list<FileInfoListPtr>::type FileListList;
     9         typedef SharedPtr<FileListList> FileListListPtr;
    10         typedef std::pair<ScriptLoader*, FileListListPtr> LoaderFileListPair;
    11         typedef list<LoaderFileListPair>::type ScriptLoaderFileList;
    12         ScriptLoaderFileList scriptLoaderFileList;
    13         size_t scriptCount = 0;
    14         // Iterate over script users in loading order and get streams
    15         ScriptLoaderOrderMap::iterator oi;
    16         for (oi = mScriptLoaderOrderMap.begin();
    17             oi != mScriptLoaderOrderMap.end(); ++oi)
    18         {
    19             ScriptLoader* su = oi->second;
    20             // MEMCATEGORY_GENERAL is the only category supported for SharedPtr
    21             FileListListPtr fileListList(OGRE_NEW_T(FileListList, MEMCATEGORY_GENERAL)(), SPFM_DELETE_T);
    22 
    23             // Get all the patterns and search them
    24             const StringVector& patterns = su->getScriptPatterns();
    25             for (StringVector::const_iterator p = patterns.begin(); p != patterns.end(); ++p)
    26             {
    27                 FileInfoListPtr fileList = findResourceFileInfo(grp->name, *p);
    28                 scriptCount += fileList->size();
    29                 fileListList->push_back(fileList);
    30             }
    31             scriptLoaderFileList.push_back(
    32                 LoaderFileListPair(su, fileListList));
    33         }
    34         // Fire scripting event
    35         fireResourceGroupScriptingStarted(grp->name, scriptCount);
    36 
    37         // Iterate over scripts and parse
    38         // Note we respect original ordering
    39         for (ScriptLoaderFileList::iterator slfli = scriptLoaderFileList.begin();
    40             slfli != scriptLoaderFileList.end(); ++slfli)
    41         {
    42             ScriptLoader* su = slfli->first;
    43             // Iterate over each list
    44             for (FileListList::iterator flli = slfli->second->begin(); flli != slfli->second->end(); ++flli)
    45             {
    46                 // Iterate over each item in the list
    47                 for (FileInfoList::iterator fii = (*flli)->begin(); fii != (*flli)->end(); ++fii)
    48                 {
    49                     bool skipScript = false;
    50                     fireScriptStarted(fii->filename, skipScript);
    51                     if(skipScript)
    52                     {
    53                         LogManager::getSingleton().logMessage(
    54                             "Skipping script " + fii->filename);
    55                     }
    56                     else
    57                     {
    58                         LogManager::getSingleton().logMessage(
    59                             "Parsing script " + fii->filename);
    60                         DataStreamPtr stream = fii->archive->open(fii->filename);
    61                         if (!stream.isNull())
    62                         {
    63                             if (mLoadingListener)
    64                                 mLoadingListener->resourceStreamOpened(fii->filename, grp->name, 0, stream);
    65 
    66                             if(fii->archive->getType() == "FileSystem" && stream->size() <= 1024 * 1024)
    67                             {
    68                                 DataStreamPtr cachedCopy;
    69                                 cachedCopy.bind(OGRE_NEW MemoryDataStream(stream->getName(), stream));
    70                                 su->parseScript(cachedCopy, grp->name);
    71                             }
    72                             else
    73                                 su->parseScript(stream, grp->name);
    74                         }
    75                     }
    76                     fireScriptEnded(fii->filename, skipScript);
    77                 }
    78             }
    79         }
    80 
    81         fireResourceGroupScriptingEnded(grp->name);
    82         LogManager::getSingleton().logMessage(
    83             "Finished parsing scripts for resource group " + grp->name);
    84     }
    复制代码

            ScriptCompilerManager对象有一个StringVector mScriptPatterns成员,它里面主要保存着待解析的脚本文件类型信息,在ScriptCompilerManager被创建时,“.material”、“.program”、“.particle”、“.compositor”四个字符串会被保存在内。第27行的findResourceFileInfo()函数的代码展开如下:

    复制代码
     1     FileInfoListPtr ResourceGroupManager::findResourceFileInfo(const String& groupName, 
     2         const String& pattern, bool dirs)
     3     {
     4         OGRE_LOCK_AUTO_MUTEX
     5         // MEMCATEGORY_GENERAL is the only category supported for SharedPtr
     6         FileInfoListPtr vec(OGRE_NEW_T(FileInfoList, MEMCATEGORY_GENERAL)(), SPFM_DELETE_T);
     7 
     8         // Try to find in resource index first
     9         ResourceGroup* grp = getResourceGroup(groupName);
    10         if (!grp)
    11         {
    12             OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, 
    13                 "Cannot locate a resource group called '" + groupName + "'", 
    14                 "ResourceGroupManager::findResourceFileInfo");
    15         }
    16 
    17         OGRE_LOCK_MUTEX(grp->OGRE_AUTO_MUTEX_NAME) // lock group mutex
    18 
    19             // Iterate over the archives
    20             LocationList::iterator i, iend;
    21         iend = grp->locationList.end();
    22         for (i = grp->locationList.begin(); i != iend; ++i)
    23         {
    24             FileInfoListPtr lst = (*i)->archive->findFileInfo(pattern, (*i)->recursive, dirs);
    25             vec->insert(vec->end(), lst->begin(), lst->end());
    26         }
    27 
    28         return vec;
    29     }
    复制代码

           以FileSystemArchive为例,在findResourceFileInfo()函数中的第24行将会形成如下调用链:

    1. FileSystemArchive::findFileInfo
    
                      ||
                      \/
    
    2. FileSystemArchive::findFiles(const String& pattern, bool recursive, 
            bool dirs, StringVector* simpleList, FileInfoList* detailList)

           其中的调用“结点2”——findFiles()函数展开后为:

    复制代码
     1     void FileSystemArchive::findFiles(const String& pattern, bool recursive, 
     2         bool dirs, StringVector* simpleList, FileInfoList* detailList) const
     3     {
     4         intptr_t lHandle, res;
     5         struct _finddata_t tagData;
     6 
     7         // pattern can contain a directory name, separate it from mask
     8         size_t pos1 = pattern.rfind ('/');
     9         size_t pos2 = pattern.rfind ('\\');
    10         if (pos1 == pattern.npos || ((pos2 != pattern.npos) && (pos1 < pos2)))
    11             pos1 = pos2;
    12         String directory;
    13         if (pos1 != pattern.npos)
    14             directory = pattern.substr (0, pos1 + 1);
    15 
    16         String full_pattern = concatenate_path(mName, pattern);
    17 
    18         lHandle = _findfirst(full_pattern.c_str(), &tagData);
    19         res = 0;
    20         while (lHandle != -1 && res != -1)
    21         {
    22             if ((dirs == ((tagData.attrib & _A_SUBDIR) != 0)) &&
    23                 ( !msIgnoreHidden || (tagData.attrib & _A_HIDDEN) == 0 ) &&
    24                 (!dirs || !is_reserved_dir (tagData.name)))
    25             {
    26                 if (simpleList)
    27                 {
    28                     simpleList->push_back(directory + tagData.name);
    29                 }
    30                 else if (detailList)
    31                 {
    32                     FileInfo fi;
    33                     fi.archive = this;
    34                     fi.filename = directory + tagData.name;
    35                     fi.basename = tagData.name;
    36                     fi.path = directory;
    37                     fi.compressedSize = tagData.size;
    38                     fi.uncompressedSize = tagData.size;
    39                     detailList->push_back(fi);
    40                 }
    41             }
    42             res = _findnext( lHandle, &tagData );
    43         }
    44         // Close if we found any files
    45         if(lHandle != -1)
    46             _findclose(lHandle);
    47 
    48         // Now find directories
    49         if (recursive)
    50         {
    51             String base_dir = mName;
    52             if (!directory.empty ())
    53             {
    54                 base_dir = concatenate_path(mName, directory);
    55                 // Remove the last '/'
    56                 base_dir.erase (base_dir.length () - 1);
    57             }
    58             base_dir.append ("/*");
    59 
    60             // Remove directory name from pattern
    61             String mask ("/");
    62             if (pos1 != pattern.npos)
    63                 mask.append (pattern.substr (pos1 + 1));
    64             else
    65                 mask.append (pattern);
    66 
    67             lHandle = _findfirst(base_dir.c_str (), &tagData);
    68             res = 0;
    69             while (lHandle != -1 && res != -1)
    70             {
    71                 if ((tagData.attrib & _A_SUBDIR) &&
    72                     ( !msIgnoreHidden || (tagData.attrib & _A_HIDDEN) == 0 ) &&
    73                     !is_reserved_dir (tagData.name))
    74                 {
    75                     // recurse
    76                     base_dir = directory;
    77                     base_dir.append (tagData.name).append (mask);
    78                     findFiles(base_dir, recursive, dirs, simpleList, detailList);
    79                 }
    80                 res = _findnext( lHandle, &tagData );
    81             }
    82             // Close if we found any files
    83             if(lHandle != -1)
    84                 _findclose(lHandle);
    85         }
    86     }
    复制代码

           其作用是在本Archive指定的目录下搜索以pattern(findFiles的第一个参数)为后缀名的文件,并将满足条件的所有文件的相关信息(包括文件名、相应Archive对象指针、路径名及是否为压缩文件等)添加到名为detailList的FileInfoList中去并返回给调用函数。而ResourceGroupManager::findResourceFileInfo()函数会对保存在本group的locationList中的所有Archive对象进行如上操作(findResourceFileInfo()函数22-26行)。

           因此,回到最开始的ResourceGroupManager::parseResourceGroupScripts()函数,可以知道第16-33行的作用是:对指定的resourceGroup进行搜索,并将保存在locationList中的所有Archive对象对应目录下,后缀名为资源管理器指定的文件类型(由mScriptPatterns来指定,对ScriptCompilerManager来说mScriptPattern中的值为:“.material”、“.program”、“.particle”、“.compositor”)的文件的相关信息,以文件为单位保存到scriptLoaderFileList(在第12行中定义)列表中。

      ResourceGroupManager::parseResourceGroupScripts()函数的第39-79行,则实现了对保存在scriptLoaderFileList列表中对应的脚本文件的解析。其中最核心的逻辑是DataStreamPtr stream = fii->archive->open(fii->filename)(60行)和su->parseScript()(70、73行)。第60行用于打开待解析的脚本文件,而su->parseScript()函数则会调用相应资源管理器的parseScript(DataStreamPtr& stream, const String& groupName)函数。以ScriptCompilerManager为例,其代码为:
    
    复制代码
     1     void ScriptCompilerManager::parseScript(DataStreamPtr& stream, const String& groupName)
     2     {
     3 #if OGRE_THREAD_SUPPORT
     4         // check we have an instance for this thread (should always have one for main thread)
     5         if (!OGRE_THREAD_POINTER_GET(mScriptCompiler))
     6         {
     7             // create a new instance for this thread - will get deleted when
     8             // the thread dies
     9             OGRE_THREAD_POINTER_SET(mScriptCompiler, OGRE_NEW ScriptCompiler());
    10         }
    11 #endif
    12         // Set the listener on the compiler before we continue
    13         {
    14             OGRE_LOCK_AUTO_MUTEX
    15             OGRE_THREAD_POINTER_GET(mScriptCompiler)->setListener(mListener);
    16         }
    17         OGRE_THREAD_POINTER_GET(mScriptCompiler)->compile(stream->getAsString(), stream->getName(), groupName);
    18     }
    复制代码
     
     

           其中,stream->getAsString()用来将脚本文件中的内容以字符串的形式加载到内存;stream->getName()用来返回待解析脚本文件的文件名。

     

     

     

     

     

     

     

    作者: yzwalkman
    转载请注明出处。
    展开全文
  • OGRE源代码ogre_src_v1-8-1.zip.001 part1 http://download.csdn.net/detail/xzx0524/4843490中把part2下过来 放在同一个文件夹,解压即可.
  • Ogre源代码浅析——插件(Plugin)工作原理  Ogre引擎由多个模块组成,从不同角度来划分可以得到不同的结果。从功能上看Ogre可大致分为资源管理、场景管理和渲染管理三大模块;而从可执行部分的组织方式看,Ogre...
  • Ogre 源代码浅析——插件(Plugin)工作原理  Ogre引擎由多个模块组成,从不同角度来划分可以得到不同的结果。从功能上看Ogre可大致分为资源管理、场景管理和渲染管理三大模块;而从可...
  • Ogre源代码浅析

    2015-09-21 07:55:40
    http://www.cnblogs.com/yzwalkman/archive/2013/02/20/2916953.html
  • OGRE源代码resource分析

    2012-05-25 12:02:00
    在载入模型和运行游戏的过程中资源的载入是一个很重要的过程,这些资源一般包括,... 这是ogre中resource的继承关系图,可以很明显的看到所有的具体资源类都是派生自一个基类Resource,现在来看看resource中都包...
  • 靖心注:自己编译Ogre就可以学习Ogre源代码了,能熟悉这个引擎的代码就可以说是个高手了吧。尤其是现在大家都用Windows7或者8了,但是好像还找不到一篇给初学者介绍如何编译Ogre引擎的文章,故此在外文中找了一篇...
  • Ogre的许多外部资源数据都有着相应的脚本格式,现例举如下: Material(材质):Ogre使用的是“大材质”的概念。狭义的“材质”概念往往是与“贴图”等概念区分开的,比如在Lambert光照模型中,它一般用来指物体...
  • 经过以上三个阶段的处理,借由AbstractTreeBuilder类对象,Ogre终于“理解”了指定的脚本文件究竟包含了哪些脚本对象,以及这些脚本对象间的相互关系。需要强调的是,此时各脚本对象所包含的内部数据并未被加载。在...
  • 在完成了对脚本源文件的“词法分析”后,Ogre将进入到parse也就是“语义分析”阶段。这两个阶段的作用,从各自定义的数据结构中就可以一窥端倪,看下相应的结点定义: 1 struct ScriptToken 2 { 3 /// This is ...
  • Ogre对脚本中import语句的内容将生成对应的ImportAbstractNode对象(参见:http://www.cnblogs.com/yzwalkman/archive/2013/01/08/2848831.html“脚本及其解析四”)。在创建数据对象前,对ImportAbstractNode对象的...
  • 第一种,文件信息有固定的格式但没有太过复杂的结构,比如Ogre中的.cfg格式文件。对这种文件,一般可以逐行读取并直接按行解析。整个过程相对比较简单。第二种,文件本身有比较复杂的结构,而且文件信息的组织要符合...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,620
精华内容 1,848
关键字:

ogre源代码