From 4108eaa342030bb62a8b6fb00797c83fdb3c0eee Mon Sep 17 00:00:00 2001 From: hyzboy Date: Fri, 5 Feb 2021 17:15:16 +0800 Subject: [PATCH] SceneTreeToRenderList --- CMCore | 2 +- inc/hgl/graph/RenderList.h | 34 ++++++++++++++-- src/SceneGraph/SceneTreeToRenderList.cpp | 51 +++++++++++++++++++++++- 3 files changed, 82 insertions(+), 5 deletions(-) diff --git a/CMCore b/CMCore index 74f7f146..f52b7ac9 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 74f7f146ba6b79fd904f6fd47f4dbee0750831f6 +Subproject commit f52b7ac971305bc1e3e987a7de919e891fdc4d6e diff --git a/inc/hgl/graph/RenderList.h b/inc/hgl/graph/RenderList.h index 9010e5f0..5ad1c5db 100644 --- a/inc/hgl/graph/RenderList.h +++ b/inc/hgl/graph/RenderList.h @@ -5,12 +5,15 @@ #include #include #include +#include namespace hgl { namespace graph { struct MVPArray; + using SceneNodeList=List; + class RenderList { GPUDevice *device; @@ -22,7 +25,7 @@ namespace hgl MVPArray *mvp_array; - List scene_node_list; + SceneNodeList *scene_node_list; Pipeline * last_pipeline; RenderableInstance *last_ri; @@ -49,20 +52,40 @@ namespace hgl class SceneTreeToRenderList { + using PipelineSets=Sets; + using MaterialSets=Sets; + using MatInstanceSets=Sets; + + protected: + GPUDevice *device; - public: + protected: Camera * camera; CameraMatrix * camera_matrix; Frustum frustum; - public: + protected: + + SceneNodeList * scene_node_list; ///<场景节点列表 + + PipelineSets pipeline_sets; ///<管线合集 + MaterialSets material_sets; ///<材质合集 + MatInstanceSets mat_instance_sets; ///<材质实例合集 + + RenderList * render_list; + + protected: virtual uint32 CameraLength(SceneNode *,SceneNode *); ///<摄像机距离比较函数 virtual bool InFrustum(const SceneNode *,void *); ///<平截头截剪函数 + virtual bool Begin(); + virtual bool Expend(SceneNode *); + virtual bool End(); + public: SceneTreeToRenderList(GPUDevice *d) @@ -70,8 +93,13 @@ namespace hgl device=d; camera=nullptr; camera_matrix=nullptr; + + scene_node_list=nullptr; + render_list=nullptr; } + virtual ~SceneTreeToRenderList(); + virtual bool Expend(RenderList *,Camera *,SceneNode *); };//class SceneTreeToRenderList }//namespace graph diff --git a/src/SceneGraph/SceneTreeToRenderList.cpp b/src/SceneGraph/SceneTreeToRenderList.cpp index 918cd9da..fa1827d4 100644 --- a/src/SceneGraph/SceneTreeToRenderList.cpp +++ b/src/SceneGraph/SceneTreeToRenderList.cpp @@ -1,9 +1,14 @@ -#include +#include namespace hgl { namespace graph { + SceneTreeToRenderList::~SceneTreeToRenderList() + { + SAFE_CLEAR(scene_node_list); + } + uint32 SceneTreeToRenderList::CameraLength(SceneNode *,SceneNode *) { } @@ -12,6 +17,46 @@ namespace hgl { } + bool SceneTreeToRenderList::Begin() + { + if(!scene_node_list) + scene_node_list=new SceneNodeList; + + scene_node_list->ClearData(); + + pipeline_sets.ClearData(); + material_sets.ClearData(); + mat_instance_sets.ClearData(); + + return(true); + } + + /** + * 理论上讲,我们需要按以下顺序排序 + * + * for(material) + * for(pipeline) + * for(material_instance) + * for(vbo) + */ + + bool SceneTreeToRenderList::End() + { + } + + bool SceneTreeToRenderList::Expend(SceneNode *sn) + { + if(!sn)return(false); + + if(sn->renderable_instances.GetCount()>0) + scene_node_list->Add(sn); + + for(SceneNode *sub:sn->SubNode) + Expend(sub); + + return(true); + } + bool SceneTreeToRenderList::Expend(RenderList *rl,Camera *c,SceneNode *sn) { if(!device)return(false); @@ -23,7 +68,11 @@ namespace hgl //Frustum f; + render_list=rl; + Begin(); + Expend(sn); + End(); } }//namespace graph }//namespace hgl