ULRE/src/SceneGraph/render/RenderTask.cpp

86 lines
1.8 KiB
C++
Raw Normal View History

2025-05-28 02:27:59 +08:00
#include<hgl/graph/RenderTask.h>
#include<hgl/graph/RenderList.h>
2025-05-30 00:32:45 +08:00
#include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/VKRenderTarget.h>
2025-05-28 02:27:59 +08:00
namespace hgl::graph
{
2025-05-30 00:32:45 +08:00
RenderTask::RenderTask(const RenderTaskName &tn,IRenderTarget *rt,Camera *c)
{
task_name=tn;
camera=c;
render_target=nullptr;
render_list=nullptr;
Set(rt);
}
2025-05-28 02:27:59 +08:00
RenderTask::~RenderTask()
{
SAFE_CLEAR(render_list)
}
2025-05-30 00:32:45 +08:00
bool RenderTask::Set(IRenderTarget *rt)
{
if(render_target)
{
if(render_target->GetDevice()!=rt->GetDevice())
{
//换Device是不允许的当然这一般也不可能
return(false);
}
}
render_target=rt;
if(!render_list)
{
render_list=new RenderList(rt->GetDevice());
}
return(true);
}
bool RenderTask::RebuildRenderList(SceneNode *root)
2025-05-28 02:27:59 +08:00
{
if(!root)
2025-05-30 00:32:45 +08:00
return(false);
2025-05-28 02:27:59 +08:00
if(!render_list)
2025-05-30 00:32:45 +08:00
return(false);
2025-05-28 02:27:59 +08:00
//记往不需要也千万不要手动render_list->Clear因为那会完全释放掉所有数据
//render_list->Expend会自己复位所有数据但并不释放内存
2025-05-28 02:27:59 +08:00
render_list->Expend(root);
2025-05-30 00:32:45 +08:00
return(true);
2025-05-28 02:27:59 +08:00
}
bool RenderTask::IsEmpty()const
{
if(!render_list)
return(true);
return render_list->IsEmpty();
}
bool RenderTask::Render(RenderCmdBuffer *cmd)
{
if(!cmd)
return(false);
2025-05-30 00:32:45 +08:00
if(!render_target)
return(false);
2025-05-28 02:27:59 +08:00
if(!render_list)
return(false);
if(render_list->IsEmpty())
return(false);
render_list->Render(cmd);
return(true);
}
}//namespace hgl::graph