auto clear chars from tile font.

This commit is contained in:
hyzboy 2022-02-21 17:13:12 +08:00
parent eb30999133
commit fe730defb7
9 changed files with 70 additions and 24 deletions

2
CMCore

@ -1 +1 @@
Subproject commit 9376568d47e1195a71b67b43d15042765e90cccf
Subproject commit c2ac03c35bc545ae529cd54569c7557dc338fd67

View File

@ -94,7 +94,6 @@ public: //Material
MaterialInstance * CreateMaterialInstance(const OSString &,const VABConfigInfo *vab_cfg=nullptr);
Renderable * CreateRenderable(const uint32_t vertex_count=0);
TextRenderable * CreateTextRenderable(Material *);
RenderableInstance *CreateRenderableInstance(Renderable *r,MaterialInstance *mi,Pipeline *p);

View File

@ -101,6 +101,7 @@ namespace hgl
int draw_chars_count; ///<要绘制字符列表
SortedSets<u32char> chars_sets; ///<不重复字符统计缓冲区
SortedSets<u32char> clear_chars_sets; ///<待清除的字符合集
TileUVFloatMap chars_uv; ///<所有要绘制字符的uv
struct CharDrawAttr
@ -111,7 +112,7 @@ namespace hgl
ObjectList<CharDrawAttr> draw_chars_list; ///<所有字符属性列表
template<typename T> bool preprocess(TileFont *,const T *,const int);
template<typename T> bool preprocess(TextRenderable *,TileFont *,const T *,const int);
protected:

View File

@ -33,6 +33,8 @@ namespace hgl
Color4f color;
GPUBuffer * ubo_color;
SortedSets<TextRenderable *> tr_sets;
private:
friend TextRender *CreateTextRender(GPUDevice *,FontSource *,RenderPass *,GPUBuffer *);
@ -57,6 +59,8 @@ namespace hgl
bool Layout(TextRenderable *tr,const UTF16String &str);
RenderableInstance *CreateRenderableInstance(TextRenderable *text_render_obj);
void Release(TextRenderable *);
};//class TextRender
/**

View File

@ -19,10 +19,24 @@ namespace hgl
VBO * vbo_position;
VBO * vbo_tex_coord;
protected:
friend class TextLayout;
friend class TextRender;
SortedSets<u32char> chars_sets;
const SortedSets<u32char> &GetCharsSets()const{return chars_sets;}
void SetCharsSets(const SortedSets<u32char> &sl){chars_sets=sl;}
void ClearCharsSets(){chars_sets.Clear();}
private:
virtual ~TextRenderable();
public:
TextRenderable(GPUDevice *,Material *,uint mc=1024);
virtual ~TextRenderable();
public:

View File

@ -84,18 +84,6 @@ Renderable *RenderResource::CreateRenderable(const uint32_t vertex_count)
return ro;
}
TextRenderable *RenderResource::CreateTextRenderable(Material *mtl)
{
if(!mtl)return(nullptr);
TextRenderable *tr=new TextRenderable(device,mtl);
if(tr)
Add(tr);
return tr;
}
RenderableInstance *RenderResource::CreateRenderableInstance(Renderable *r,MaterialInstance *mi,Pipeline *p)
{
if(!p||!mi||!r)

View File

@ -48,9 +48,10 @@ namespace hgl
*
*/
template<typename T>
bool TextLayout::preprocess(TileFont *tile_font,const T *str,const int str_length)
bool TextLayout::preprocess(TextRenderable *tr,TileFont *tile_font,const T *str,const int str_length)
{
if(!tile_font
if(!tr
||!tile_font
||!str||!*str||str_length<=0
||!font_source)
return(false);
@ -82,6 +83,20 @@ namespace hgl
}
}
//释放不再使用的字符
{
clear_chars_sets=tr->GetCharsSets(); //获取不再使用的字符合集
clear_chars_sets.Clear(chars_sets); //清除下一步要用的字符合集
if(clear_chars_sets.GetCount()>0) //可以彻底清除的字符
{
tile_font->Unregistry(clear_chars_sets.GetList());
clear_chars_sets.ClearData();
}
}
//注册不重复字符给tile font系统获取所有字符的UV
if(!tile_font->Registry(chars_uv,chars_sets))
{
@ -91,6 +106,8 @@ namespace hgl
return(false);
}
tr->SetCharsSets(chars_sets); //注册需要使用的字符合集
//为可绘制字符列表中的字符获取UV
{
CharDrawAttr **cda=draw_chars_list.GetData();
@ -236,7 +253,7 @@ namespace hgl
int max_chars=str.Length();
if(!preprocess<T>(tf,str.c_str(),max_chars))
if(!preprocess<T>(tr,tf,str.c_str(),max_chars))
return(-2);
if(draw_chars_count<=0) //可绘制字符为0这是全空格

View File

@ -28,6 +28,14 @@ namespace hgl
TextRender::~TextRender()
{
for(TextRenderable *tr:tr_sets)
{
tile_font->Unregistry(tr->GetCharsSets().GetList());
delete tr;
}
tr_sets.Clear();
SAFE_CLEAR(tl_engine);
SAFE_CLEAR(tile_font);
SAFE_CLEAR(db);
@ -140,12 +148,16 @@ namespace hgl
TextRenderable *TextRender::CreateRenderable()
{
return db->CreateTextRenderable(material);
TextRenderable *tr=new TextRenderable(device,material);
tr_sets.Add(tr);
return tr;
}
TextRenderable *TextRender::CreateRenderable(const UTF16String &str)
{
TextRenderable *tr=db->CreateTextRenderable(material);
TextRenderable *tr=CreateRenderable();
if(tl_engine->SimpleLayout(tr,tile_font,str)<=0)
return(tr);
@ -169,6 +181,17 @@ namespace hgl
return db->CreateRenderableInstance(text_render_obj,material_instance,pipeline);
}
void TextRender::Release(TextRenderable *tr)
{
if(!tr)return;
if(!tr_sets.Delete(tr))return;
tile_font->Unregistry(tr->GetCharsSets().GetList());
delete tr;
}
FontSource *CreateCJKFontSource(const os_char *cf,const os_char *lf,const uint32_t size)
{
Font eng_fnt(lf,0,size);

View File

@ -28,7 +28,7 @@ namespace hgl
/**
* 使
* @param rs UV坐标
* @param ch_list
* @param chars_sets
*/
bool TileFont::Registry(TileUVFloatMap &uv_map,SortedSets<u32char> &chars_sets)
{