From 4898592c325e477dfc606e599c1cfff38079c1cc Mon Sep 17 00:00:00 2001 From: hyzboy Date: Mon, 20 Jul 2020 17:33:57 +0800 Subject: [PATCH] add CreateVADA function in RenderableCreater --- inc/hgl/graph/RenderableCreater.h | 29 +++++++++++++++++++---- inc/hgl/graph/SceneDB.h | 2 +- src/SceneGraph/CMakeLists.txt | 9 +++---- src/SceneGraph/RenderableCreater.cpp | 35 +++++++++++++++++----------- 4 files changed, 52 insertions(+), 23 deletions(-) diff --git a/inc/hgl/graph/RenderableCreater.h b/inc/hgl/graph/RenderableCreater.h index 71717018..48b13537 100644 --- a/inc/hgl/graph/RenderableCreater.h +++ b/inc/hgl/graph/RenderableCreater.h @@ -32,13 +32,13 @@ namespace hgl { AnsiString name; uint binding; - VAD *vabc =nullptr; + VAD * data =nullptr; public: ~ShaderStageBind() { - SAFE_CLEAR(vabc); + SAFE_CLEAR(data); } };//struct ShaderStageBind @@ -63,6 +63,8 @@ namespace hgl vulkan::IndexBuffer * ibo; VABCreaterMaps vabc_maps; + virtual VAD *CreateVAD(const AnsiString &name,const vulkan::ShaderStage *ss); ///<创建一个顶点属性缓冲区 + public: RenderableCreater(SceneDB *sdb,vulkan::Material *m); @@ -70,12 +72,31 @@ namespace hgl virtual bool Init(const uint32 count); ///<初始化,参数为顶点数量 - virtual VAD * CreateVAD(const AnsiString &name); ///<创建一个顶点属性缓冲区创建器 + VAD * CreateVAD(const AnsiString &name); ///<创建一个顶点属性缓冲区 + + template + T * CreateVADA(const AnsiString &name) ///<创建一个顶点属性缓冲区以及访问器 + { + const vulkan::ShaderStage *ss=vsm->GetStageInput(name); + + if(!ss) + return(nullptr); + + if(ss->format!=T::GetVulkanFormat()) + return(nullptr); + + VAD *vad=this->CreateVAD(name); + + if(!vad) + return(nullptr); + + return T::Create(vad); + } uint16 * CreateIBO16(uint count,const uint16 *data=nullptr); ///<创建16位的索引缓冲区 uint32 * CreateIBO32(uint count,const uint32 *data=nullptr); ///<创建32位的索引缓冲区 - virtual vulkan::Renderable * Finish(); + virtual vulkan::Renderable * Finish(); ///<结束并创建可渲染对象 };//class RenderableCreater }//namespace graph }//namespace hgl diff --git a/inc/hgl/graph/SceneDB.h b/inc/hgl/graph/SceneDB.h index 143b1cd2..5406e30d 100644 --- a/inc/hgl/graph/SceneDB.h +++ b/inc/hgl/graph/SceneDB.h @@ -66,7 +66,7 @@ namespace hgl vulkan::VertexAttribBuffer *CreateVAB(VkFormat format,uint32_t count,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE); vulkan::VertexAttribBuffer *CreateVAB(VkFormat format,uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateVAB(format,count,nullptr,sharing_mode);} - vulkan::VertexAttribBuffer *CreateVAB(const VertexAttribData *vbc,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateVAB(vbc->GetDataType(),vbc->GetCount(),vbc->GetData(),sharing_mode);} + vulkan::VertexAttribBuffer *CreateVAB(const VertexAttribData *vad,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateVAB(vad->GetVulkanFormat(),vad->GetCount(),vad->GetData(),sharing_mode);} #define SCENE_DB_CREATE_FUNC(name) vulkan::Buffer *Create##name(VkDeviceSize size,void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE); \ vulkan::Buffer *Create##name(VkDeviceSize size,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE); diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index 9cf93d1d..c50fbb08 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -12,10 +12,11 @@ SOURCE_GROUP("Material" FILES ${SG_MATERIAL_HEADER} SOURCE_GROUP("Material\\Shader" FILES ${SHADER_RESOURCE_FILES}) -SET(SG_VAB_SOURCE ${ROOT_INCLUDE_PATH}/hgl/graph/VertexAttribData.h - ${ROOT_INCLUDE_PATH}/hgl/graph/VertexAttribDataAccess.h) +SET(SG_VAD_SOURCE ${ROOT_INCLUDE_PATH}/hgl/graph/VertexAttribData.h + ${ROOT_INCLUDE_PATH}/hgl/graph/VertexAttribDataAccess.h + VertexAttribData.cpp) -SOURCE_GROUP("VertexAttribBuffer" FILES ${SG_VAB_SOURCE}) +SOURCE_GROUP("VertexAttribData" FILES ${SG_VAD_SOURCE}) SET(SCENE_GRAPH_HEADER ${ROOT_INCLUDE_PATH}/hgl/graph/Light.h ${ROOT_INCLUDE_PATH}/hgl/graph/SceneDB.h @@ -78,7 +79,7 @@ add_cm_library(ULRE.SceneGraph "ULRE" ${SCENE_GRAPH_HEADER} ${SG_MATERIAL_HEADER} ${SG_MATERIAL_SOURCE} - ${SG_VAB_SOURCE} + ${SG_VAD_SOURCE} ${RENDERABLE_FILES} diff --git a/src/SceneGraph/RenderableCreater.cpp b/src/SceneGraph/RenderableCreater.cpp index d9bae727..17963574 100644 --- a/src/SceneGraph/RenderableCreater.cpp +++ b/src/SceneGraph/RenderableCreater.cpp @@ -24,30 +24,37 @@ namespace hgl return(true); } - VertexAttribData *RenderableCreater::CreateVAD(const AnsiString &name) + VAD *RenderableCreater::CreateVAD(const AnsiString &name,const vulkan::ShaderStage *ss) { - if(!vsm)return(false); + if(!ss)return(nullptr); ShaderStageBind *ssb; if(vabc_maps.Get(name,ssb)) - return ssb->vabc; + return ssb->data; + + ssb=new ShaderStageBind; + + ssb->data =hgl::graph::CreateVertexAttribData(ss->base_type,ss->component,vertices_number); + ssb->name =name; + ssb->binding=ss->binding; + + vabc_maps.Add(name,ssb); + + return ssb->data; + } + + VertexAttribData *RenderableCreater::CreateVAD(const AnsiString &name) + { + if(!vsm)return(nullptr); + if(name.IsEmpty())return(nullptr); const vulkan::ShaderStage *ss=vsm->GetStageInput(name); if(!ss) return(nullptr); - ssb=new ShaderStageBind; - - ssb->vabc=hgl::graph::CreateVertexAttribData(ss->base_type,ss->component,vertices_number); - - ssb->name=name; - ssb->binding=ss->binding; - - vabc_maps.Add(name,ssb); - - return ssb->vabc; + return this->CreateVAD(name,ss); } uint16 *RenderableCreater::CreateIBO16(uint count,const uint16 *data) @@ -78,7 +85,7 @@ namespace hgl const auto *sp=vabc_maps.GetDataList(); for(uint i=0;iSet((*sp)->right->binding,db->CreateVAB((*sp)->right->vabc)); + render_obj->Set((*sp)->right->binding,db->CreateVAB((*sp)->right->data)); ++sp; }