[WIP] Renderer/RenderTask
This commit is contained in:
parent
8f1b891f9e
commit
5c186fdb95
@ -3,6 +3,7 @@
|
|||||||
#include<hgl/graph/RenderFramework.h>
|
#include<hgl/graph/RenderFramework.h>
|
||||||
#include<hgl/graph/VKRenderResource.h>
|
#include<hgl/graph/VKRenderResource.h>
|
||||||
#include<hgl/graph/mtl/MaterialLibrary.h>
|
#include<hgl/graph/mtl/MaterialLibrary.h>
|
||||||
|
#include<hgl/graph/Renderer.h>
|
||||||
#include<hgl/Time.h>
|
#include<hgl/Time.h>
|
||||||
//#include<iostream>
|
//#include<iostream>
|
||||||
|
|
||||||
@ -26,13 +27,19 @@ namespace hgl
|
|||||||
|
|
||||||
bool destroy_flag=false;
|
bool destroy_flag=false;
|
||||||
|
|
||||||
bool renderable=true;
|
|
||||||
bool render_dirty=true;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
graph::RenderResource *db=nullptr; //暂时的,未来会被更好的机制替代
|
graph::RenderResource *db=nullptr; //暂时的,未来会被更好的机制替代
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 不管我们的游戏多么的复杂,一般在一个WorkObject中,都只需要一个SceneWorld以及一个Renderer即可。
|
||||||
|
* 如果我们整体切换World,那么建议直接切换到新的WorkObject上。
|
||||||
|
*/
|
||||||
|
|
||||||
|
graph::SceneWorld * world =nullptr; //世界
|
||||||
|
|
||||||
|
graph::Renderer * renderer=nullptr; //渲染器
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
graph::RenderFramework * GetRenderFramework (){return render_framework;}
|
graph::RenderFramework * GetRenderFramework (){return render_framework;}
|
||||||
@ -44,13 +51,8 @@ namespace hgl
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
const bool IsDestroy()const{return destroy_flag;}
|
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 MarkDestory(){destroy_flag=true;}
|
||||||
void SetRenderable(bool r){renderable=r;}
|
|
||||||
void MarkRenderDirty(){render_dirty=true;}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -20,8 +20,8 @@ namespace hgl::graph
|
|||||||
{
|
{
|
||||||
RenderTaskName task_name;
|
RenderTaskName task_name;
|
||||||
|
|
||||||
RenderList * render_list;
|
|
||||||
IRenderTarget * render_target;
|
IRenderTarget * render_target;
|
||||||
|
RenderList * render_list;
|
||||||
Camera * camera;
|
Camera * camera;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -34,32 +34,16 @@ namespace hgl::graph
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
RenderTask(const RenderTaskName &tn)
|
RenderTask(const RenderTaskName &tn,IRenderTarget *rt=nullptr,Camera *c=nullptr);
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~RenderTask();
|
virtual ~RenderTask();
|
||||||
|
|
||||||
void Set(IRenderTarget *rt){render_target=rt;}
|
bool Set(IRenderTarget *rt);
|
||||||
void Set(Camera *c){camera=c;}
|
void Set(Camera *c){camera=c;}
|
||||||
|
|
||||||
void Restart(); ///<复位数据,清空渲染列表
|
void Restart(); ///<复位数据,清空渲染列表
|
||||||
|
|
||||||
void MakeRenderList(SceneNode *);
|
bool RebuildRenderList(SceneNode *);
|
||||||
|
|
||||||
bool IsEmpty()const; ///<是否是空的,不可渲染或是没啥可渲染的
|
bool IsEmpty()const; ///<是否是空的,不可渲染或是没啥可渲染的
|
||||||
|
|
||||||
|
@ -11,17 +11,36 @@ namespace hgl::graph
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 渲染器
|
* 渲染器
|
||||||
* 管理相对的所有的渲染资源,包括场景、相机、渲染目标、渲染任务等
|
|
||||||
*/
|
*/
|
||||||
class Renderer
|
class Renderer
|
||||||
{
|
{
|
||||||
|
IRenderTarget *render_target;
|
||||||
SceneWorld *world;
|
SceneWorld *world;
|
||||||
|
|
||||||
RenderTaskNameMap static_render_task_list; ///<静态渲染任务列表
|
Camera *camera;
|
||||||
RenderTaskNameMap dynamic_render_task_list; ///<动态渲染任务列表
|
|
||||||
|
//RenderTaskNameMap static_render_task_list; ///<静态渲染任务列表
|
||||||
|
//RenderTaskNameMap dynamic_render_task_list; ///<动态渲染任务列表
|
||||||
|
|
||||||
|
RenderTask *render_task; ///<当前渲染任务
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
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
|
};//class Renderer
|
||||||
}//namespace hgl::graph
|
}//namespace hgl::graph
|
||||||
|
@ -1,13 +1,47 @@
|
|||||||
#include<hgl/graph/RenderTask.h>
|
#include<hgl/graph/RenderTask.h>
|
||||||
#include<hgl/graph/RenderList.h>
|
#include<hgl/graph/RenderList.h>
|
||||||
|
#include<hgl/graph/VKCommandBuffer.h>
|
||||||
|
#include<hgl/graph/VKRenderTarget.h>
|
||||||
|
|
||||||
namespace hgl::graph
|
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()
|
RenderTask::~RenderTask()
|
||||||
{
|
{
|
||||||
SAFE_CLEAR(render_list)
|
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()
|
void RenderTask::Restart()
|
||||||
{
|
{
|
||||||
if(!render_list)
|
if(!render_list)
|
||||||
@ -16,16 +50,18 @@ namespace hgl::graph
|
|||||||
render_list->Clear();
|
render_list->Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderTask::MakeRenderList(SceneNode *root)
|
bool RenderTask::RebuildRenderList(SceneNode *root)
|
||||||
{
|
{
|
||||||
if(!root)
|
if(!root)
|
||||||
return;
|
return(false);
|
||||||
|
|
||||||
if(!render_list)
|
if(!render_list)
|
||||||
return;
|
return(false);
|
||||||
|
|
||||||
render_list->Clear();
|
render_list->Clear();
|
||||||
render_list->Expend(root);
|
render_list->Expend(root);
|
||||||
|
|
||||||
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RenderTask::IsEmpty()const
|
bool RenderTask::IsEmpty()const
|
||||||
@ -41,6 +77,9 @@ namespace hgl::graph
|
|||||||
if(!cmd)
|
if(!cmd)
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
|
if(!render_target)
|
||||||
|
return(false);
|
||||||
|
|
||||||
if(!render_list)
|
if(!render_list)
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user