游戏引擎Flax Engine源码分析(十二)渲染

2021SC@SDUSC


一、简述

        在之前的博客中我们已经吧2D渲染中大部分内容都分析结束,接下来这篇博客将会对剩余内容进行分析,如字体等。。。

二、分析       

        首先是几个头文件:

        (一)、font.h

        结构体fontRange(文本范围):

 struct TextRange
{
DECLARE_SCRIPTING_TYPE_MINIMAL(TextRange);
    API_FIELD() int32 StartIndex;
    API_FIELD() int32 EndIndex;
    int32 Length() const
    {return EndIndex - StartIndex;}
    bool IsEmpty() const
    {return (EndIndex - StartIndex) <= 0;}
    bool Contains(int32 index) const
    {return index >= StartIndex && index < EndIndex;}
    bool Intersect(const TextRange& other) const
    {return Math::Min(EndIndex, other.EndIndex) > Math::Max(StartIndex, other.StartIndex);}
};

        包括开始索引StartIndex,结束索引 EndIndex

        Contains()确定此范围是否包含字符索引,index为索引,如果范围包含指定的字符索引返回true;

        Intersect()确定此范围是否与其他范围相交,other其他文本范围,如果范围与指定的范围索引相交返回true。
        结构体FontLineCache(文本处理过程中生成的字体行信息):

struct FontLineCache
{
DECLARE_SCRIPTING_TYPE_MINIMAL(FontLineCache);
    API_FIELD() Vector2 Location;
    API_FIELD() Vector2 Size;
    API_FIELD() int32 FirstCharIndex;
    API_FIELD() int32 LastCharIndex;
};

        Location线的root位置(左上角),Size线条边界(宽度和高度),FirstCharIndex第一个字符索引(来自输入文本), LastCharIndex最后一个字符索引(来自输入文本)。

        下面是Flax Engine开发人员给出的字体字形指标:

        结构体FontCharacterEntry(缓存的字体字符条目(读取以进行渲染和进一步处理)) :

FontCharacterEntry
{
DECLARE_SCRIPTING_TYPE_MINIMAL(FontCharacterEntry);
    API_FIELD() Char Character;
    API_FIELD() bool IsValid = false;
    API_FIELD() byte TextureIndex;
    API_FIELD() int16 OffsetX;
    API_FIELD() int16 OffsetY;
    API_FIELD() int16 AdvanceX;
    API_FIELD() int16 BearingY;
    API_FIELD() int16 Height;
    API_FIELD() Vector2 UV;
    API_FIELD() Vector2 UVSize;
};

        Character此条目表示的字符,Valid有效性,TextureIndex字体缓存中特定纹理的索引,OffsetX和OffsexY分别以整数像素表示的左方位角和顶部方位,AdvanceX在绘制字符串中的下一个字符之前在 X 中前进的数量,BearingY从基线到字形最高点的距离,Height字形的高度(以像素为单位),UV角色在纹理中的起始位置(在纹理坐标空间中),UVSize纹理中字符的大小(在纹理坐标空间中)。

        接下来我们看比较关键的部分,也就是字体类(Font),表示可以在文本呈现期间使用的字体对象(它使用字体资源,但具有用于所选字体属性的预缓存数据)。

API_CLASS(Sealed, NoSpawn) class FLAXENGINE_API Font : public ManagedScriptingObject

        属性:

 friend FontAsset;
private:
    FontAsset* _asset;
    int32 _size;
    int32 _height;
    int32 _ascender;
    int32 _descender;
    int32 _lineGap;
    bool _hasKerning;
    Dictionary<Char, FontCharacterEntry> _characters;
    mutable Dictionary<uint32, int32> _kerningTable;

         一个无参构造方法和一个带参构造方法:

 Font(FontAsset* parentAsset, int32 size);
 Font();

        包括一些基本的Get和Set函数,其他功能函数:

void CacheText(const StringView& text);
void Invalidate();
void ProcessText(const StringView& text, Array<FontLineCache>& outputLines, API_PARAM(Ref) const TextLayoutOptions& layout);
Vector2 MeasureText(const StringView& text, API_PARAM(Ref) const TextLayoutOptions& layout);
int32 HitTestText(const StringView& text, const Vector2& location, API_PARAM(Ref) const TextLayoutOptions& layout);
Vector2 GetCharPosition(const StringView& text, int32 index, API_PARAM(Ref) const TextLayoutOptions& layout);
void FlushFaceSize() const;

        大部分有重载,这里不再过多解释,仅介绍几个函数的功能:

        CacheText()缓存给定的文本以准备呈现。"text"要缓存的文本字符。 

        Invalidate()使用此字体使所有缓存的动态字体图集无效。 可用于在更改字体资产选项后重新加载字体字符。

        ProcessText()处理文本以获取用于渲染的缓存行。"text"输入文本。"layout"布局属性。"outputLines"输出行列表。

        MeasureText()测量绘制给定文本所需的矩形的最小尺寸。"text"要测试的输入文本。"layout"布局属性。返回该文本和照片的最小尺寸以正确呈现。

        HitTestText()计算给定位置的命中字符索引。"text"要测试的输入文本。"textRange"输入文本范围(输入文本参数的子字符串范围)。"location"要测试的输入位置。"layout"文本布局属性。返回选中的字符位置索引(如果位置在布局矩形之外,可以等于文本长度)。

        GetCharPosition()计算给定文本和字符索引的字符位置。"text"要测试的输入文本。"index"获取坐标的文本位置。"layout"文本布局属性。返回字符位置(可用于插入符号位置的左上角)。

        FlushFaceSize()使用自由类型库后端刷新人脸的大小。


        (二)、FontAsset.h

        枚举:

enum class FontHinting : byte
enum class FontFlags : byte

         FontHinting渲染字符时使用的字体提示。FontFlags渲染字符时使用的字体标志。

        下面我们直接看类字体资源(FontAsset):

        属性:

 friend Font;
private:

    FT_Face _face;
    FontOptions _options;
    BytesContainer _fontFile;
    Array<Font*, InlinedAllocation<32>> _fonts;

        基本Get和Set方法,其他方法:

Font* CreateFont(int32 size);
bool Save(const StringView& path = StringView::Empty);
void Invalidate();

        CreateFont()创建给定字符大小的字体对象。“size”字体字符大小。返回创建的字体对象。

        Save()将此资产保存到文件中。 仅在编辑器中支持。"path"用于保存的自定义资产路径。 使用空值将此资产保存到其自己的存储位置, 可用于复制资产。,保存虚拟资产时必须指定。如果不能保存数据则为真,否则为假。

        Invalidate()使用此字体使所有缓存的动态字体图集无效。 可用于在更改字体资产选项后重新加载字体字符。


        这篇博客就先介绍到这里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值