added RenderNode class.
This commit is contained in:
parent
2180dff6f8
commit
ce420d23a7
@ -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:
|
||||||
|
|
||||||
|
25
inc/hgl/graph/RenderNode.h
Normal file
25
inc/hgl/graph/RenderNode.h
Normal 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
|
@ -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;} ///<设置绑定盒
|
||||||
|
@ -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 *); ///<平截头截剪函数
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include<hgl/graph/SceneTreeToRenderList.h>
|
#include<hgl/graph/SceneTreeToRenderList.h>
|
||||||
|
#include<hgl/graph/VKRenderableInstance.h>
|
||||||
|
|
||||||
namespace hgl
|
namespace hgl
|
||||||
{
|
{
|
||||||
@ -9,43 +10,15 @@ 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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user