auto clear chars from tile font.
This commit is contained in:
parent
eb30999133
commit
fe730defb7
2
CMCore
2
CMCore
@ -1 +1 @@
|
||||
Subproject commit 9376568d47e1195a71b67b43d15042765e90cccf
|
||||
Subproject commit c2ac03c35bc545ae529cd54569c7557dc338fd67
|
@ -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);
|
||||
|
||||
|
@ -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:
|
||||
|
||||
|
@ -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
|
||||
|
||||
/**
|
||||
|
@ -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:
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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???这是全空格?
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user