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
|
|
|
|
|
2025-06-06 00:23:27 +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
|