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