ULRE/src/SceneGraph/RenderList.cpp

132 lines
3.4 KiB
C++
Raw Normal View History

2019-05-25 00:50:04 +08:00
#include<hgl/graph/RenderList.h>
#include<hgl/graph/Camera.h>
2019-05-21 21:28:33 +08:00
#include<hgl/graph/SceneNode.h>
#include<hgl/graph/VKBuffer.h>
#include<hgl/graph/VKRenderable.h>
#include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/VertexAttribDataAccess.h>
#include<hgl/graph/VKMaterialParameters.h>
#include<hgl/graph/VKRenderableInstance.h>
2019-05-25 00:50:04 +08:00
2019-05-21 21:28:33 +08:00
namespace hgl
{
namespace graph
{
2021-06-15 19:03:34 +08:00
RenderList::RenderList()
{
cmd_buf =nullptr;
mvp_buffer =nullptr;
ri_list =nullptr;
2020-12-18 16:52:45 +08:00
ubo_offset =0;
ubo_align =0;
last_pipeline =nullptr;
2021-06-16 20:29:25 +08:00
hgl_zero(last_mp);
last_vbo =0;
}
void RenderList::Set(List<RenderableInstance *> *ril,GPUBuffer *buf,const uint32_t align)
{
ri_list=ril;
mvp_buffer=buf;
ubo_align=align;
}
2021-06-10 18:56:23 +08:00
void RenderList::Render(RenderableInstance *ri)
2019-05-21 21:28:33 +08:00
{
2019-05-25 00:50:04 +08:00
if(last_pipeline!=ri->GetPipeline())
{
last_pipeline=ri->GetPipeline();
cmd_buf->BindPipeline(last_pipeline);
2019-05-25 00:50:04 +08:00
}
2019-05-25 00:50:04 +08:00
{
2021-06-16 20:29:25 +08:00
int ds_count=0;
MaterialParameters *mp;
2021-06-16 20:29:25 +08:00
for(int i=(int)DescriptorSetsType::BEGIN_RANGE;
i<(int)DescriptorSetsType::Renderable;
i++)
{
2021-06-16 20:29:25 +08:00
mp=ri->GetMP((DescriptorSetsType)i);
if(last_mp[i]!=mp)
{
last_mp[i]=mp;
if(mp)
{
ds_list[ds_count]=mp->GetVkDescriptorSet();
++ds_count;
}
}
}
2021-06-16 20:29:25 +08:00
{
mp=ri->GetMP(DescriptorSetsType::Renderable);
if(mp)
{
ds_list[ds_count]=mp->GetVkDescriptorSet();
++ds_count;
cmd_buf->BindDescriptorSets(ri->GetPipelineLayout(),ds_list,ds_count,&ubo_offset,1);
}
else
{
cmd_buf->BindDescriptorSets(ri->GetPipelineLayout(),ds_list,ds_count,nullptr,0);
2021-06-16 20:29:25 +08:00
}
ubo_offset+=ubo_align;
}
}
2019-05-25 00:50:04 +08:00
if(last_vbo!=ri->GetBufferHash())
2019-05-25 00:50:04 +08:00
{
last_vbo=ri->GetBufferHash();
cmd_buf->BindVAB(ri);
2019-05-25 00:50:04 +08:00
}
2020-10-21 12:47:06 +08:00
const IndexBuffer *ib=ri->GetIndexBuffer();
2019-05-25 00:50:04 +08:00
if(ib)
{
cmd_buf->DrawIndexed(ib->GetCount());
}
else
{
cmd_buf->Draw(ri->GetDrawCount());
2019-05-25 00:50:04 +08:00
}
}
bool RenderList::Render(RenderCmdBuffer *cb)
{
if(!cb)
2019-05-21 21:28:33 +08:00
return(false);
if(!mvp_buffer
||!ri_list)
return(false);
if(ri_list->GetCount()<=0)
return(true);
cmd_buf=cb;
2021-06-16 20:29:25 +08:00
last_pipeline=nullptr;
hgl_zero(last_mp);
last_vbo=0;
ubo_offset=0;
2019-05-25 00:50:04 +08:00
for(RenderableInstance *ri:*ri_list)
Render(ri);
2019-05-21 21:28:33 +08:00
return(true);
}
}//namespace graph
}//namespace hgl