prepare refactor SceneTreeToRenderList
This commit is contained in:
parent
da15630ac9
commit
9e7698cf0c
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;} ///<设置绑定盒
|
||||
|
@ -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 *);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user