prepare refactor SceneTreeToRenderList

This commit is contained in:
hyzboy 2021-05-31 19:10:17 +08:00
parent da15630ac9
commit 9e7698cf0c
5 changed files with 48 additions and 57 deletions

View File

@ -4,6 +4,7 @@
#include"VulkanAppFramework.h"
#include<hgl/math/Math.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/SceneTreeToRenderList.h>
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);
}

View File

@ -28,20 +28,15 @@ namespace hgl
public:
ObjectList<SceneNode> SubNode; ///<子节点
RenderableInstance *renderable_instances; ///<可渲染实例
List<RenderableInstance *> 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;} ///<设置绑定盒

View File

@ -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 *);

View File

@ -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;i<count;i++)
{
Render(*node,(*node)->renderable_instances);
++node;
}
for(SceneNode *sn:scene_node_list)
Render(sn,sn->RIList);
return(true);
}

View File

@ -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