From ce420d23a71e7de42f1d93702c8c7f747788be66 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Thu, 10 Jun 2021 18:56:23 +0800 Subject: [PATCH] added RenderNode class. --- inc/hgl/graph/RenderList.h | 8 +- inc/hgl/graph/RenderNode.h | 25 ++++++ inc/hgl/graph/SceneNode.h | 37 +++----- inc/hgl/graph/SceneTreeToRenderList.h | 9 +- src/SceneGraph/CMakeLists.txt | 3 +- src/SceneGraph/RenderList.cpp | 16 +--- src/SceneGraph/SceneTreeToRenderList.cpp | 110 ++++++++++++++++------- 7 files changed, 122 insertions(+), 86 deletions(-) create mode 100644 inc/hgl/graph/RenderNode.h diff --git a/inc/hgl/graph/RenderList.h b/inc/hgl/graph/RenderList.h index 6cb259a6..4448b04d 100644 --- a/inc/hgl/graph/RenderList.h +++ b/inc/hgl/graph/RenderList.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -12,7 +13,7 @@ namespace hgl { namespace graph { - using SceneNodeList=List; +// using SceneNodeList=List; using MVPArrayBuffer=GPUArrayBuffer; using MVPOffsetBuffer=List; @@ -29,7 +30,7 @@ namespace hgl Camera *camera; - SceneNodeList scene_node_list; + RenderNodeList render_node_list; MVPArrayBuffer *mvp_array; MVPOffsetBuffer mvp_offset; @@ -39,8 +40,7 @@ namespace hgl Pipeline * last_pipeline; RenderableInstance *last_ri; - void Render(SceneNode *,RenderableInstance *); - void Render(SceneNode *,List &); + void Render(RenderableInstance *); private: diff --git a/inc/hgl/graph/RenderNode.h b/inc/hgl/graph/RenderNode.h new file mode 100644 index 00000000..64483c78 --- /dev/null +++ b/inc/hgl/graph/RenderNode.h @@ -0,0 +1,25 @@ +#ifndef HGL_GRAPH_RENDER_NODE_INCLUDE +#define HGL_GRAPH_RENDER_NODE_INCLUDE + +#include +#include +namespace hgl +{ + namespace graph + { + class RenderableInstance; + + struct RenderNode + { + Vector4f WorldCenter; + + float distance_to_camera_square; +// float distance_to_camera; + + RenderableInstance *ri; + };//struct RenderNode + + using RenderNodeList=List; + }//namespace graph +}//namespace hgl +#endif//HGL_GRAPH_RENDER_NODE_INCLUDE diff --git a/inc/hgl/graph/SceneNode.h b/inc/hgl/graph/SceneNode.h index 75d9c13c..3524e108 100644 --- a/inc/hgl/graph/SceneNode.h +++ b/inc/hgl/graph/SceneNode.h @@ -29,40 +29,23 @@ namespace hgl ObjectList SubNode; ///<子节点 - List RIList; ///<可渲染实例 + RenderableInstance *render_obj=nullptr; ///<可渲染实例 public: SceneNode()=default; - SceneNode(const Matrix4f &mat) + SceneNode( RenderableInstance *ri ) {render_obj=ri;} + SceneNode(const Matrix4f &mat ):SceneOrient(mat) {} + SceneNode(const Matrix4f &mat, RenderableInstance *ri ):SceneOrient(mat) {render_obj=ri;} + + virtual ~SceneNode(){} + + void Clear() { - SetLocalMatrix(mat); + SubNode.ClearData(); + render_obj=nullptr; } - virtual ~SceneNode() - { - ClearSubNode(); - } - - SceneNode *CreateSubNode() - { - SceneNode *sn=new SceneNode(); - - SubNode.Add(sn); - return sn; - } - - SceneNode *CreateSubNode(const Matrix4f &mat) - { - SceneNode *sn=new SceneNode(mat); - - SubNode.Add(sn); - return sn; - } - - void AddSubNode(SceneNode *n){if(n)SubNode.Add(n);} ///<增加一个子节点 - void ClearSubNode(){SubNode.ClearData();} ///<清除子节点 - public: //坐标相关方法 virtual void SetBoundingBox (const AABB &bb){BoundingBox=bb;} ///<设置绑定盒 diff --git a/inc/hgl/graph/SceneTreeToRenderList.h b/inc/hgl/graph/SceneTreeToRenderList.h index 5dbb103f..9677f7a8 100644 --- a/inc/hgl/graph/SceneTreeToRenderList.h +++ b/inc/hgl/graph/SceneTreeToRenderList.h @@ -9,11 +9,6 @@ namespace hgl { namespace graph { - struct RenderNode - { - SceneNode *node; - };// - class SceneTreeToRenderList { using PipelineSets =Sets; @@ -31,7 +26,7 @@ namespace hgl protected: - SceneNodeList * scene_node_list; ///<场景节点列表 + RenderNodeList *render_node_list; ///<场景节点列表 PipelineSets pipeline_sets; ///<管线合集 MaterialSets material_sets; ///<材质合集 @@ -41,7 +36,7 @@ namespace hgl protected: - virtual float CameraLength(SceneNode *,SceneNode *); ///<摄像机距离比较函数 + virtual int Comp(RenderNode *,RenderNode *); ///<摄像机距离比较函数 // virtual bool InFrustum(const SceneNode *,void *); ///<平截头截剪函数 diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index 73335400..46731c0e 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -29,8 +29,9 @@ SET(TILE_SOURCE ${SG_INCLUDE_PATH}/TileData.h SOURCE_GROUP("Tile" FILES ${TILE_SOURCE}) SET(SCENE_GRAPH_HEADER ${SG_INCLUDE_PATH}/Light.h - ${SG_INCLUDE_PATH}/MVPMatrix.h + ${SG_INCLUDE_PATH}/SceneInfo.h ${SG_INCLUDE_PATH}/SceneNode.h + ${SG_INCLUDE_PATH}/RenderNode.h ${SG_INCLUDE_PATH}/SceneOrient.h ${SG_INCLUDE_PATH}/RenderList.h ${SG_INCLUDE_PATH}/SceneTreeToRenderList.h diff --git a/src/SceneGraph/RenderList.cpp b/src/SceneGraph/RenderList.cpp index e0825789..58c8f8d2 100644 --- a/src/SceneGraph/RenderList.cpp +++ b/src/SceneGraph/RenderList.cpp @@ -94,7 +94,7 @@ namespace hgl } } - void RenderList::Render(SceneNode *node,RenderableInstance *ri) + void RenderList::Render(RenderableInstance *ri) { if(last_pipeline!=ri->GetPipeline()) { @@ -130,18 +130,6 @@ namespace hgl } } - void RenderList::Render(SceneNode *node,List &ri_list) - { - const int count=ri_list.GetCount(); - RenderableInstance **ri=ri_list.GetData(); - - for(int i=0;iRIList); + Render(sn->render_obj); return(true); } diff --git a/src/SceneGraph/SceneTreeToRenderList.cpp b/src/SceneGraph/SceneTreeToRenderList.cpp index d5776342..043f3320 100644 --- a/src/SceneGraph/SceneTreeToRenderList.cpp +++ b/src/SceneGraph/SceneTreeToRenderList.cpp @@ -1,4 +1,5 @@ #include +#include namespace hgl { @@ -9,43 +10,15 @@ namespace hgl device=d; hgl_zero(camera_info); - scene_node_list=nullptr; + render_node_list=nullptr; render_list=nullptr; } SceneTreeToRenderList::~SceneTreeToRenderList() { - SAFE_CLEAR(scene_node_list); + SAFE_CLEAR(render_node_list); } - - float SceneTreeToRenderList::CameraLength(SceneNode *obj_one,SceneNode *obj_two) - { - if(!obj_one||!obj_two) - return(0); - - return( length_squared(obj_one->GetCenter(),camera_info.pos)- - length_squared(obj_two->GetCenter(),camera_info.pos)); - } - - //bool SceneTreeToRenderList::InFrustum(const SceneNode *,void *) - //{ - // return(true); - //} - - bool SceneTreeToRenderList::Begin() - { - if(!scene_node_list) - scene_node_list=new SceneNodeList; - - scene_node_list->ClearData(); - - pipeline_sets.ClearData(); - material_sets.ClearData(); - mat_inst_sets.ClearData(); - - return(true); - } - + /** * 理论上讲,我们需要按以下顺序排序 * @@ -56,16 +29,87 @@ namespace hgl * for(distance) */ + int SceneTreeToRenderList::Comp(RenderNode *obj_one,RenderNode *obj_two) + { + int off; + + //比较材质 + MaterialInstance *mi1=obj_one->ri->GetMaterialInstance(); + MaterialInstance *mi2=obj_two->ri->GetMaterialInstance(); + + off=mi1->GetMaterial()-mi2->GetMaterial(); + + if(off) + return off; + + //比较管线 + Pipeline *p1=obj_one->ri->GetPipeline(); + Pipeline *p2=obj_two->ri->GetPipeline(); + + off=p1-p2; + + if(off) + return off; + + //比较材质实例 + off=mi1-mi2; + + if(off) + return off; + + //比较vbo+ebo + off=obj_one->ri->GetBufferHash() + -obj_two->ri->GetBufferHash(); + + if(off) + return off; + + //比较距离 + return( obj_one->distance_to_camera_square- + obj_two->distance_to_camera_square); + } + + //bool SceneTreeToRenderList::InFrustum(const SceneNode *,void *) + //{ + // return(true); + //} + + bool SceneTreeToRenderList::Begin() + { + if(!render_node_list) + render_node_list=new RenderNodeList; + + render_node_list->ClearData(); + + pipeline_sets.ClearData(); + material_sets.ClearData(); + mat_inst_sets.ClearData(); + + return(true); + } + bool SceneTreeToRenderList::End() { + } bool SceneTreeToRenderList::Expend(SceneNode *sn) { if(!sn)return(false); - if(sn->RIList.GetCount()>0) - scene_node_list->Add(sn); + if(sn->render_obj) + { + RenderNode *rn=new RenderNode; + + rn->WorldCenter=sn->GetWorldCenter(); + + rn->distance_to_camera_square=length_squared(rn->WorldCenter,camera_info.pos); +// rn->distance_to_camera=sqrtf(rn->distance_to_camera_square); + + rn->ri=sn->render_obj; + + render_node_list->Add(rn); + } for(SceneNode *sub:sn->SubNode) Expend(sub);