[WIP] Renderer/RenderTask

This commit is contained in:
hyzboy 2025-05-30 00:32:45 +08:00
parent 8f1b891f9e
commit 5c186fdb95
6 changed files with 172 additions and 44 deletions

View File

@ -3,6 +3,7 @@
#include<hgl/graph/RenderFramework.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/mtl/MaterialLibrary.h>
#include<hgl/graph/Renderer.h>
#include<hgl/Time.h>
//#include<iostream>
@ -26,13 +27,19 @@ namespace hgl
bool destroy_flag=false;
bool renderable=true;
bool render_dirty=true;
protected:
graph::RenderResource *db=nullptr; //暂时的,未来会被更好的机制替代
/**
* WorkObject中SceneWorld以及一个Renderer即可
* WorldWorkObject上
*/
graph::SceneWorld * world =nullptr; //世界
graph::Renderer * renderer=nullptr; //渲染器
public:
graph::RenderFramework * GetRenderFramework (){return render_framework;}
@ -45,12 +52,7 @@ namespace hgl
public:
const bool IsDestroy ()const{return destroy_flag;}
const bool IsRenderable()const{return renderable;}
const bool IsRenderDirty()const{return render_dirty;}
void MarkDestory(){destroy_flag=true;}
void SetRenderable(bool r){renderable=r;}
void MarkRenderDirty(){render_dirty=true;}
public:

View File

@ -20,8 +20,8 @@ namespace hgl::graph
{
RenderTaskName task_name;
RenderList * render_list;
IRenderTarget * render_target;
RenderList * render_list;
Camera * camera;
public:
@ -34,32 +34,16 @@ namespace hgl::graph
public:
RenderTask(const RenderTaskName &tn)
{
task_name=tn;
render_list=nullptr;
render_target=nullptr;
camera=nullptr;
}
RenderTask(const RenderTaskName &tn,RenderList *rl,IRenderTarget *rt=nullptr,Camera *c=nullptr)
{
task_name=tn;
render_list=rl;
render_target=rt;
camera=c;
}
RenderTask(const RenderTaskName &tn,IRenderTarget *rt=nullptr,Camera *c=nullptr);
virtual ~RenderTask();
void Set(IRenderTarget *rt){render_target=rt;}
bool Set(IRenderTarget *rt);
void Set(Camera *c){camera=c;}
void Restart(); ///<复位数据,清空渲染列表
void MakeRenderList(SceneNode *);
bool RebuildRenderList(SceneNode *);
bool IsEmpty()const; ///<是否是空的,不可渲染或是没啥可渲染的

View File

@ -11,17 +11,36 @@ namespace hgl::graph
/**
*
*
*/
class Renderer
{
IRenderTarget *render_target;
SceneWorld *world;
RenderTaskNameMap static_render_task_list; ///<静态渲染任务列表
RenderTaskNameMap dynamic_render_task_list; ///<动态渲染任务列表
Camera *camera;
//RenderTaskNameMap static_render_task_list; ///<静态渲染任务列表
//RenderTaskNameMap dynamic_render_task_list; ///<动态渲染任务列表
RenderTask *render_task; ///<当前渲染任务
protected:
public:
SceneWorld *GetSceneWorld () const { return world; } ///<获取场景世界
Camera * GetCurCamera () const { return camera; } ///<获取当前相机
public:
Renderer(IRenderTarget *);
virtual ~Renderer();
void SetCurWorld(SceneWorld *);
void SetCurCamera(Camera *);
bool RenderFrame(RenderCmdBuffer *);
};//class Renderer
}//namespace hgl::graph

View File

@ -1,13 +1,47 @@
#include<hgl/graph/RenderTask.h>
#include<hgl/graph/RenderList.h>
#include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/VKRenderTarget.h>
namespace hgl::graph
{
RenderTask::RenderTask(const RenderTaskName &tn,IRenderTarget *rt,Camera *c)
{
task_name=tn;
camera=c;
render_target=nullptr;
render_list=nullptr;
Set(rt);
}
RenderTask::~RenderTask()
{
SAFE_CLEAR(render_list)
}
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);
}
void RenderTask::Restart()
{
if(!render_list)
@ -16,16 +50,18 @@ namespace hgl::graph
render_list->Clear();
}
void RenderTask::MakeRenderList(SceneNode *root)
bool RenderTask::RebuildRenderList(SceneNode *root)
{
if(!root)
return;
return(false);
if(!render_list)
return;
return(false);
render_list->Clear();
render_list->Expend(root);
return(true);
}
bool RenderTask::IsEmpty()const
@ -41,6 +77,9 @@ namespace hgl::graph
if(!cmd)
return(false);
if(!render_target)
return(false);
if(!render_list)
return(false);

View File

@ -0,0 +1,84 @@
#include<hgl/graph/Renderer.h>
#include<hgl/graph/SceneWorld.h>
#include<hgl/graph/VKCommandBuffer.h>
namespace hgl::graph
{
Renderer::Renderer(IRenderTarget *rt)
{
render_target=rt;
world=nullptr;
render_task=new RenderTask("TempRenderTask");
}
Renderer::~Renderer()
{
delete render_task;
delete world;
}
void Renderer::SetCurWorld(SceneWorld *sw)
{
if(world==sw)
return;
//if(world)
//{
// world->Unjoin(this);
//}
world=sw;
//if(world)
//{
// world->Join(this);
//}
}
void Renderer::SetCurCamera(Camera *c)
{
if(!world||!c)
return;
//if(camera)
//{
// if(world)
// camera->Unjoin(world);
// camera->Unjoin(this);
//}
camera=c;
//if(camera)
//{
// if(world)
// camera->Unjoin(world);
// camera->Join(this);
//}
}
bool Renderer::RenderFrame(RenderCmdBuffer *cmd)
{
if(!world)
return(false);
SceneNode *root=world->GetRootNode();
if(!root)
return(false);
root->RefreshMatrix();
render_task->RebuildRenderList(root);
bool result=false;
cmd->BeginRenderPass();
result=render_task->Render(cmd);
cmd->EndRenderPass();
return(result);
}
}//namespace hgl::graph