added RenderNode class.

This commit is contained in:
hyzboy 2021-06-10 18:56:23 +08:00
parent 2180dff6f8
commit ce420d23a7
7 changed files with 122 additions and 86 deletions

View File

@ -4,6 +4,7 @@
#include<hgl/graph/VK.h> #include<hgl/graph/VK.h>
#include<hgl/graph/Camera.h> #include<hgl/graph/Camera.h>
#include<hgl/graph/SceneNode.h> #include<hgl/graph/SceneNode.h>
#include<hgl/graph/RenderNode.h>
#include<hgl/graph/VKArrayBuffer.h> #include<hgl/graph/VKArrayBuffer.h>
#include<hgl/graph/SceneInfo.h> #include<hgl/graph/SceneInfo.h>
#include<hgl/type/Color4f.h> #include<hgl/type/Color4f.h>
@ -12,7 +13,7 @@ namespace hgl
{ {
namespace graph namespace graph
{ {
using SceneNodeList=List<SceneNode *>; // using SceneNodeList=List<SceneNode *>;
using MVPArrayBuffer=GPUArrayBuffer<MVPMatrix>; using MVPArrayBuffer=GPUArrayBuffer<MVPMatrix>;
using MVPOffsetBuffer=List<uint32_t>; using MVPOffsetBuffer=List<uint32_t>;
@ -29,7 +30,7 @@ namespace hgl
Camera *camera; Camera *camera;
SceneNodeList scene_node_list; RenderNodeList render_node_list;
MVPArrayBuffer *mvp_array; MVPArrayBuffer *mvp_array;
MVPOffsetBuffer mvp_offset; MVPOffsetBuffer mvp_offset;
@ -39,8 +40,7 @@ namespace hgl
Pipeline * last_pipeline; Pipeline * last_pipeline;
RenderableInstance *last_ri; RenderableInstance *last_ri;
void Render(SceneNode *,RenderableInstance *); void Render(RenderableInstance *);
void Render(SceneNode *,List<RenderableInstance *> &);
private: private:

View File

@ -0,0 +1,25 @@
#ifndef HGL_GRAPH_RENDER_NODE_INCLUDE
#define HGL_GRAPH_RENDER_NODE_INCLUDE
#include<hgl/math/Vector.h>
#include<hgl/type/List.h>
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<RenderNode *>;
}//namespace graph
}//namespace hgl
#endif//HGL_GRAPH_RENDER_NODE_INCLUDE

View File

@ -29,40 +29,23 @@ namespace hgl
ObjectList<SceneNode> SubNode; ///<子节点 ObjectList<SceneNode> SubNode; ///<子节点
List<RenderableInstance *> RIList; ///<可渲染实例 RenderableInstance *render_obj=nullptr; ///<可渲染实例
public: public:
SceneNode()=default; 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: //坐标相关方法 public: //坐标相关方法
virtual void SetBoundingBox (const AABB &bb){BoundingBox=bb;} ///<设置绑定盒 virtual void SetBoundingBox (const AABB &bb){BoundingBox=bb;} ///<设置绑定盒

View File

@ -9,11 +9,6 @@ namespace hgl
{ {
namespace graph namespace graph
{ {
struct RenderNode
{
SceneNode *node;
};//
class SceneTreeToRenderList class SceneTreeToRenderList
{ {
using PipelineSets =Sets<Pipeline *>; using PipelineSets =Sets<Pipeline *>;
@ -31,7 +26,7 @@ namespace hgl
protected: protected:
SceneNodeList * scene_node_list; ///<场景节点列表 RenderNodeList *render_node_list; ///<场景节点列表
PipelineSets pipeline_sets; ///<管线合集 PipelineSets pipeline_sets; ///<管线合集
MaterialSets material_sets; ///<材质合集 MaterialSets material_sets; ///<材质合集
@ -41,7 +36,7 @@ namespace hgl
protected: protected:
virtual float CameraLength(SceneNode *,SceneNode *); ///<摄像机距离比较函数 virtual int Comp(RenderNode *,RenderNode *); ///<摄像机距离比较函数
// virtual bool InFrustum(const SceneNode *,void *); ///<平截头截剪函数 // virtual bool InFrustum(const SceneNode *,void *); ///<平截头截剪函数

View File

@ -29,8 +29,9 @@ SET(TILE_SOURCE ${SG_INCLUDE_PATH}/TileData.h
SOURCE_GROUP("Tile" FILES ${TILE_SOURCE}) SOURCE_GROUP("Tile" FILES ${TILE_SOURCE})
SET(SCENE_GRAPH_HEADER ${SG_INCLUDE_PATH}/Light.h 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}/SceneNode.h
${SG_INCLUDE_PATH}/RenderNode.h
${SG_INCLUDE_PATH}/SceneOrient.h ${SG_INCLUDE_PATH}/SceneOrient.h
${SG_INCLUDE_PATH}/RenderList.h ${SG_INCLUDE_PATH}/RenderList.h
${SG_INCLUDE_PATH}/SceneTreeToRenderList.h ${SG_INCLUDE_PATH}/SceneTreeToRenderList.h

View File

@ -94,7 +94,7 @@ namespace hgl
} }
} }
void RenderList::Render(SceneNode *node,RenderableInstance *ri) void RenderList::Render(RenderableInstance *ri)
{ {
if(last_pipeline!=ri->GetPipeline()) if(last_pipeline!=ri->GetPipeline())
{ {
@ -130,18 +130,6 @@ namespace hgl
} }
} }
void RenderList::Render(SceneNode *node,List<RenderableInstance *> &ri_list)
{
const int count=ri_list.GetCount();
RenderableInstance **ri=ri_list.GetData();
for(int i=0;i<count;i++)
{
Render(node,*ri);
++ri;
}
}
bool RenderList::Render(RenderCmdBuffer *cb) bool RenderList::Render(RenderCmdBuffer *cb)
{ {
if(!cb) if(!cb)
@ -153,7 +141,7 @@ namespace hgl
last_ri=nullptr; last_ri=nullptr;
for(SceneNode *sn:scene_node_list) for(SceneNode *sn:scene_node_list)
Render(sn,sn->RIList); Render(sn->render_obj);
return(true); return(true);
} }

View File

@ -1,4 +1,5 @@
#include<hgl/graph/SceneTreeToRenderList.h> #include<hgl/graph/SceneTreeToRenderList.h>
#include<hgl/graph/VKRenderableInstance.h>
namespace hgl namespace hgl
{ {
@ -9,41 +10,13 @@ namespace hgl
device=d; device=d;
hgl_zero(camera_info); hgl_zero(camera_info);
scene_node_list=nullptr; render_node_list=nullptr;
render_list=nullptr; render_list=nullptr;
} }
SceneTreeToRenderList::~SceneTreeToRenderList() 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) * 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::End()
{ {
} }
bool SceneTreeToRenderList::Expend(SceneNode *sn) bool SceneTreeToRenderList::Expend(SceneNode *sn)
{ {
if(!sn)return(false); if(!sn)return(false);
if(sn->RIList.GetCount()>0) if(sn->render_obj)
scene_node_list->Add(sn); {
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) for(SceneNode *sub:sn->SubNode)
Expend(sub); Expend(sub);