From 8cdf88e2fdb2ec641bb6c0ff7c08dc58ed725883 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Tue, 28 May 2024 23:33:15 +0800 Subject: [PATCH] added VDM in Primitive/Renderable/PrimitiveDataBuffer --- inc/hgl/graph/VKPrimitive.h | 2 ++ inc/hgl/graph/VKRenderable.h | 4 +++- src/SceneGraph/Vulkan/VKPrimitive.cpp | 5 +++++ src/SceneGraph/Vulkan/VKPrimitiveData.cpp | 5 +++++ src/SceneGraph/Vulkan/VKPrimitiveData.h | 2 ++ src/SceneGraph/Vulkan/VKRenderable.cpp | 6 ++++-- 6 files changed, 21 insertions(+), 3 deletions(-) diff --git a/inc/hgl/graph/VKPrimitive.h b/inc/hgl/graph/VKPrimitive.h index 2f72e730..3f2527cd 100644 --- a/inc/hgl/graph/VKPrimitive.h +++ b/inc/hgl/graph/VKPrimitive.h @@ -42,6 +42,8 @@ public: IndexBuffer * GetIBO (); const uint32_t GetFirstIndex ()const; ///<取得第一个索引 + VertexDataManager * GetVDM (); ///<取得顶点数据管理器 + const AABB & GetBoundingBox ()const{return BoundingBox;} };//class Primitive VK_NAMESPACE_END diff --git a/inc/hgl/graph/VKRenderable.h b/inc/hgl/graph/VKRenderable.h index 66e7c078..ffa3ccc8 100644 --- a/inc/hgl/graph/VKRenderable.h +++ b/inc/hgl/graph/VKRenderable.h @@ -29,9 +29,11 @@ struct PrimitiveDataBuffer IndexBuffer * ibo; + VertexDataManager *vdm; //只是用来区分和比较的,不实际使用 + public: - PrimitiveDataBuffer(const uint32_t,IndexBuffer *); + PrimitiveDataBuffer(const uint32_t,IndexBuffer *,VertexDataManager *_v=nullptr); ~PrimitiveDataBuffer(); const bool Comp(const PrimitiveDataBuffer *pdb)const; diff --git a/src/SceneGraph/Vulkan/VKPrimitive.cpp b/src/SceneGraph/Vulkan/VKPrimitive.cpp index 490fa2aa..c2462bc7 100644 --- a/src/SceneGraph/Vulkan/VKPrimitive.cpp +++ b/src/SceneGraph/Vulkan/VKPrimitive.cpp @@ -80,4 +80,9 @@ const uint32_t Primitive::GetFirstIndex()const { return prim_data->GetFirstIndex(); } + +VertexDataManager *Primitive::GetVDM() +{ + return prim_data->GetVDM(); +} VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKPrimitiveData.cpp b/src/SceneGraph/Vulkan/VKPrimitiveData.cpp index ab95081f..c0e401b6 100644 --- a/src/SceneGraph/Vulkan/VKPrimitiveData.cpp +++ b/src/SceneGraph/Vulkan/VKPrimitiveData.cpp @@ -56,6 +56,8 @@ namespace int32_t GetVertexOffset ()const override{return 0;} uint32_t GetFirstIndex ()const override{return 0;} + VertexDataManager * GetVDM()const override{return nullptr;} ///<取得顶点数据管理器 + public: PrimitiveDataPrivateBuffer(GPUDevice *dev,const VIL *_vil,const uint32_t vc):PrimitiveData(_vil,vc) @@ -141,6 +143,9 @@ namespace int32_t GetVertexOffset()const override { return vab_node->GetStart(); } uint32_t GetFirstIndex ()const override { return ib_node->GetStart(); } + VertexDataManager * GetVDM()const override{return vdm;} ///<取得顶点数据管理器 + + public: PrimitiveDataVDM(VertexDataManager *_vdm,const uint32_t vc):PrimitiveData(_vdm->GetVIL(),vc) { diff --git a/src/SceneGraph/Vulkan/VKPrimitiveData.h b/src/SceneGraph/Vulkan/VKPrimitiveData.h index 9b7b15d5..b9f91c26 100644 --- a/src/SceneGraph/Vulkan/VKPrimitiveData.h +++ b/src/SceneGraph/Vulkan/VKPrimitiveData.h @@ -46,6 +46,8 @@ public: virtual int32_t GetVertexOffset ()const=0; ///<取得顶点偏移(注意是顶点不是字节) virtual uint32_t GetFirstIndex ()const=0; ///<取得第一个索引 + virtual VertexDataManager * GetVDM()const=0; ///<取得顶点数据管理器 + public: virtual IndexBuffer * InitIBO(const uint32_t index_count,IndexType it)=0; diff --git a/src/SceneGraph/Vulkan/VKRenderable.cpp b/src/SceneGraph/Vulkan/VKRenderable.cpp index 98068eab..249de445 100644 --- a/src/SceneGraph/Vulkan/VKRenderable.cpp +++ b/src/SceneGraph/Vulkan/VKRenderable.cpp @@ -7,12 +7,14 @@ #include VK_NAMESPACE_BEGIN -PrimitiveDataBuffer::PrimitiveDataBuffer(const uint32_t c,IndexBuffer *ib) +PrimitiveDataBuffer::PrimitiveDataBuffer(const uint32_t c,IndexBuffer *ib,VertexDataManager *_vdm) { vab_count=c; vab_list=hgl_zero_new(vab_count); ibo=ib; + + vdm=_vdm; } PrimitiveDataBuffer::~PrimitiveDataBuffer() @@ -62,7 +64,7 @@ Renderable *CreateRenderable(Primitive *prim,MaterialInstance *mi,Pipeline *p) return(nullptr); } - PrimitiveDataBuffer *pdb=new PrimitiveDataBuffer(input_count,prim->GetIBO()); + PrimitiveDataBuffer *pdb=new PrimitiveDataBuffer(input_count,prim->GetIBO(),prim->GetVDM()); PrimitiveRenderData *prd=new PrimitiveRenderData(prim->GetVertexCount(),prim->GetIndexCount(),prim->GetVertexOffset(),prim->GetFirstIndex()); const VertexInputFormat *vif=vil->GetVIFList(VertexInputGroup::Basic);