From 8f1b891f9e52db7c7ba7d9e3489c3aa86fa8bde7 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 28 May 2025 02:27:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=9A=E4=B9=89RenderTask?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMCore | 2 +- inc/hgl/graph/RenderList.h | 2 + inc/hgl/graph/RenderTask.h | 68 ++++++++++++++++++++++++++++ inc/hgl/graph/Renderer.h | 27 +++++++++++ inc/hgl/graph/mtl/MaterialLibrary.h | 2 +- src/SceneGraph/CMakeLists.txt | 4 ++ src/SceneGraph/render/RenderTask.cpp | 53 ++++++++++++++++++++++ src/SceneGraph/render/Renderer.cpp | 0 8 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 inc/hgl/graph/RenderTask.h create mode 100644 inc/hgl/graph/Renderer.h create mode 100644 src/SceneGraph/render/RenderTask.cpp create mode 100644 src/SceneGraph/render/Renderer.cpp diff --git a/CMCore b/CMCore index f1a6f0b9..fd0dbb00 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit f1a6f0b90eb7766be90afb7e62ec539dfa30f746 +Subproject commit fd0dbb00550bf8aee92ae19651fe8a780d8d5205 diff --git a/inc/hgl/graph/RenderList.h b/inc/hgl/graph/RenderList.h index 81af69f7..a0a5ff70 100644 --- a/inc/hgl/graph/RenderList.h +++ b/inc/hgl/graph/RenderList.h @@ -37,6 +37,8 @@ namespace hgl virtual void SetCamera(CameraInfo *ci){camera_info=ci;} ///<设置相机信息 virtual bool Expend(SceneNode *); ///<展开场景树到渲染列表 + bool IsEmpty()const{return !renderable_count;} ///<是否是空的 + virtual bool Render(RenderCmdBuffer *); ///<渲染所有对象 virtual void UpdateLocalToWorld(); ///<更新所有对象的变换数据 diff --git a/inc/hgl/graph/RenderTask.h b/inc/hgl/graph/RenderTask.h new file mode 100644 index 00000000..c6af53dc --- /dev/null +++ b/inc/hgl/graph/RenderTask.h @@ -0,0 +1,68 @@ +#pragma once + +#include +#include + +namespace hgl::graph +{ + class SceneNode; + class SceneWorld; + class Camera; + class IRenderTarget; + class RenderList; + + HGL_DEFINE_IDNAME(RenderTaskName,char) + + /** + * 最终的具体渲染任务 + */ + class RenderTask + { + RenderTaskName task_name; + + RenderList * render_list; + IRenderTarget * render_target; + Camera * camera; + + public: + + const RenderTaskName &GetName ()const; + + IRenderTarget * GetRenderTarget ()const{return render_target;} + RenderList * GetRenderList ()const{return render_list;} + Camera * GetCamera ()const{return camera;} + + 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; + } + + virtual ~RenderTask(); + + void Set(IRenderTarget *rt){render_target=rt;} + void Set(Camera *c){camera=c;} + + void Restart(); ///<复位数据,清空渲染列表 + + void MakeRenderList(SceneNode *); + + bool IsEmpty()const; ///<是否是空的,不可渲染或是没啥可渲染的 + + bool Render(RenderCmdBuffer *); + };//class RenderTask +}//namespace hgl::graph diff --git a/inc/hgl/graph/Renderer.h b/inc/hgl/graph/Renderer.h new file mode 100644 index 00000000..52f344c9 --- /dev/null +++ b/inc/hgl/graph/Renderer.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include + +namespace hgl::graph +{ + class SceneWorld; + + using RenderTaskNameMap=Map; + + /** + * 渲染器 + * 管理相对的所有的渲染资源,包括场景、相机、渲染目标、渲染任务等 + */ + class Renderer + { + SceneWorld *world; + + RenderTaskNameMap static_render_task_list; ///<静态渲染任务列表 + RenderTaskNameMap dynamic_render_task_list; ///<动态渲染任务列表 + + public: + + + };//class Renderer +}//namespace hgl::graph diff --git a/inc/hgl/graph/mtl/MaterialLibrary.h b/inc/hgl/graph/mtl/MaterialLibrary.h index 6ac46f41..c1340e00 100644 --- a/inc/hgl/graph/mtl/MaterialLibrary.h +++ b/inc/hgl/graph/mtl/MaterialLibrary.h @@ -7,7 +7,7 @@ STD_MTL_NAMESPACE_BEGIN -DefineIDName(MaterialName, char) +HGL_DEFINE_IDNAME(MaterialName, char) class MaterialFactory { diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index 6f755a26..d32ee7b2 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -87,6 +87,10 @@ SET(SG_RENDER_SOURCE ${SG_INCLUDE_PATH}/RenderNode.h ${SG_INCLUDE_PATH}/MaterialRenderList.h ${SG_INCLUDE_PATH}/MaterialRenderMap.h # ${SG_INCLUDE_PATH}/ShadowPolicy.h + ${SG_INCLUDE_PATH}/RenderTask.h + ${SG_INCLUDE_PATH}/Renderer.h + render/Renderer.cpp + render/RenderTask.cpp render/RenderList.cpp render/MaterialRenderList.cpp render/RenderAssignBuffer.h diff --git a/src/SceneGraph/render/RenderTask.cpp b/src/SceneGraph/render/RenderTask.cpp new file mode 100644 index 00000000..2e7b9be3 --- /dev/null +++ b/src/SceneGraph/render/RenderTask.cpp @@ -0,0 +1,53 @@ +#include +#include + +namespace hgl::graph +{ + RenderTask::~RenderTask() + { + SAFE_CLEAR(render_list) + } + + void RenderTask::Restart() + { + if(!render_list) + return; + + render_list->Clear(); + } + + void RenderTask::MakeRenderList(SceneNode *root) + { + if(!root) + return; + + if(!render_list) + return; + + render_list->Clear(); + render_list->Expend(root); + } + + bool RenderTask::IsEmpty()const + { + if(!render_list) + return(true); + + return render_list->IsEmpty(); + } + + bool RenderTask::Render(RenderCmdBuffer *cmd) + { + if(!cmd) + return(false); + + if(!render_list) + return(false); + + if(render_list->IsEmpty()) + return(false); + + render_list->Render(cmd); + return(true); + } +}//namespace hgl::graph diff --git a/src/SceneGraph/render/Renderer.cpp b/src/SceneGraph/render/Renderer.cpp new file mode 100644 index 00000000..e69de29b