目的

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

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

  1. 武侠世界(天龙八部)源码 vs2015编译 记录

    有一份天龙八部的源码,由于太古老用vs2015打开编译时,报一大堆错误,只能一步一步修改,现将具体的修改步骤记录下,供自己回忆及有相同想法的朋友参考 编译已经通过,由于缺少配置文件及相关的资源,(等有 ...

  2. Nmap源码分析(脚本引擎)

    Nmap提供了强大的脚本引擎(NSE),以支持通过Lua编程来扩展Nmap的功能.目前脚本库已经包含300多个常用的Lua脚本,辅助完成Nmap的主机发现.端口扫描.服务侦测.操作系统侦测四个基本功能 ...

  3. 数据装载 计算执行脚本总耗时_shell源码_01

    文章目录 1. 源码分析 2. shell脚本 1. 源码分析 执行前记录开始时间 执行脚本 记录记录结束时间 总耗时=结束时间-开始时间 2. shell脚本 #!/bin/bash startti ...

  4. 利用SpringBoot和Vue实现前后端分离(附源码)

    利用SpringBoot和Vue实现前后端分离(附源码) 引言: 本文主要分享了SpringBoot和Vue整合实现前后端分离,实现了简单的增删查改:包括:项目的搭建.后端的实现.前台的实现:(附源码 ...

  5. 第二章:小朱笔记hadoop之源码分析-脚本分析

    第二章:小朱笔记hadoop之源码分析-脚本分析 第一节:start-all.sh 第二节:hadoop-config.sh 第三节:hadoop-env.sh 第四节:start-dfs.sh 第五 ...

  6. 计算机毕业设计Java前后端分离健身房管理系统(源码+系统+mysql数据库+lw文档)

    计算机毕业设计Java前后端分离健身房管理系统(源码+系统+mysql数据库+lw文档) 计算机毕业设计Java前后端分离健身房管理系统(源码+系统+mysql数据库+lw文档) 本源码技术栈: 项目 ...

  7. v58.03 鸿蒙内核源码分析(环境脚本) | 编译鸿蒙原来很简单 | 百篇博客分析HarmonyOS源码

    颜渊问仁.子曰:"克己复礼为仁.一日克己复礼,天下归仁焉.为仁由己,而由人乎哉?"颜渊曰:"请问其目."子曰:"非礼勿视,非礼勿听,非礼勿言,非礼勿动 ...

  8. java毕业设计前后端分离健身房管理系统源码+lw文档+mybatis+系统+mysql数据库+调试

    java毕业设计前后端分离健身房管理系统源码+lw文档+mybatis+系统+mysql数据库+调试 java毕业设计前后端分离健身房管理系统源码+lw文档+mybatis+系统+mysql数据库+调 ...

  9. 【SA8295P 源码分析】53 - mifs.build.tmpl 脚本详解:启动QNX procnto-smp-instr微内核、启动QNX串口终端shell、加载解析并执行ifs2_la.img

    [SA8295P 源码分析]53 - mifs.build.tmpl 脚本详解:启动QNX procnto-smp-instr微内核.启动QNX串口终端shell.加载解析并执行ifs2_la.img ...

  10. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)

    阅读目录 一.Django请求生命周期: 二.WEB开发模式: 三.cbv源码分析: 四.认识RESTful 补充知识:跨域 五.基于原生django开发restful的接口 六.drf安装.使用.A ...

最新文章

  1. 双十一电商江湖:唯品会与天猫发力“天团“
  2. 大数据小白系列——HDFS(3)
  3. ActionScript接收socket服务器发送来的数据
  4. 简述tcp协议三报文握手过程_华为原理 | 传输层协议amp;交换转发原理
  5. IOS开发基础之大转盘案例
  6. 团队二阶段冲刺个人工作总结2
  7. mongodb----副本集搭建及故障自动切换
  8. 网络监视工具nethogs命令
  9. 集结500+CEO北京共“吹牛”,移动认证又搞什么大事情?
  10. docker 容器和镜像的区别
  11. 正确率、召回率和F值
  12. 微信开通检测软件的原理及使用方法
  13. AD9371+ZYNQ结构中JESD204B IP核的AXI_STREAM接口数据结构
  14. linux ip被占用顶掉,记一次 Linux服务器被***后的排查思路
  15. 文件服务器大量传送减负需要开启,网卡参数中的eee、流量控制、巨型帧、大量传输减负、中断节流率等名词都是什么意思doc.doc...
  16. 录音音频如何转换为mp3格式
  17. HJ95 人民币转换
  18. spring中的loc和aop
  19. 使用arcgis和QGIS绘制采样点图
  20. wordCount的解析

热门文章

  1. matlab 默认颜色顺序,MATLAB:设置行的颜色和样式顺序并行应用
  2. 顶级域名 一级域名 二级域名 三级域名什么区别?
  3. 虚幻引擎5改变了游戏,并与Perforce原生集成
  4. 红外遥控接收发射原理及ESP8266实现
  5. airpod蓝牙耳机音量大解决办法_airpods使用方法_airpods怎么调音量
  6. 在线有道词典,又添新特色了!
  7. 运行您自己的电子邮件服务器:自定义Roundcube
  8. 武大计算机专硕和学硕,专硕与学硕,到底有什么区别?
  9. 联想笔记本更换硬盘/改Win 7系统安装过程中报0x000000A5蓝屏
  10. 第六章、正弦稳态电路分析