add CreateVADA function in RenderableCreater

This commit is contained in:
hyzboy 2020-07-20 17:33:57 +08:00
parent 7ee902fcb7
commit 4898592c32
4 changed files with 52 additions and 23 deletions

View File

@ -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<typename T>
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

View File

@ -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);

View File

@ -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}

View File

@ -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;i<si_count;i++)
{
render_obj->Set((*sp)->right->binding,db->CreateVAB((*sp)->right->vabc));
render_obj->Set((*sp)->right->binding,db->CreateVAB((*sp)->right->data));
++sp;
}