实现Ogre的脚本分离 - 天龙八部的源码分析(一)
2016-03-16 05:49
363 查看
目的
在研究天龙八部游戏的源码之时, 发现 Ogre 材质的模板部分被单独放在一个 material 文件之内, 继承模板的其他材质则位于另外的文件, 当我使用Ogre 官方源码, 加载脚本时其不会查找位于其他material文件内的基模板, 因此导致继承的材质部分加载失败.分析
材质脚本文件
举例, 脚本文件”女主角_脸01.material”其内的脚本代码为material 女主角_鸡蛋脸_01 : premierBaseTemplate { set_texture_alias <baseTexture> 女主角_鸡蛋脸_01.TGA }
这里材质”女主角_鸡蛋脸_01” 由基础材质 “premierBaseTemplate” 派生而来, 而材质 “premierBaseTemplate” 则位于 “actorBaseTemplate.material” 文件中, 如果直接使用 Ogre 加载这两个材质, 将无法正确加载派生材质.
分析源码
在分析源码和日志的过程中, 我发现天龙八部源码其使用不同的脚本加载器分析 material 脚本, 其中天龙八部使用的是 MaterialSerializer 类的 parseScript() 函数分析”.material”后缀的脚本, 而官方源码则使用 ScriptCompilerManager 类来分析 “.material” 后缀的脚本, 而在 ScriptCompilerManager 的分析过程中, 其不会去查找基材质是否已经加载, 这一点与 MaterialSerializer 的处理方法有所不同.解决问题
因此, 为了让 Ogre 默认使用 MaterialSerializer 类的相关函数来处理 “.material” 材质, 我们需要修改 Ogre 内加载器的注册部分, 首先我们找到 ScriptCompilerManager 类的构造函数, 注释掉 “.material” 的注册// mScriptPatterns.push_back("*.material");
现在, 我们在 MaterialManager 的构造函数内增加 “.material” 的注册, 使得该管理器成为处理 “material” 脚本的默认选择
mScriptPatterns.push_back("*.material"); ResourceGroupManager::getSingleton()._registerScriptLoader(this);
最后一步, 在 MaterialManager 的 parseScript() 方法内, 注释掉默认的脚本处理, 使用 MaterialSerializer 类来处理脚本.
// ScriptCompilerManager::getSingleton().parseScript(stream, groupName); mSerializer->parseScript(stream, groupName);
结果
现在在直接加载”女主角_脸01.material”, 就可以看到正确的显示结果了.相关文章推荐
- 我为什么想并且要学习Scala
- lintcode-medium-Coins in a Line II
- algorithm@ Divide two integers without using multiplication, division and mod operator. (Bit Operation)
- HDU 2717 Catch That Cow(BFS)
- php wampp 访问数据库
- 《kali linux 渗透测试初级教程》免费下载
- 九、排序算法的应用(找中位数、重复统计、Kendall tau距离等)
- 浅谈游戏服务器开发-地图描述
- foreach
- algorithm@ find the shortest path in a graph using BFS
- 如何获取网页验证码图片并保存到本地(Java实现) [问题点数:40分,结帖人lanxuezaipiao]
- 使用GPG学习非对称加密
- 检测用户是否具有administrator权限(OpenThreadToken,OpenProcessToken,GetTokenInformation,AllocateAndInitializeSid和EqualSid)
- Python学习笔记(3):类、网路编程
- [转载]C++中引用与指针的区别(详细介绍)
- selenium高级用法
- 信息系统项目管理03
- 放养的小爬虫--京东定向爬虫(AJAX获取价格数据)
- Atitit.视频文件加密的方法大的总结 java c# php
- Atitit.视频文件加密的方法大的总结 java c# php