1.SceneNode恢复原先设定,RenderableNode改回RenderableInstance

2.SceneDB增加RenderableInstance记录
This commit is contained in:
hyzboy 2019-05-27 16:54:08 +08:00
parent ba283ff0ab
commit eff630558c
9 changed files with 133 additions and 108 deletions

View File

@ -7,7 +7,8 @@
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/SceneDB.h>
#include<hgl/graph/RenderableNode.h>
#include<hgl/graph/RenderableInstance.h>
#include<hgl/graph/RenderList.h>
using namespace hgl;
using namespace hgl::graph;
@ -30,12 +31,13 @@ private:
uint swap_chain_count=0;
SceneDB * db =nullptr;
SceneNode * render_root =nullptr;
RenderList * render_list =nullptr;
vulkan::Material * material =nullptr;
vulkan::DescriptorSets * descriptor_sets =nullptr;
vulkan::Renderable * render_obj =nullptr;
RenderableNode * render_node =nullptr;
vulkan::Buffer * ubo_mvp =nullptr;
@ -46,7 +48,8 @@ public:
~TestApp()
{
SAFE_CLEAR(render_node);
SAFE_CLEAR(render_list);
SAFE_CLEAR(render_root);
SAFE_CLEAR(db);
SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count);
@ -70,20 +73,6 @@ private:
bool CreateRenderObject()
{
//struct RectangleCreateInfo rci;
//rci.scope.Set(10,10,10,10);
//render_obj=CreateRectangle(device,material,&rci);
//struct RoundRectangleCreateInfo rrci;
//rrci.scope.Set(10,10,SCREEN_WIDTH-20,SCREEN_HEIGHT-20);
//rrci.radius=8; //半径为8
//rrci.round_per=8; //圆角切分成8段
//render_obj=CreateRoundRectangle(device,material,&rrci);
struct CircleCreateInfo cci;
cci.center.x=SCREEN_WIDTH/2;
@ -136,25 +125,20 @@ private:
return pipeline;
}
void Draw(vulkan::CommandBuffer *cb,RenderableNode *ri)
bool InitScene()
{
cb->Bind(ri->GetPipeline());
cb->Bind(ri->GetDescriptorSets());
RenderableInstance *ri=db->CreateRenderableInstance(pipeline,descriptor_sets,render_obj);
vulkan::Renderable *obj=ri->GetRenderable();
if(!ri)
return(false);
cb->Bind(obj);
render_root=new SceneNode();
render_list=new RenderList();
const vulkan::IndexBuffer *ib=obj->GetIndexBuffer();
render_root->Add(ri);
render_root->ExpendToList(render_list);
if(ib)
{
cb->DrawIndexed(ib->GetCount());
}
else
{
cb->Draw(obj->GetDrawCount());
}
return(true);
}
bool InitCommandBuffer()
@ -170,7 +154,7 @@ private:
cmd_buf[i]->Begin();
cmd_buf[i]->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(i));
Draw(cmd_buf[i],render_node);
render_list->Render(cmd_buf[i]);
cmd_buf[i]->EndRenderPass();
cmd_buf[i]->End();
}
@ -201,7 +185,8 @@ public:
if(!InitPipeline())
return(false);
render_node=new RenderableNode(pipeline,descriptor_sets,render_obj);
if(!InitScene())
return(false);
if(!InitCommandBuffer())
return(false);

View File

@ -3,12 +3,13 @@
#include<hgl/graph/vulkan/VK.h>
#include<hgl/graph/Camera.h>
#include<hgl/graph/SceneNode.h>
#include<hgl/type/Color4f.h>
namespace hgl
{
namespace graph
{
class RenderableNode;
class RenderableInstance;
struct UBOMatrixData
{
@ -41,13 +42,14 @@ namespace hgl
private:
List<RenderableNode *> renderable_node_list;
List<SceneNode *> scene_node_list;
vulkan::Pipeline * last_pipeline;
vulkan::DescriptorSets *last_desc_sets;
vulkan::Renderable * last_renderable;
void Render(RenderableNode *,const Matrix4f &);
void Render(RenderableInstance *);
void Render(List<RenderableInstance *> &);
public:
@ -61,17 +63,19 @@ namespace hgl
~RenderList()=default;
void Add (RenderableNode *node) {if(node)renderable_node_list.Add(node);}
void Clear () {renderable_node_list.ClearData();}
void Add (SceneNode *node) {if(node)scene_node_list.Add(node);}
void Clear () {scene_node_list.ClearData();}
void SetCamera(const Camera &);
void SetMVP(const Matrix4f &proj,const Matrix4f &mv);
void SetSkyLightColor(const Color4f &c,const Vector4f &d)
{
ubo_skylight.sun_color=c;
ubo_skylight.sun_direction=d;
}
bool Render();
bool Render(vulkan::CommandBuffer *);
};//class RenderList
}//namespace graph
}//namespace hgl

View File

@ -1,10 +1,9 @@
#ifndef HGL_GRAPH_RENDERABLE_NODE_INCLUDE
#define HGL_GRAPH_RENDERABLE_NODE_INCLUDE
#ifndef HGL_GRAPH_RENDERABLE_INSTANCE_INCLUDE
#define HGL_GRAPH_RENDERABLE_INSTANCE_INCLUDE
#include<hgl/graph/vulkan/VKRenderable.h>
#include<hgl/graph/vulkan/VKPipeline.h>
#include<hgl/graph/vulkan/VKDescriptorSets.h>
#include<hgl/graph/SceneNode.h>
namespace hgl
{
namespace graph
@ -12,7 +11,7 @@ namespace hgl
/**
*
*/
class RenderableNode:public SceneNode
class RenderableInstance
{
vulkan::Pipeline * pipeline;
vulkan::DescriptorSets * desc_sets;
@ -20,8 +19,8 @@ namespace hgl
public:
RenderableNode(vulkan::Pipeline *p,vulkan::DescriptorSets *ds,vulkan::Renderable *r):pipeline(p),desc_sets(ds),render_obj(r){}
virtual ~RenderableNode()
RenderableInstance(vulkan::Pipeline *p,vulkan::DescriptorSets *ds,vulkan::Renderable *r):pipeline(p),desc_sets(ds),render_obj(r){}
virtual ~RenderableInstance()
{
//需要在这里添加删除pipeline/desc_sets/render_obj引用计数的代码
}
@ -31,9 +30,7 @@ namespace hgl
vulkan::Renderable * GetRenderable (){return render_obj;}
const AABB & GetBoundingBox ()const{return render_obj->GetBoundingBox();}
const bool CanRenderable ()const override{return true;} ///<是否可以渲染
const int Comp(const RenderableNode *ri)const
const int Comp(const RenderableInstance *ri)const
{
//绘制顺序:
@ -72,8 +69,8 @@ namespace hgl
return render_obj-ri->render_obj;
}
CompOperator(const RenderableNode *,Comp)
CompOperator(const RenderableInstance *,Comp)
};//class RenderableNode
}//namespace graph
}//namespace hgl
#endif//HGL_GRAPH_RENDERABLE_NODE_INCLUDE
#endif//HGL_GRAPH_RENDERABLE_INSTANCE_INCLUDE

View File

@ -7,6 +7,7 @@
#include<hgl/graph/vulkan/VKRenderable.h>
#include<hgl/graph/vulkan/VKBuffer.h>
#include<hgl/graph/VertexBufferCreater.h>
#include<hgl/graph/RenderableInstance.h>
#include<hgl/type/ResManage.h>
namespace hgl
{
@ -14,9 +15,10 @@ namespace hgl
{
using MaterialID =int;
using PipelineID =int;
using DescriptorSetsID =int;
using RenderableID =int;
using BufferID =int;
using DescriptorSetsID =int;
using RenderableID =int;
using RenderableInstanceID =int;
class VertexBufferCreater;
@ -27,22 +29,24 @@ namespace hgl
{
vulkan::Device *device;
IDResManage<MaterialID, vulkan::Material> rm_material; ///<材质合集
IDResManage<PipelineID, vulkan::Pipeline> rm_pipeline; ///<管线合集
IDResManage<DescriptorSetsID, vulkan::DescriptorSets> rm_desc_sets; ///<描述符合集
IDResManage<RenderableID, vulkan::Renderable> rm_renderables; ///<可渲染对象合集
IDResManage<BufferID, vulkan::Buffer> rm_buffers; ///<顶点缓冲区集合
IDResManage<MaterialID, vulkan::Material> rm_material; ///<材质合集
IDResManage<PipelineID, vulkan::Pipeline> rm_pipeline; ///<管线合集
IDResManage<DescriptorSetsID, vulkan::DescriptorSets> rm_desc_sets; ///<描述符合集
IDResManage<RenderableID, vulkan::Renderable> rm_renderables; ///<可渲染对象合集
IDResManage<BufferID, vulkan::Buffer> rm_buffers; ///<顶点缓冲区合集
IDResManage<RenderableInstanceID, RenderableInstance> rm_renderable_instances; ///<渲染实例集合集
public:
SceneDB(vulkan::Device *dev):device(dev){}
virtual ~SceneDB()=default;
MaterialID Add(vulkan::Material * mtl ){return rm_material.Add(mtl);}
PipelineID Add(vulkan::Pipeline * p ){return rm_pipeline.Add(p);}
DescriptorSetsID Add(vulkan::DescriptorSets *ds ){return rm_desc_sets.Add(ds);}
RenderableID Add(vulkan::Renderable * r ){return rm_renderables.Add(r);}
BufferID Add(vulkan::Buffer * buf ){return rm_buffers.Add(buf);}
MaterialID Add(vulkan::Material * mtl ){return rm_material.Add(mtl);}
PipelineID Add(vulkan::Pipeline * p ){return rm_pipeline.Add(p);}
DescriptorSetsID Add(vulkan::DescriptorSets *ds ){return rm_desc_sets.Add(ds);}
RenderableID Add(vulkan::Renderable * r ){return rm_renderables.Add(r);}
BufferID Add(vulkan::Buffer * buf ){return rm_buffers.Add(buf);}
RenderableInstanceID Add(RenderableInstance * ri ){return rm_renderable_instances.Add(ri);}
vulkan::VertexBuffer *CreateVBO(VkFormat format,uint32_t count,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE);
vulkan::VertexBuffer *CreateVBO(VkFormat format,uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateVBO(format,count,nullptr,sharing_mode);}
@ -57,11 +61,14 @@ namespace hgl
#undef SCENE_DB_CREATE_FUNC
vulkan::Material * GetMaterial (const MaterialID &id){return rm_material.Get(id);}
vulkan::Pipeline * GetPipeline (const PipelineID &id){return rm_pipeline.Get(id);}
vulkan::DescriptorSets *GetDescSets (const DescriptorSetsID &id){return rm_desc_sets.Get(id);}
vulkan::Renderable * GetRenderable (const RenderableID &id){return rm_renderables.Get(id);}
vulkan::Buffer * GetBuffer (const BufferID &id){return rm_buffers.Get(id);}
RenderableInstance * CreateRenderableInstance(vulkan::Pipeline *p,vulkan::DescriptorSets *ds,vulkan::Renderable *r);
vulkan::Material * GetMaterial (const MaterialID &id){return rm_material.Get(id);}
vulkan::Pipeline * GetPipeline (const PipelineID &id){return rm_pipeline.Get(id);}
vulkan::DescriptorSets *GetDescSets (const DescriptorSetsID &id){return rm_desc_sets.Get(id);}
vulkan::Renderable * GetRenderable (const RenderableID &id){return rm_renderables.Get(id);}
vulkan::Buffer * GetBuffer (const BufferID &id){return rm_buffers.Get(id);}
RenderableInstance * GetRenderableInstance (const RenderableInstanceID &id){return rm_renderable_instances.Get(id);}
};//class SceneDB
}//namespace graph
}//namespace hgl

View File

@ -11,6 +11,7 @@ namespace hgl
class SceneNode;
struct Camera;
class RenderList;
class RenderableInstance;
using RenderListCompFunc=float (*)(Camera *,SceneNode *,SceneNode *); ///<渲染列表排序比较函数
@ -40,6 +41,8 @@ namespace hgl
ObjectList<SceneNode> SubNode; ///<子节点
List<RenderableInstance *> renderable_instances; ///<可渲染实例
public:
SceneNode()=default;
@ -48,21 +51,11 @@ namespace hgl
ClearSubNode();
}
void AddSubNode(SceneNode *n){if(n)SubNode.Add(n);} ///<增加一个子节点
SceneNode * CreateSubNode() ///<创建一个子节点
{
SceneNode *sn=new SceneNode();
SubNode.Add(sn);
return sn;
}
void Add(SceneNode *n){if(n)SubNode.Add(n);} ///<增加一个子节点
void ClearSubNode(){SubNode.ClearData();} ///<清除子节点
void ClearSubNode(){SubNode.Clear();} ///<清除子节点
public:
virtual const bool IsCamera()const{return false;} ///<是否是摄像机
virtual const bool IsLight()const{return false;} ///<是否是灯光
virtual const bool CanRenderable()const{return false;} ///<是否可以渲染
void Add(RenderableInstance *ri){if(ri)renderable_instances.Add(ri);} ///<增加渲染实例
void ClearRenderableInstance(){renderable_instances.ClearData();} ///<清除渲染实例
public: //坐标相关方法
@ -81,12 +74,12 @@ namespace hgl
public: //渲染列表相关方法
virtual bool ExpendToList(RenderList *,FilterSceneNodeFunc func=nullptr,void *func_data=nullptr)const; ///<展开到渲染列表
bool ExpendToList(RenderList *rl,Frustum *f)const ///<展开到渲染列表(使用平截头裁剪)
virtual bool ExpendToList(RenderList *,FilterSceneNodeFunc func=nullptr,void *func_data=nullptr); ///<展开到渲染列表
bool ExpendToList(RenderList *rl,Frustum *f) ///<展开到渲染列表(使用平截头裁剪)
{return ExpendToList(rl,FrustumClipFilter,f);}
// bool ExpendToList(RenderList *,const Matrix4f &,const Matrix4f &,RenderListCompFunc=nullptr)const; ///<展开到渲染列表(使用平截头裁剪并排序)
bool ExpendToList(RenderList *,Camera *,RenderListCompFunc=nullptr)const; ///<展开到渲染列表(使用摄像机平截头裁剪并排序)
// bool ExpendToList(RenderList *,const Matrix4f &,const Matrix4f &,RenderListCompFunc=nullptr); ///<展开到渲染列表(使用平截头裁剪并排序)
bool ExpendToList(RenderList *,Camera *,RenderListCompFunc=nullptr); ///<展开到渲染列表(使用摄像机平截头裁剪并排序)
};//class SceneNode
}//namespace graph
}//namespace hgl

View File

@ -4,7 +4,8 @@
${ROOT_INCLUDE_PATH}/hgl/graph/SceneDB.h
${ROOT_INCLUDE_PATH}/hgl/graph/SceneNode.h
${ROOT_INCLUDE_PATH}/hgl/graph/SceneOrient.h
${ROOT_INCLUDE_PATH}/hgl/graph/RenderableNode.h
${ROOT_INCLUDE_PATH}/hgl/graph/RenderableInstance.h
${ROOT_INCLUDE_PATH}/hgl/graph/RenderList.h
${ROOT_INCLUDE_PATH}/hgl/graph/VertexBufferCreater.h
${ROOT_INCLUDE_PATH}/hgl/graph/VertexBuffer.h
${ROOT_INCLUDE_PATH}/hgl/graph/InlineGeometry.h)

View File

@ -4,7 +4,7 @@
#include<hgl/graph/vulkan/VKRenderable.h>
#include<hgl/graph/vulkan/VKCommandBuffer.h>
#include<hgl/graph/VertexBuffer.h>
#include<hgl/graph/RenderableNode.h>
#include<hgl/graph/RenderableInstance.h>
namespace hgl
{
@ -41,7 +41,15 @@ namespace hgl
&camera);
}
void RenderList::Render(RenderableNode *ri,const Matrix4f &fin_mvp)
void RenderList::SetMVP(const Matrix4f &proj,const Matrix4f &mv)
{
ubo_matrix.projection =proj;
ubo_matrix.modelview =mv;
ubo_matrix.mvp =proj*mv;
ubo_matrix.normal =ubo_matrix.modelview.Float3x3Part(); //法线矩阵为3x3
}
void RenderList::Render(RenderableInstance *ri)
{
if(last_pipeline!=ri->GetPipeline())
{
@ -84,25 +92,36 @@ namespace hgl
}
}
bool RenderList::Render()
void RenderList::Render(List<RenderableInstance *> &ri_list)
{
if(!cmd_buf)
const int count=ri_list.GetCount();
RenderableInstance **ri=ri_list.GetData();
for(int i=0;i<count;i++)
{
Render(*ri);
++ri;
}
}
bool RenderList::Render(vulkan::CommandBuffer *cb)
{
if(!cb)
return(false);
cmd_buf=cb;
last_pipeline=nullptr;
last_desc_sets=nullptr;
last_renderable=nullptr;
const int count=renderable_node_list.GetCount();
RenderableNode **node=renderable_node_list.GetData();
const int count=scene_node_list.GetCount();
SceneNode **node=scene_node_list.GetData();
for(int i=0;i<count;i++)
{
const Matrix4f fin_mv=ubo_matrix.modelview*(*node)->GetLocalToWorldMatrix();
Render(*node,ubo_matrix.projection*fin_mv);
node++;
Render((*node)->renderable_instances);
++node;
}
return(true);

View File

@ -1,5 +1,6 @@
#include<hgl/graph/SceneDB.h>
#include<hgl/graph/vulkan/VKDevice.h>
#include<hgl/graph/RenderableInstance.h>
namespace hgl
{
@ -40,5 +41,17 @@ namespace hgl
SCENE_DB_CREATE_BUFFER(INBO)
#undef SCENE_DB_CREATE_BUFFER
RenderableInstance *SceneDB::CreateRenderableInstance(vulkan::Pipeline *p,vulkan::DescriptorSets *ds,vulkan::Renderable *r)
{
if(!p||!ds||!r)
return(nullptr);
RenderableInstance *ri=new RenderableInstance(p,ds,r);
Add(ri);
return ri;
}
}//namespace graph
}//namespace hgl

View File

@ -62,7 +62,7 @@ namespace hgl
* @param func_data
* @return
*/
bool SceneNode::ExpendToList(RenderList *rl,FilterSceneNodeFunc func,void *func_data)const
bool SceneNode::ExpendToList(RenderList *rl,FilterSceneNodeFunc func,void *func_data)
{
if(!rl)return(false);
@ -70,17 +70,23 @@ namespace hgl
if(!func(this,func_data))
return(false);
if(CanRenderable())
rl->Add((RenderableNode *)this); //增加当前节点
int count=SubNode.GetCount();
SceneNode **sub=SubNode.GetData();
for(int i=0;i<count;i++)
{
(*sub)->ExpendToList(rl,func,func_data); //展开子节点
int count=renderable_instances.GetCount();
sub++;
if(count>0)
rl->Add(this);
}
{
int count=SubNode.GetCount();
SceneNode **sub=SubNode.GetData();
for(int i=0;i<count;i++)
{
(*sub)->ExpendToList(rl,func,func_data); //展开子节点
++sub;
}
}
return(true);
@ -99,7 +105,7 @@ namespace hgl
* @param cam
* @param comp_func
*/
bool SceneNode::ExpendToList(RenderList *rl,Camera *cam,RenderListCompFunc comp_func)const
bool SceneNode::ExpendToList(RenderList *rl,Camera *cam,RenderListCompFunc comp_func)
{
if(!rl||!cam)return(false);