1.SceneNode恢复原先设定,RenderableNode改回RenderableInstance
2.SceneDB增加RenderableInstance记录
This commit is contained in:
parent
ba283ff0ab
commit
eff630558c
@ -7,7 +7,8 @@
|
|||||||
#include<hgl/filesystem/FileSystem.h>
|
#include<hgl/filesystem/FileSystem.h>
|
||||||
#include<hgl/graph/InlineGeometry.h>
|
#include<hgl/graph/InlineGeometry.h>
|
||||||
#include<hgl/graph/SceneDB.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;
|
||||||
using namespace hgl::graph;
|
using namespace hgl::graph;
|
||||||
@ -30,12 +31,13 @@ private:
|
|||||||
uint swap_chain_count=0;
|
uint swap_chain_count=0;
|
||||||
|
|
||||||
SceneDB * db =nullptr;
|
SceneDB * db =nullptr;
|
||||||
|
SceneNode * render_root =nullptr;
|
||||||
|
RenderList * render_list =nullptr;
|
||||||
|
|
||||||
vulkan::Material * material =nullptr;
|
vulkan::Material * material =nullptr;
|
||||||
vulkan::DescriptorSets * descriptor_sets =nullptr;
|
vulkan::DescriptorSets * descriptor_sets =nullptr;
|
||||||
|
|
||||||
vulkan::Renderable * render_obj =nullptr;
|
vulkan::Renderable * render_obj =nullptr;
|
||||||
RenderableNode * render_node =nullptr;
|
|
||||||
|
|
||||||
vulkan::Buffer * ubo_mvp =nullptr;
|
vulkan::Buffer * ubo_mvp =nullptr;
|
||||||
|
|
||||||
@ -46,7 +48,8 @@ public:
|
|||||||
|
|
||||||
~TestApp()
|
~TestApp()
|
||||||
{
|
{
|
||||||
SAFE_CLEAR(render_node);
|
SAFE_CLEAR(render_list);
|
||||||
|
SAFE_CLEAR(render_root);
|
||||||
SAFE_CLEAR(db);
|
SAFE_CLEAR(db);
|
||||||
|
|
||||||
SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count);
|
SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count);
|
||||||
@ -70,20 +73,6 @@ private:
|
|||||||
|
|
||||||
bool CreateRenderObject()
|
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;
|
struct CircleCreateInfo cci;
|
||||||
|
|
||||||
cci.center.x=SCREEN_WIDTH/2;
|
cci.center.x=SCREEN_WIDTH/2;
|
||||||
@ -136,25 +125,20 @@ private:
|
|||||||
return pipeline;
|
return pipeline;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Draw(vulkan::CommandBuffer *cb,RenderableNode *ri)
|
bool InitScene()
|
||||||
{
|
{
|
||||||
cb->Bind(ri->GetPipeline());
|
RenderableInstance *ri=db->CreateRenderableInstance(pipeline,descriptor_sets,render_obj);
|
||||||
cb->Bind(ri->GetDescriptorSets());
|
|
||||||
|
|
||||||
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)
|
return(true);
|
||||||
{
|
|
||||||
cb->DrawIndexed(ib->GetCount());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cb->Draw(obj->GetDrawCount());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InitCommandBuffer()
|
bool InitCommandBuffer()
|
||||||
@ -170,7 +154,7 @@ private:
|
|||||||
|
|
||||||
cmd_buf[i]->Begin();
|
cmd_buf[i]->Begin();
|
||||||
cmd_buf[i]->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(i));
|
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]->EndRenderPass();
|
||||||
cmd_buf[i]->End();
|
cmd_buf[i]->End();
|
||||||
}
|
}
|
||||||
@ -201,7 +185,8 @@ public:
|
|||||||
if(!InitPipeline())
|
if(!InitPipeline())
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
render_node=new RenderableNode(pipeline,descriptor_sets,render_obj);
|
if(!InitScene())
|
||||||
|
return(false);
|
||||||
|
|
||||||
if(!InitCommandBuffer())
|
if(!InitCommandBuffer())
|
||||||
return(false);
|
return(false);
|
||||||
|
@ -3,12 +3,13 @@
|
|||||||
|
|
||||||
#include<hgl/graph/vulkan/VK.h>
|
#include<hgl/graph/vulkan/VK.h>
|
||||||
#include<hgl/graph/Camera.h>
|
#include<hgl/graph/Camera.h>
|
||||||
|
#include<hgl/graph/SceneNode.h>
|
||||||
#include<hgl/type/Color4f.h>
|
#include<hgl/type/Color4f.h>
|
||||||
namespace hgl
|
namespace hgl
|
||||||
{
|
{
|
||||||
namespace graph
|
namespace graph
|
||||||
{
|
{
|
||||||
class RenderableNode;
|
class RenderableInstance;
|
||||||
|
|
||||||
struct UBOMatrixData
|
struct UBOMatrixData
|
||||||
{
|
{
|
||||||
@ -41,13 +42,14 @@ namespace hgl
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
List<RenderableNode *> renderable_node_list;
|
List<SceneNode *> scene_node_list;
|
||||||
|
|
||||||
vulkan::Pipeline * last_pipeline;
|
vulkan::Pipeline * last_pipeline;
|
||||||
vulkan::DescriptorSets *last_desc_sets;
|
vulkan::DescriptorSets *last_desc_sets;
|
||||||
vulkan::Renderable * last_renderable;
|
vulkan::Renderable * last_renderable;
|
||||||
|
|
||||||
void Render(RenderableNode *,const Matrix4f &);
|
void Render(RenderableInstance *);
|
||||||
|
void Render(List<RenderableInstance *> &);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -61,17 +63,19 @@ namespace hgl
|
|||||||
|
|
||||||
~RenderList()=default;
|
~RenderList()=default;
|
||||||
|
|
||||||
void Add (RenderableNode *node) {if(node)renderable_node_list.Add(node);}
|
void Add (SceneNode *node) {if(node)scene_node_list.Add(node);}
|
||||||
void Clear () {renderable_node_list.ClearData();}
|
void Clear () {scene_node_list.ClearData();}
|
||||||
|
|
||||||
void SetCamera(const Camera &);
|
void SetCamera(const Camera &);
|
||||||
|
void SetMVP(const Matrix4f &proj,const Matrix4f &mv);
|
||||||
|
|
||||||
void SetSkyLightColor(const Color4f &c,const Vector4f &d)
|
void SetSkyLightColor(const Color4f &c,const Vector4f &d)
|
||||||
{
|
{
|
||||||
ubo_skylight.sun_color=c;
|
ubo_skylight.sun_color=c;
|
||||||
ubo_skylight.sun_direction=d;
|
ubo_skylight.sun_direction=d;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Render();
|
bool Render(vulkan::CommandBuffer *);
|
||||||
};//class RenderList
|
};//class RenderList
|
||||||
}//namespace graph
|
}//namespace graph
|
||||||
}//namespace hgl
|
}//namespace hgl
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
#ifndef HGL_GRAPH_RENDERABLE_NODE_INCLUDE
|
#ifndef HGL_GRAPH_RENDERABLE_INSTANCE_INCLUDE
|
||||||
#define HGL_GRAPH_RENDERABLE_NODE_INCLUDE
|
#define HGL_GRAPH_RENDERABLE_INSTANCE_INCLUDE
|
||||||
|
|
||||||
#include<hgl/graph/vulkan/VKRenderable.h>
|
#include<hgl/graph/vulkan/VKRenderable.h>
|
||||||
#include<hgl/graph/vulkan/VKPipeline.h>
|
#include<hgl/graph/vulkan/VKPipeline.h>
|
||||||
#include<hgl/graph/vulkan/VKDescriptorSets.h>
|
#include<hgl/graph/vulkan/VKDescriptorSets.h>
|
||||||
#include<hgl/graph/SceneNode.h>
|
|
||||||
namespace hgl
|
namespace hgl
|
||||||
{
|
{
|
||||||
namespace graph
|
namespace graph
|
||||||
@ -12,7 +11,7 @@ namespace hgl
|
|||||||
/**
|
/**
|
||||||
* 可渲染对象节点
|
* 可渲染对象节点
|
||||||
*/
|
*/
|
||||||
class RenderableNode:public SceneNode
|
class RenderableInstance
|
||||||
{
|
{
|
||||||
vulkan::Pipeline * pipeline;
|
vulkan::Pipeline * pipeline;
|
||||||
vulkan::DescriptorSets * desc_sets;
|
vulkan::DescriptorSets * desc_sets;
|
||||||
@ -20,8 +19,8 @@ namespace hgl
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
RenderableNode(vulkan::Pipeline *p,vulkan::DescriptorSets *ds,vulkan::Renderable *r):pipeline(p),desc_sets(ds),render_obj(r){}
|
RenderableInstance(vulkan::Pipeline *p,vulkan::DescriptorSets *ds,vulkan::Renderable *r):pipeline(p),desc_sets(ds),render_obj(r){}
|
||||||
virtual ~RenderableNode()
|
virtual ~RenderableInstance()
|
||||||
{
|
{
|
||||||
//需要在这里添加删除pipeline/desc_sets/render_obj引用计数的代码
|
//需要在这里添加删除pipeline/desc_sets/render_obj引用计数的代码
|
||||||
}
|
}
|
||||||
@ -31,9 +30,7 @@ namespace hgl
|
|||||||
vulkan::Renderable * GetRenderable (){return render_obj;}
|
vulkan::Renderable * GetRenderable (){return render_obj;}
|
||||||
const AABB & GetBoundingBox ()const{return render_obj->GetBoundingBox();}
|
const AABB & GetBoundingBox ()const{return render_obj->GetBoundingBox();}
|
||||||
|
|
||||||
const bool CanRenderable ()const override{return true;} ///<是否可以渲染
|
const int Comp(const RenderableInstance *ri)const
|
||||||
|
|
||||||
const int Comp(const RenderableNode *ri)const
|
|
||||||
{
|
{
|
||||||
//绘制顺序:
|
//绘制顺序:
|
||||||
|
|
||||||
@ -72,8 +69,8 @@ namespace hgl
|
|||||||
return render_obj-ri->render_obj;
|
return render_obj-ri->render_obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
CompOperator(const RenderableNode *,Comp)
|
CompOperator(const RenderableInstance *,Comp)
|
||||||
};//class RenderableNode
|
};//class RenderableNode
|
||||||
}//namespace graph
|
}//namespace graph
|
||||||
}//namespace hgl
|
}//namespace hgl
|
||||||
#endif//HGL_GRAPH_RENDERABLE_NODE_INCLUDE
|
#endif//HGL_GRAPH_RENDERABLE_INSTANCE_INCLUDE
|
@ -7,6 +7,7 @@
|
|||||||
#include<hgl/graph/vulkan/VKRenderable.h>
|
#include<hgl/graph/vulkan/VKRenderable.h>
|
||||||
#include<hgl/graph/vulkan/VKBuffer.h>
|
#include<hgl/graph/vulkan/VKBuffer.h>
|
||||||
#include<hgl/graph/VertexBufferCreater.h>
|
#include<hgl/graph/VertexBufferCreater.h>
|
||||||
|
#include<hgl/graph/RenderableInstance.h>
|
||||||
#include<hgl/type/ResManage.h>
|
#include<hgl/type/ResManage.h>
|
||||||
namespace hgl
|
namespace hgl
|
||||||
{
|
{
|
||||||
@ -14,9 +15,10 @@ namespace hgl
|
|||||||
{
|
{
|
||||||
using MaterialID =int;
|
using MaterialID =int;
|
||||||
using PipelineID =int;
|
using PipelineID =int;
|
||||||
using DescriptorSetsID =int;
|
|
||||||
using RenderableID =int;
|
|
||||||
using BufferID =int;
|
using BufferID =int;
|
||||||
|
using DescriptorSetsID =int;
|
||||||
|
using RenderableID =int;
|
||||||
|
using RenderableInstanceID =int;
|
||||||
|
|
||||||
class VertexBufferCreater;
|
class VertexBufferCreater;
|
||||||
|
|
||||||
@ -27,22 +29,24 @@ namespace hgl
|
|||||||
{
|
{
|
||||||
vulkan::Device *device;
|
vulkan::Device *device;
|
||||||
|
|
||||||
IDResManage<MaterialID, vulkan::Material> rm_material; ///<材质合集
|
IDResManage<MaterialID, vulkan::Material> rm_material; ///<材质合集
|
||||||
IDResManage<PipelineID, vulkan::Pipeline> rm_pipeline; ///<管线合集
|
IDResManage<PipelineID, vulkan::Pipeline> rm_pipeline; ///<管线合集
|
||||||
IDResManage<DescriptorSetsID, vulkan::DescriptorSets> rm_desc_sets; ///<描述符合集
|
IDResManage<DescriptorSetsID, vulkan::DescriptorSets> rm_desc_sets; ///<描述符合集
|
||||||
IDResManage<RenderableID, vulkan::Renderable> rm_renderables; ///<可渲染对象合集
|
IDResManage<RenderableID, vulkan::Renderable> rm_renderables; ///<可渲染对象合集
|
||||||
IDResManage<BufferID, vulkan::Buffer> rm_buffers; ///<顶点缓冲区集合
|
IDResManage<BufferID, vulkan::Buffer> rm_buffers; ///<顶点缓冲区合集
|
||||||
|
IDResManage<RenderableInstanceID, RenderableInstance> rm_renderable_instances; ///<渲染实例集合集
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
SceneDB(vulkan::Device *dev):device(dev){}
|
SceneDB(vulkan::Device *dev):device(dev){}
|
||||||
virtual ~SceneDB()=default;
|
virtual ~SceneDB()=default;
|
||||||
|
|
||||||
MaterialID Add(vulkan::Material * mtl ){return rm_material.Add(mtl);}
|
MaterialID Add(vulkan::Material * mtl ){return rm_material.Add(mtl);}
|
||||||
PipelineID Add(vulkan::Pipeline * p ){return rm_pipeline.Add(p);}
|
PipelineID Add(vulkan::Pipeline * p ){return rm_pipeline.Add(p);}
|
||||||
DescriptorSetsID Add(vulkan::DescriptorSets *ds ){return rm_desc_sets.Add(ds);}
|
DescriptorSetsID Add(vulkan::DescriptorSets *ds ){return rm_desc_sets.Add(ds);}
|
||||||
RenderableID Add(vulkan::Renderable * r ){return rm_renderables.Add(r);}
|
RenderableID Add(vulkan::Renderable * r ){return rm_renderables.Add(r);}
|
||||||
BufferID Add(vulkan::Buffer * buf ){return rm_buffers.Add(buf);}
|
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,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);}
|
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
|
#undef SCENE_DB_CREATE_FUNC
|
||||||
|
|
||||||
vulkan::Material * GetMaterial (const MaterialID &id){return rm_material.Get(id);}
|
RenderableInstance * CreateRenderableInstance(vulkan::Pipeline *p,vulkan::DescriptorSets *ds,vulkan::Renderable *r);
|
||||||
vulkan::Pipeline * GetPipeline (const PipelineID &id){return rm_pipeline.Get(id);}
|
|
||||||
vulkan::DescriptorSets *GetDescSets (const DescriptorSetsID &id){return rm_desc_sets.Get(id);}
|
vulkan::Material * GetMaterial (const MaterialID &id){return rm_material.Get(id);}
|
||||||
vulkan::Renderable * GetRenderable (const RenderableID &id){return rm_renderables.Get(id);}
|
vulkan::Pipeline * GetPipeline (const PipelineID &id){return rm_pipeline.Get(id);}
|
||||||
vulkan::Buffer * GetBuffer (const BufferID &id){return rm_buffers.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
|
};//class SceneDB
|
||||||
}//namespace graph
|
}//namespace graph
|
||||||
}//namespace hgl
|
}//namespace hgl
|
||||||
|
@ -11,6 +11,7 @@ namespace hgl
|
|||||||
class SceneNode;
|
class SceneNode;
|
||||||
struct Camera;
|
struct Camera;
|
||||||
class RenderList;
|
class RenderList;
|
||||||
|
class RenderableInstance;
|
||||||
|
|
||||||
using RenderListCompFunc=float (*)(Camera *,SceneNode *,SceneNode *); ///<渲染列表排序比较函数
|
using RenderListCompFunc=float (*)(Camera *,SceneNode *,SceneNode *); ///<渲染列表排序比较函数
|
||||||
|
|
||||||
@ -40,6 +41,8 @@ namespace hgl
|
|||||||
|
|
||||||
ObjectList<SceneNode> SubNode; ///<子节点
|
ObjectList<SceneNode> SubNode; ///<子节点
|
||||||
|
|
||||||
|
List<RenderableInstance *> renderable_instances; ///<可渲染实例
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
SceneNode()=default;
|
SceneNode()=default;
|
||||||
@ -48,21 +51,11 @@ namespace hgl
|
|||||||
ClearSubNode();
|
ClearSubNode();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddSubNode(SceneNode *n){if(n)SubNode.Add(n);} ///<增加一个子节点
|
void Add(SceneNode *n){if(n)SubNode.Add(n);} ///<增加一个子节点
|
||||||
SceneNode * CreateSubNode() ///<创建一个子节点
|
void ClearSubNode(){SubNode.ClearData();} ///<清除子节点
|
||||||
{
|
|
||||||
SceneNode *sn=new SceneNode();
|
|
||||||
SubNode.Add(sn);
|
|
||||||
return sn;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClearSubNode(){SubNode.Clear();} ///<清除子节点
|
void Add(RenderableInstance *ri){if(ri)renderable_instances.Add(ri);} ///<增加渲染实例
|
||||||
|
void ClearRenderableInstance(){renderable_instances.ClearData();} ///<清除渲染实例
|
||||||
public:
|
|
||||||
|
|
||||||
virtual const bool IsCamera()const{return false;} ///<是否是摄像机
|
|
||||||
virtual const bool IsLight()const{return false;} ///<是否是灯光
|
|
||||||
virtual const bool CanRenderable()const{return false;} ///<是否可以渲染
|
|
||||||
|
|
||||||
public: //坐标相关方法
|
public: //坐标相关方法
|
||||||
|
|
||||||
@ -81,12 +74,12 @@ namespace hgl
|
|||||||
|
|
||||||
public: //渲染列表相关方法
|
public: //渲染列表相关方法
|
||||||
|
|
||||||
virtual bool ExpendToList(RenderList *,FilterSceneNodeFunc func=nullptr,void *func_data=nullptr)const; ///<展开到渲染列表
|
virtual bool ExpendToList(RenderList *,FilterSceneNodeFunc func=nullptr,void *func_data=nullptr); ///<展开到渲染列表
|
||||||
bool ExpendToList(RenderList *rl,Frustum *f)const ///<展开到渲染列表(使用平截头裁剪)
|
bool ExpendToList(RenderList *rl,Frustum *f) ///<展开到渲染列表(使用平截头裁剪)
|
||||||
{return ExpendToList(rl,FrustumClipFilter,f);}
|
{return ExpendToList(rl,FrustumClipFilter,f);}
|
||||||
|
|
||||||
// bool ExpendToList(RenderList *,const Matrix4f &,const Matrix4f &,RenderListCompFunc=nullptr)const; ///<展开到渲染列表(使用平截头裁剪并排序)
|
// bool ExpendToList(RenderList *,const Matrix4f &,const Matrix4f &,RenderListCompFunc=nullptr); ///<展开到渲染列表(使用平截头裁剪并排序)
|
||||||
bool ExpendToList(RenderList *,Camera *,RenderListCompFunc=nullptr)const; ///<展开到渲染列表(使用摄像机平截头裁剪并排序)
|
bool ExpendToList(RenderList *,Camera *,RenderListCompFunc=nullptr); ///<展开到渲染列表(使用摄像机平截头裁剪并排序)
|
||||||
};//class SceneNode
|
};//class SceneNode
|
||||||
}//namespace graph
|
}//namespace graph
|
||||||
}//namespace hgl
|
}//namespace hgl
|
||||||
|
@ -4,7 +4,8 @@
|
|||||||
${ROOT_INCLUDE_PATH}/hgl/graph/SceneDB.h
|
${ROOT_INCLUDE_PATH}/hgl/graph/SceneDB.h
|
||||||
${ROOT_INCLUDE_PATH}/hgl/graph/SceneNode.h
|
${ROOT_INCLUDE_PATH}/hgl/graph/SceneNode.h
|
||||||
${ROOT_INCLUDE_PATH}/hgl/graph/SceneOrient.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/VertexBufferCreater.h
|
||||||
${ROOT_INCLUDE_PATH}/hgl/graph/VertexBuffer.h
|
${ROOT_INCLUDE_PATH}/hgl/graph/VertexBuffer.h
|
||||||
${ROOT_INCLUDE_PATH}/hgl/graph/InlineGeometry.h)
|
${ROOT_INCLUDE_PATH}/hgl/graph/InlineGeometry.h)
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include<hgl/graph/vulkan/VKRenderable.h>
|
#include<hgl/graph/vulkan/VKRenderable.h>
|
||||||
#include<hgl/graph/vulkan/VKCommandBuffer.h>
|
#include<hgl/graph/vulkan/VKCommandBuffer.h>
|
||||||
#include<hgl/graph/VertexBuffer.h>
|
#include<hgl/graph/VertexBuffer.h>
|
||||||
#include<hgl/graph/RenderableNode.h>
|
#include<hgl/graph/RenderableInstance.h>
|
||||||
|
|
||||||
namespace hgl
|
namespace hgl
|
||||||
{
|
{
|
||||||
@ -41,7 +41,15 @@ namespace hgl
|
|||||||
&camera);
|
&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())
|
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);
|
return(false);
|
||||||
|
|
||||||
|
cmd_buf=cb;
|
||||||
|
|
||||||
last_pipeline=nullptr;
|
last_pipeline=nullptr;
|
||||||
last_desc_sets=nullptr;
|
last_desc_sets=nullptr;
|
||||||
last_renderable=nullptr;
|
last_renderable=nullptr;
|
||||||
|
|
||||||
const int count=renderable_node_list.GetCount();
|
const int count=scene_node_list.GetCount();
|
||||||
RenderableNode **node=renderable_node_list.GetData();
|
SceneNode **node=scene_node_list.GetData();
|
||||||
|
|
||||||
for(int i=0;i<count;i++)
|
for(int i=0;i<count;i++)
|
||||||
{
|
{
|
||||||
const Matrix4f fin_mv=ubo_matrix.modelview*(*node)->GetLocalToWorldMatrix();
|
Render((*node)->renderable_instances);
|
||||||
|
++node;
|
||||||
Render(*node,ubo_matrix.projection*fin_mv);
|
|
||||||
|
|
||||||
node++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return(true);
|
return(true);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include<hgl/graph/SceneDB.h>
|
#include<hgl/graph/SceneDB.h>
|
||||||
#include<hgl/graph/vulkan/VKDevice.h>
|
#include<hgl/graph/vulkan/VKDevice.h>
|
||||||
|
#include<hgl/graph/RenderableInstance.h>
|
||||||
|
|
||||||
namespace hgl
|
namespace hgl
|
||||||
{
|
{
|
||||||
@ -40,5 +41,17 @@ namespace hgl
|
|||||||
SCENE_DB_CREATE_BUFFER(INBO)
|
SCENE_DB_CREATE_BUFFER(INBO)
|
||||||
|
|
||||||
#undef SCENE_DB_CREATE_BUFFER
|
#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 graph
|
||||||
}//namespace hgl
|
}//namespace hgl
|
||||||
|
@ -62,7 +62,7 @@ namespace hgl
|
|||||||
* @param func_data 过滤函数用辅助数据
|
* @param func_data 过滤函数用辅助数据
|
||||||
* @return 成功与否
|
* @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);
|
if(!rl)return(false);
|
||||||
|
|
||||||
@ -70,17 +70,23 @@ namespace hgl
|
|||||||
if(!func(this,func_data))
|
if(!func(this,func_data))
|
||||||
return(false);
|
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);
|
return(true);
|
||||||
@ -99,7 +105,7 @@ namespace hgl
|
|||||||
* @param cam 摄像机
|
* @param cam 摄像机
|
||||||
* @param comp_func 渲染列表远近比较函数
|
* @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);
|
if(!rl||!cam)return(false);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user