Resource部分源码已经解读过了,对Ogre如何管理Resource的流程有了一定的了解。下面就来具体看下每种资源的实现。
Ogre中的Resource共用如下几种:
Texture、Compositor、Font、GpuProgram、Material、Mesh、Skeleton、BspLevel
本文的主角是Font
相关的头文件有:
OgreFont.h
OgreFontManager.h
(1)Font
首先来看下Font的成员变量
第一个变量类FontType是一个枚举,标示当前字体类型。Ogre中Font只有两种类型:truetype和image。
其余四个变量顾名思义。其中后三个和truetype类型字体有关。
Font中还有一个重要的结构体定义GlyphInfo,即字体轮廓信息。
CodePoint是一个无符号32位整型,用来表示一个unicode。
UVRect是一个模板参数类型为浮点数的矩形TRect<float>,用来表示字体轮廓大小。
Real则是长宽比例。
由于一个Font类通常表示一段编码范围的字体,所以该类中主要存储的数据类型定义如下
RangeList是以CodePoint的范围成对存储;map则是将每个CodePoint与相应的字体轮廓信息对应起来。
剩下的成员变量是Material和Texture,即保存字体在内存中以便显示的形式。
Material和Texture也都是Resource的一种,留以后解读源码。
再来关注下Font的成员函数
从UML图中可以看出,Font类不仅继承了Resource,还继承了ManualResourceLoader。继承自后者表示Font类支持自定义load方法,以手动方式导入资源。
所以,除去标准的getter/setter函数,Font主要实现了从Resource接口继承来的loadImpl和unloadImpl方法以及ManualResourceLoader类的loadResource方法。
首先是loadResource函数。
这个函数作用是导入字体文件,它封装了FreeType库load字体文件的操作,主要完成以下流程:
当导入了字体文件后,装载资源的流程就主要表现为设置material和texture,这就需要在loadImpl和unloadImpl函数中设置。
(2)FontManager
如同在资源管理一文中写到的意义,FontManager负责创建Font(ResourceManager负责创建Resource)。除此之外,在构造函数中,FontManager还要将自己注册入ResourceManager,方便后者进行管理。
FontManager中最主要的两个函数为
parseScript函数负责解析后缀为fontdef的脚本。
parseAttribute则将parseScript解析出来的相应属性,对Font类进行设置。设置方法是通过StringInterface中的Cmd模式。