diff --git a/example/Vulkan/two_triangle.cpp b/example/Vulkan/two_triangle.cpp index 0debfe47..8e84e2a7 100644 --- a/example/Vulkan/two_triangle.cpp +++ b/example/Vulkan/two_triangle.cpp @@ -4,6 +4,7 @@ #include"VulkanAppFramework.h" #include #include +#include using namespace hgl; using namespace hgl::graph; @@ -85,9 +86,17 @@ private: render_instance=db->CreateRenderableInstance(render_obj,material_instance,pipeline); - render_root.Add(render_instance,scale(0.5,0.5)); + { + SceneNode *sn=render_root.CreateSubNode(scale(0.5,0.5)); + sn->RIList.Add(render_instance); + } + render_root.RefreshMatrix(); - render_root.ExpendToList(&render_list); + + SceneTreeToRenderList st2rl(device); + + st2rl.Expend(&render_list,&render_root,&cam); + return(true); } diff --git a/inc/hgl/graph/SceneNode.h b/inc/hgl/graph/SceneNode.h index baa79380..75d9c13c 100644 --- a/inc/hgl/graph/SceneNode.h +++ b/inc/hgl/graph/SceneNode.h @@ -28,20 +28,15 @@ namespace hgl public: ObjectList SubNode; ///<子节点 - - RenderableInstance *renderable_instances; ///<可渲染实例 + + List RIList; ///<可渲染实例 public: - SceneNode() - { - renderable_instances=nullptr; - } - - SceneNode(const Matrix4f &mat,RenderableInstance *ri=nullptr) + SceneNode()=default; + SceneNode(const Matrix4f &mat) { SetLocalMatrix(mat); - renderable_instances=ri; } virtual ~SceneNode() @@ -68,15 +63,6 @@ namespace hgl void AddSubNode(SceneNode *n){if(n)SubNode.Add(n);} ///<增加一个子节点 void ClearSubNode(){SubNode.ClearData();} ///<清除子节点 - void Set(RenderableInstance *ri){renderable_instances=ri;} ///<增加渲染实例 - - void Set(const Matrix4f &mat,RenderableInstance *ri) - { - SetLocalMatrix(mat); - - renderable_instances=ri; - } - public: //坐标相关方法 virtual void SetBoundingBox (const AABB &bb){BoundingBox=bb;} ///<设置绑定盒 diff --git a/inc/hgl/graph/SceneTreeToRenderList.h b/inc/hgl/graph/SceneTreeToRenderList.h index c0522cf9..5dbb103f 100644 --- a/inc/hgl/graph/SceneTreeToRenderList.h +++ b/inc/hgl/graph/SceneTreeToRenderList.h @@ -22,7 +22,7 @@ namespace hgl protected: - GPUDevice *device; + GPUDevice * device; protected: @@ -43,7 +43,7 @@ namespace hgl virtual float CameraLength(SceneNode *,SceneNode *); ///<摄像机距离比较函数 - virtual bool InFrustum(const SceneNode *,void *); ///<平截头截剪函数 +// virtual bool InFrustum(const SceneNode *,void *); ///<平截头截剪函数 virtual bool Begin(); virtual bool Expend(SceneNode *); diff --git a/src/SceneGraph/RenderList.cpp b/src/SceneGraph/RenderList.cpp index ec4cf94d..e0825789 100644 --- a/src/SceneGraph/RenderList.cpp +++ b/src/SceneGraph/RenderList.cpp @@ -152,14 +152,8 @@ namespace hgl last_pipeline=nullptr; last_ri=nullptr; - const int count=scene_node_list.GetCount(); - SceneNode **node=scene_node_list.GetData(); - - for(int i=0;irenderable_instances); - ++node; - } + for(SceneNode *sn:scene_node_list) + Render(sn,sn->RIList); return(true); } diff --git a/src/SceneGraph/SceneTreeToRenderList.cpp b/src/SceneGraph/SceneTreeToRenderList.cpp index 1f5c60be..d5776342 100644 --- a/src/SceneGraph/SceneTreeToRenderList.cpp +++ b/src/SceneGraph/SceneTreeToRenderList.cpp @@ -27,25 +27,25 @@ namespace hgl length_squared(obj_two->GetCenter(),camera_info.pos)); } - bool SceneTreeToRenderList::InFrustum(const SceneNode *,void *) - { - return(true); - } - - //bool SceneTreeToRenderList::Begin() + //bool SceneTreeToRenderList::InFrustum(const SceneNode *,void *) //{ - // 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); //} + 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,22 +56,22 @@ namespace hgl * for(distance) */ - //bool SceneTreeToRenderList::End() - //{ - //} + bool SceneTreeToRenderList::End() + { + } - //bool SceneTreeToRenderList::Expend(SceneNode *sn) - //{ - // if(!sn)return(false); + bool SceneTreeToRenderList::Expend(SceneNode *sn) + { + if(!sn)return(false); - // if(sn->renderable_instances) - // scene_node_list->Add(sn); + if(sn->RIList.GetCount()>0) + scene_node_list->Add(sn); - // for(SceneNode *sub:sn->SubNode) - // Expend(sub); + for(SceneNode *sub:sn->SubNode) + Expend(sub); - // return(true); - //} + return(true); + } bool SceneTreeToRenderList::Expend(RenderList *rl,const CameraInfo &ci,SceneNode *sn) { @@ -87,6 +87,8 @@ namespace hgl Begin(); Expend(sn); End(); + + return(true); } }//namespace graph }//namespace hgl