SceneDB add CreateMaterialInstance,CreateRenderable,CreateTextRenderable functions.

This commit is contained in:
hyzboy 2020-08-08 22:54:09 +08:00
parent 90314c4b97
commit 38a365306d
6 changed files with 71 additions and 30 deletions

View File

@ -55,16 +55,6 @@ public:
private: private:
bool InitTileFont()
{
Font chs_fnt(OS_TEXT("微软雅黑"),0,CHAR_BITMAP_SIZE);
font_source=AcquireFontSource(chs_fnt);
tile_font=device->CreateTileFont(font_source);
return(true);
}
bool InitMaterial() bool InitMaterial()
{ {
material=shader_manage->CreateMaterial( OS_TEXT("res/shader/DrawRect2D.vert"), material=shader_manage->CreateMaterial( OS_TEXT("res/shader/DrawRect2D.vert"),
@ -124,7 +114,17 @@ private:
return pipeline; return pipeline;
} }
bool InitTextRenderable() bool InitTileFont()
{
Font chs_fnt(OS_TEXT("微软雅黑"),0,CHAR_BITMAP_SIZE);
font_source=AcquireFontSource(chs_fnt);
tile_font=device->CreateTileFont(font_source);
return(true);
}
bool InitTextLayoutEngine()
{ {
CharLayoutAttr cla; CharLayoutAttr cla;
TextLayoutAttributes tla; TextLayoutAttributes tla;
@ -135,10 +135,6 @@ private:
tla.char_layout_attr=&cla; tla.char_layout_attr=&cla;
tla.line_gap=0.2f; tla.line_gap=0.2f;
text_render_obj=new TextRenderable(device,material);
db->Add(text_render_obj);
tl_engine.Set(tile_font->GetFontSource()); tl_engine.Set(tile_font->GetFontSource());
tl_engine.Set(&tla); tl_engine.Set(&tla);
tl_engine.SetTextDirection(0); tl_engine.SetTextDirection(0);
@ -146,12 +142,17 @@ private:
tl_engine.SetMaxWidth(0); tl_engine.SetMaxWidth(0);
tl_engine.SetMaxHeight(0); tl_engine.SetMaxHeight(0);
if(!tl_engine.Init()) return tl_engine.Init();
return(false); }
bool InitTextRenderable()
{
UTF16String str; UTF16String str;
LoadStringFromTextFile(str,OS_TEXT("res/text/DaoDeBible.txt")); LoadStringFromTextFile(str,OS_TEXT("res/text/DaoDeBible.txt"));
text_render_obj=db->CreateTextRenderable(material);
return(tl_engine.SimpleLayout(text_render_obj,tile_font,str)>0); return(tl_engine.SimpleLayout(text_render_obj,tile_font,str)>0);
} }
@ -162,9 +163,6 @@ public:
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false); return(false);
if(!InitTileFont())
return(false);
if(!InitUBO()) if(!InitUBO())
return(false); return(false);
@ -174,6 +172,12 @@ public:
if(!InitPipeline()) if(!InitPipeline())
return(false); return(false);
if(!InitTileFont())
return(false);
if(!InitTextLayoutEngine())
return(false);
if(!InitTextRenderable()) if(!InitTextRenderable())
return(false); return(false);

View File

@ -190,15 +190,13 @@ private:
{ {
const int tile_count=tile_list.GetCount(); const int tile_count=tile_list.GetCount();
render_obj=material->CreateRenderable(tile_count); render_obj=db->CreateRenderable(material,tile_count);
vertex_buffer =db->CreateVAB(VAF_VEC4,tile_count,vertex_data); vertex_buffer =db->CreateVAB(VAF_VEC4,tile_count,vertex_data);
tex_coord_buffer=db->CreateVAB(VAF_VEC4,tile_count,tex_coord_data); tex_coord_buffer=db->CreateVAB(VAF_VEC4,tile_count,tex_coord_data);
render_obj->Set("Vertex",vertex_buffer); render_obj->Set("Vertex",vertex_buffer);
render_obj->Set("TexCoord",tex_coord_buffer); render_obj->Set("TexCoord",tex_coord_buffer);
db->Add(render_obj);
} }
bool InitPipeline() bool InitPipeline()

View File

@ -58,8 +58,8 @@ private:
if(!material) if(!material)
return(false); return(false);
render_obj=material->CreateRenderable(VERTEX_COUNT); render_obj=db->CreateRenderable(material,VERTEX_COUNT);
material_instance=material->CreateInstance(); material_instance=db->CreateMaterialInstance(material);
texture=vulkan::CreateTextureFromFile(device,OS_TEXT("res/image/lena.Tex2D")); texture=vulkan::CreateTextureFromFile(device,OS_TEXT("res/image/lena.Tex2D"));
@ -70,9 +70,7 @@ private:
material_instance->Update(); material_instance->Update();
db->Add(material); db->Add(material);
db->Add(material_instance);
db->Add(texture); db->Add(texture);
db->Add(render_obj);
return(true); return(true);
} }

View File

@ -11,6 +11,7 @@
#include<hgl/graph/vulkan/VKMaterialInstance.h> #include<hgl/graph/vulkan/VKMaterialInstance.h>
#include<hgl/graph/VertexAttribData.h> #include<hgl/graph/VertexAttribData.h>
#include<hgl/graph/RenderableInstance.h> #include<hgl/graph/RenderableInstance.h>
#include<hgl/graph/font/TextRenderable.h>
#include<hgl/type/ResManage.h> #include<hgl/type/ResManage.h>
namespace hgl namespace hgl
{ {
@ -86,7 +87,11 @@ namespace hgl
vulkan::IndexBuffer *CreateIBO16(uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT16,count,nullptr,sharing_mode);} vulkan::IndexBuffer *CreateIBO16(uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT16,count,nullptr,sharing_mode);}
vulkan::IndexBuffer *CreateIBO32(uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT32,count,nullptr,sharing_mode);} vulkan::IndexBuffer *CreateIBO32(uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT32,count,nullptr,sharing_mode);}
RenderableInstance * CreateRenderableInstance(vulkan::Pipeline *p,vulkan::MaterialInstance *mi,vulkan::Renderable *r); vulkan::MaterialInstance *CreateMaterialInstance(vulkan::Material *);
vulkan::Renderable *CreateRenderable(vulkan::Material *,const uint32_t vertex_count=0);
TextRenderable * CreateTextRenderable(vulkan::Material *);
RenderableInstance *CreateRenderableInstance(vulkan::Pipeline *p,vulkan::MaterialInstance *mi,vulkan::Renderable *r);
vulkan::Sampler *CreateSampler(VkSamplerCreateInfo *sci=nullptr); vulkan::Sampler *CreateSampler(VkSamplerCreateInfo *sci=nullptr);

View File

@ -41,7 +41,7 @@ protected:
public: public:
Renderable(const VertexShaderModule *,const uint32_t dc); Renderable(const VertexShaderModule *,const uint32_t dc=0);
virtual ~Renderable(); virtual ~Renderable();
const uint GetRefCount()const{return ref_count;} const uint GetRefCount()const{return ref_count;}

View File

@ -50,6 +50,42 @@ namespace hgl
rm_buffers.Add(buf); rm_buffers.Add(buf);
return(buf); return(buf);
} }
vulkan::MaterialInstance *SceneDB::CreateMaterialInstance(vulkan::Material *mtl)
{
if(!mtl)return(nullptr);
vulkan::MaterialInstance *mi=mtl->CreateInstance();
if(mi)
Add(mi);
return mi;
}
vulkan::Renderable *SceneDB::CreateRenderable(vulkan::Material *mtl,const uint32_t vertex_count)
{
if(!mtl)return(nullptr);
vulkan::Renderable *ro=mtl->CreateRenderable(vertex_count);
if(ro)
Add(ro);
return ro;
}
TextRenderable *SceneDB::CreateTextRenderable(vulkan::Material *mtl)
{
if(!mtl)return(nullptr);
TextRenderable *tr=new TextRenderable(device,mtl);
if(tr)
Add(tr);
return tr;
}
RenderableInstance *SceneDB::CreateRenderableInstance(vulkan::Pipeline *p,vulkan::MaterialInstance *mi,vulkan::Renderable *r) RenderableInstance *SceneDB::CreateRenderableInstance(vulkan::Pipeline *p,vulkan::MaterialInstance *mi,vulkan::Renderable *r)
{ {