From 1ebaedb350967062d85adedbce3e31ee2fbf3d70 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Thu, 16 Jul 2020 17:02:24 +0800 Subject: [PATCH] use "VertexAttribData" instead "VertexAttribBufferCreater" --- example/Vulkan/DrawText.cpp | 6 ++-- inc/hgl/graph/RenderableCreater.h | 19 ++++++++---- inc/hgl/graph/VertexAttribBufferCreater.h | 10 +++--- res | 2 +- src/SceneGraph/CMakeLists.txt | 2 +- src/SceneGraph/RenderableCreater.cpp | 38 ++++++++++++++++------- 6 files changed, 50 insertions(+), 27 deletions(-) diff --git a/example/Vulkan/DrawText.cpp b/example/Vulkan/DrawText.cpp index cf5ffda5..db10ab53 100644 --- a/example/Vulkan/DrawText.cpp +++ b/example/Vulkan/DrawText.cpp @@ -28,12 +28,12 @@ private: vulkan::Sampler * sampler =nullptr; vulkan::MaterialInstance * material_instance =nullptr; vulkan::Renderable * render_obj =nullptr; - vulkan::Buffer * ubo_world_matrix =nullptr; + vulkan::Buffer * ubo_world_matrix =nullptr; vulkan::Pipeline * pipeline =nullptr; - vulkan::VertexAttribBuffer * vertex_buffer =nullptr; - vulkan::VertexAttribBuffer * tex_coord_buffer =nullptr; + vulkan::VertexAttribBuffer *vertex_buffer =nullptr; + vulkan::VertexAttribBuffer *tex_coord_buffer =nullptr; private: diff --git a/inc/hgl/graph/RenderableCreater.h b/inc/hgl/graph/RenderableCreater.h index b9e52243..05844541 100644 --- a/inc/hgl/graph/RenderableCreater.h +++ b/inc/hgl/graph/RenderableCreater.h @@ -32,10 +32,17 @@ namespace hgl { AnsiString name; uint binding; - VABCreater *vabc; + VAD *vabc =nullptr; + + public: + + ~ShaderStageBind() + { + SAFE_CLEAR(vabc); + } };//struct ShaderStageBind - using VABCreaterMaps=MapObject; + using VABCreaterMaps=MapObject; /** * 可渲染对象创建器 @@ -61,12 +68,12 @@ namespace hgl RenderableCreater(SceneDB *sdb,vulkan::Material *m); virtual ~RenderableCreater()=default; - virtual bool Init(const uint32 count); + virtual bool Init(const uint32 count); ///<初始化,参数为顶点数量 - virtual VABCreater * CreateVAB(const AnsiString &name); + virtual VAD * CreateVAB(const AnsiString &name); ///<创建一个顶点属性缓冲区创建器 - uint16 * CreateIBO16(uint count,const uint16 *data=nullptr); - uint32 * CreateIBO32(uint count,const uint32 *data=nullptr); + uint16 * CreateIBO16(uint count,const uint16 *data=nullptr); ///<创建16位的索引缓冲区 + uint32 * CreateIBO32(uint count,const uint32 *data=nullptr); ///<创建32位的索引缓冲区 virtual vulkan::Renderable * Finish(); };//class RenderableCreater diff --git a/inc/hgl/graph/VertexAttribBufferCreater.h b/inc/hgl/graph/VertexAttribBufferCreater.h index c0abc756..b54624e1 100644 --- a/inc/hgl/graph/VertexAttribBufferCreater.h +++ b/inc/hgl/graph/VertexAttribBufferCreater.h @@ -9,7 +9,7 @@ namespace hgl /** * 顶点属性缓冲区创建者 */ - class VertexAttribBufferCreater ///顶点属性缓冲区创建者 + class VertexAttribData ///顶点属性缓冲区创建者 { void *mem_data; ///<内存中的数据 @@ -26,13 +26,13 @@ namespace hgl public: - VertexAttribBufferCreater(uint32_t c,uint32_t dc,uint32_t cs):count(c),dc_num(dc),comp_stride(cs),stride(dc*cs),total_bytes(dc*cs*c) + VertexAttribData(uint32_t c,uint32_t dc,uint32_t cs):count(c),dc_num(dc),comp_stride(cs),stride(dc*cs),total_bytes(dc*cs*c) { mem_data = hgl_malloc(total_bytes); //在很多情况下,hgl_malloc分配的内存是对齐的,这样有效率上的提升 mem_end = ((char *)mem_data) + total_bytes; } - virtual ~VertexAttribBufferCreater() + virtual ~VertexAttribData() { if(mem_data) hgl_free(mem_data); @@ -45,9 +45,9 @@ namespace hgl const uint32_t GetStride ()const{return stride;} ///<取得每一组数据字节数 void * GetData ()const{return mem_data;} ///<取得数据指针 const uint32_t GetTotalBytes ()const{return total_bytes; } ///<取得数据字节数 - };//class VertexAttribBufferCreater + };//class VertexAttribData - using VABCreater=VertexAttribBufferCreater; + using VAD=VertexAttribData; }//namespace graph }//namespace hgl #endif//HGL_GRAPH_VERTEX_ATTRIB_BUFFER_CREATER_INCLUDE diff --git a/res b/res index 3c8d4ba2..394fe761 160000 --- a/res +++ b/res @@ -1 +1 @@ -Subproject commit 3c8d4ba212c743feba2271743e560d32e9cb2e74 +Subproject commit 394fe76188845b306575e0f68fe587a286ab1d14 diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index 231b8cac..8e50e28a 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -80,7 +80,7 @@ add_cm_library(ULRE.SceneGraph "ULRE" ${SCENE_GRAPH_HEADER} ${SG_VERTEX_SOURCE} - #${RENDERABLE_FILES} + ${RENDERABLE_FILES} ${FONT_HEADER} ${FONT_SOURCE}) diff --git a/src/SceneGraph/RenderableCreater.cpp b/src/SceneGraph/RenderableCreater.cpp index 87b87f30..f5037c7a 100644 --- a/src/SceneGraph/RenderableCreater.cpp +++ b/src/SceneGraph/RenderableCreater.cpp @@ -7,12 +7,11 @@ namespace hgl { RenderableCreater::RenderableCreater(SceneDB *sdb,vulkan::Material *m) { - db =sdb; - mtl =m; - vsm =mtl->GetVertexShaderModule(); + db =sdb; + mtl =m; + vsm =mtl->GetVertexShaderModule(); vertices_number =0; - vabc_vertex =nullptr; ibo =nullptr; } @@ -29,21 +28,26 @@ namespace hgl { if(!vsm)return(false); - VertexAttribBufferCreater *vabc; + ShaderStageBind *ssb; - if(vabc_maps.Get(name,vabc)) - return vabc; + if(vabc_maps.Get(name,ssb)) + return ssb->vabc; const vulkan::ShaderStage *ss=vsm->GetStageInput(name); if(!ss) return(nullptr); - vabc=hgl::graph::CreateVABCreater(ss->base_type,ss->component,vertices_number); + ssb=new ShaderStageBind; - vabc_maps.Add(name,vabc); + ssb->vabc=hgl::graph::CreateVABCreater(ss->base_type,ss->component,vertices_number); - return vabc; + ssb->name=name; + ssb->binding=ss->binding; + + vabc_maps.Add(name,ssb); + + return ssb->vabc; } uint16 *RenderableCreater::CreateIBO16(uint count,const uint16 *data) @@ -74,8 +78,20 @@ namespace hgl const auto *sp=vabc_maps.GetDataList(); for(uint i=0;iSet((*sp)->right->binding,db->CreateVAB((*sp)->right->vabc)); + + ++sp; } + + if(ibo) + { + ibo->Unmap(); + render_obj->Set(ibo); + } + + db->Add(render_obj); + + return render_obj; } }//namespace graph }//namespace hgl