SceneTreeToRenderList

This commit is contained in:
hyzboy 2021-02-05 17:15:16 +08:00
parent 07c761eab9
commit 4108eaa342
3 changed files with 82 additions and 5 deletions

2
CMCore

@ -1 +1 @@
Subproject commit 74f7f146ba6b79fd904f6fd47f4dbee0750831f6
Subproject commit f52b7ac971305bc1e3e987a7de919e891fdc4d6e

View File

@ -5,12 +5,15 @@
#include<hgl/graph/Camera.h>
#include<hgl/graph/SceneNode.h>
#include<hgl/type/Color4f.h>
#include<hgl/type/Sets.h>
namespace hgl
{
namespace graph
{
struct MVPArray;
using SceneNodeList=List<SceneNode *>;
class RenderList
{
GPUDevice *device;
@ -22,7 +25,7 @@ namespace hgl
MVPArray *mvp_array;
List<SceneNode *> scene_node_list;
SceneNodeList *scene_node_list;
Pipeline * last_pipeline;
RenderableInstance *last_ri;
@ -49,20 +52,40 @@ namespace hgl
class SceneTreeToRenderList
{
using PipelineSets=Sets<Pipeline *>;
using MaterialSets=Sets<Material *>;
using MatInstanceSets=Sets<MaterialInstance *>;
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

View File

@ -1,9 +1,14 @@
#include<hgl/graph/RenderList.h>
#include<hgl/graph/RenderList.h>
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