实现Ogre的脚本分离 - 天龙八部的源码分析(一)

目的

在研究天龙八部游戏的源码之时, 发现 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”, 就可以看到正确的显示结果了.

结果演示

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值