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

时间:2022-09-01 21:38:58

目的

在研究天龙八部游戏的源码之时, 发现 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的脚本分离 - 天龙八部的源码分析(一)

实现Ogre的脚本分离 - 天龙八部的源码分析(一)的更多相关文章

  1. python基础-11 socket,IO多路复用,select伪造多线程,select读写分离。socketserver源码分析

    Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...

  2. &lbrack;Tomcat 源码分析系列&rsqb; &lpar;二&rpar; &colon; Tomcat 启动脚本-catalina&period;bat

    概述 Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat 上一篇咱们分析了 startup.bat 脚本 这一篇咱们来分析 ca ...

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

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

  4. 转&colon;Ogre源码分析之Root类、Facade模式

    Ogre源码分析(一)Root类,Facade模式 Ogre中的Root对象是一个Ogre应用程序的主入口点.因为它是整个Ogre引擎的外观(Façade)类.通过Root对象来开启和停止Ogre是最 ...

  5. 鸿蒙内核源码分析&lpar;编译脚本篇&rpar; &vert; 如何防编译环境中的牛皮癣 &vert; 百篇博客分析OpenHarmony源码 &vert; v58&period;01

    百篇博客系列篇.本篇为: v58.xx 鸿蒙内核源码分析(环境脚本篇) | 编译鸿蒙原来如此简单 | 51.c.h.o 本篇用两个脚本完成鸿蒙(L1)的编译环境安装/源码下载/编译过程,让编译,调试鸿 ...

  6. Android源码分析(十七)----init&period;rc文件添加脚本代码

    一:init.rc文件修改 开机后运行一次: chmod 777 /system/bin/bt_config.sh service bt_config /system/bin/bt_config.sh ...

  7. Duilib源码分析&lpar;一&rpar;整体框架

    Duilib界面库是一款由杭州月牙儿网络技术有限公司开发的界面开源库,以viksoe项目下的UiLib库的基础上开发(此后也将对UiLib库进行源码分析):通过XML布局界面,将用户界面和处理逻辑彻底 ...

  8. YII框架源码分析&lpar;百度PHP大牛创作-原版-无广告无水印&rpar;

           YII 框架源码分析    百度联盟事业部——黄银锋 目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 ...

  9. Hadoop2源码分析-MapReduce篇

    1.概述 前面我们已经对Hadoop有了一个初步认识,接下来我们开始学习Hadoop的一些核心的功能,其中包含mapreduce,fs,hdfs,ipc,io,yarn,今天为大家分享的是mapred ...

随机推荐

  1. Atitit&period;木马病毒强制强行关闭360&&num;160&semi;360tray&period;exe的方法

    Atitit.木马病毒强制强行关闭360 360tray.exe的方法 1. taskkill /im 进程名称1 2. 用 wmic process where name="进程名称&qu ...

  2. python decorator的理解

    一.decorator的作用 装饰器本质上是一个Python函数,可以让其他函数在不做任何代码变动的前提下增加额外功能. 装饰器的返回值也是一个函数对象.python里函数也是对象. 它经常用于有切面 ...

  3. POJ 2449 Remmarguts&&num;39&semi; Date --K短路

    题意就是要求第K短的路的长度(S->T). 对于K短路,朴素想法是bfs,使用优先队列从源点s进行bfs,当第K次遍历到T的时候,就是K短路的长度. 但是这种方法效率太低,会扩展出很多状态,所以 ...

  4. 滚轮事件的防冒泡、阻止默认行为的代码&lpar;效果是:只让当前div滚动,连当前文档都不滚动的效果&rpar;

    //用firefox变量表示火狐代理var firefox = navigator.userAgent.indexOf('Firefox') != -1;function MouseWheel(e){ ...

  5. 【双连通分量】Bzoj2730 HNOI2012 矿场搭建

    Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...

  6. 11&period; IDS (Intrusion detection systems 入侵检测系统 6个)

    Snort该网络入侵检测和防御系统擅长于IP网络上的流量分析和数据包记录. 通过协议分析,内容研究和各种预处理器,Snort可以检测到数千个蠕虫,漏洞利用尝试,端口扫描和其他可疑行为. Snort使用 ...

  7. SSM环境的搭建

    回顾 首先创建新的项目,选择Maven管理我们的依赖 如图所示: 当然我是为了做列子,所以采用的中文, 然后选择自己的maven地址,这里稍微注意的是,Maven默认读取的是 .m2/setting. ...

  8. 云计算SPI(SaaS、PaaS、IaaS)

    云计算SPI(SaaS.PaaS.IaaS) The other day, I arrived at the SAP LABS CHINA for interview with my pleasure ...

  9. 【Unity】状态机的状态改变及其回调

    问:怎么知道状态机发生了改变?即如何得知从一个状态切换到了另一个状态? 答:Unity使用StateMachineBehaviours类来描述状态机的行为,当状态机处于不同的状态时,会触发不同的回调. ...

  10. 深夜配置一把struts2

    在intellij idea里面配置出来了struts2的一个Helloworld,因为换了工具,在网上查了很多关于IDEA配置它的方式,好多是用Maven解决依赖关系的.于是按照网上的来,发现很多东 ...