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/Camera.h>
#include<hgl/graph/SceneNode.h>
#include<hgl/graph/RenderNode.h>
#include<hgl/graph/VKArrayBuffer.h>
#include<hgl/graph/SceneInfo.h>
#include<hgl/type/Color4f.h>
@ -12,7 +13,7 @@ namespace hgl
{
namespace graph
{
using SceneNodeList=List<SceneNode *>;
// using SceneNodeList=List<SceneNode *>;
using MVPArrayBuffer=GPUArrayBuffer<MVPMatrix>;
using MVPOffsetBuffer=List<uint32_t>;
@ -29,7 +30,7 @@ namespace hgl
Camera *camera;
SceneNodeList scene_node_list;
RenderNodeList render_node_list;
MVPArrayBuffer *mvp_array;
MVPOffsetBuffer mvp_offset;
@ -39,8 +40,7 @@ namespace hgl
Pipeline * last_pipeline;
RenderableInstance *last_ri;
void Render(SceneNode *,RenderableInstance *);
void Render(SceneNode *,List<RenderableInstance *> &);
void Render(RenderableInstance *);
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; ///<子节点
List<RenderableInstance *> RIList; ///<可渲染实例
RenderableInstance *render_obj=nullptr; ///<可渲染实例
public:
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: //坐标相关方法
virtual void SetBoundingBox (const AABB &bb){BoundingBox=bb;} ///<设置绑定盒

View File

@ -9,11 +9,6 @@ namespace hgl
{
namespace graph
{
struct RenderNode
{
SceneNode *node;
};//
class SceneTreeToRenderList
{
using PipelineSets =Sets<Pipeline *>;
@ -31,7 +26,7 @@ namespace hgl
protected:
SceneNodeList * scene_node_list; ///<场景节点列表
RenderNodeList *render_node_list; ///<场景节点列表
PipelineSets pipeline_sets; ///<管线合集
MaterialSets material_sets; ///<材质合集
@ -41,7 +36,7 @@ namespace hgl
protected:
virtual float CameraLength(SceneNode *,SceneNode *); ///<摄像机距离比较函数
virtual int Comp(RenderNode *,RenderNode *); ///<摄像机距离比较函数
// 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})
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}/RenderNode.h
${SG_INCLUDE_PATH}/SceneOrient.h
${SG_INCLUDE_PATH}/RenderList.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())
{
@ -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)
{
if(!cb)
@ -153,7 +141,7 @@ namespace hgl
last_ri=nullptr;
for(SceneNode *sn:scene_node_list)
Render(sn,sn->RIList);
Render(sn->render_obj);
return(true);
}

View File

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