From ead4ba65c1c981f939d2db0c32271b41b0594d61 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sun, 5 May 2024 15:44:51 +0800 Subject: [PATCH] moved RenderResource to PrimitiveCreater::Finish() --- inc/hgl/graph/PrimitiveCreater.h | 5 ++- inc/hgl/graph/VKPrimitive.h | 4 +-- src/SceneGraph/InlineGeometry.cpp | 52 ++++++++++++++-------------- src/SceneGraph/PrimitiveCreater.cpp | 53 +++++++++++++++++------------ 4 files changed, 61 insertions(+), 53 deletions(-) diff --git a/inc/hgl/graph/PrimitiveCreater.h b/inc/hgl/graph/PrimitiveCreater.h index 13d7af73..2837687a 100644 --- a/inc/hgl/graph/PrimitiveCreater.h +++ b/inc/hgl/graph/PrimitiveCreater.h @@ -19,7 +19,6 @@ protected: const GPUPhysicalDevice *phy_device; VertexDataManager *vdm; - RenderResource *db; const VIL *vil; @@ -40,7 +39,7 @@ protected: public: - PrimitiveCreater(RenderResource *sdb,const VIL *); + PrimitiveCreater(GPUDevice *,const VIL *); PrimitiveCreater(VertexDataManager *); virtual ~PrimitiveCreater(); @@ -88,6 +87,6 @@ public: return(true); } - virtual Primitive * Finish(const AnsiString &); ///<结束并创建可渲染对象 + virtual Primitive * Finish(RenderResource *,const AnsiString &); ///<结束并创建可渲染对象 };//class PrimitiveCreater VK_NAMESPACE_END \ No newline at end of file diff --git a/inc/hgl/graph/VKPrimitive.h b/inc/hgl/graph/VKPrimitive.h index 567b9c1b..bd7534ca 100644 --- a/inc/hgl/graph/VKPrimitive.h +++ b/inc/hgl/graph/VKPrimitive.h @@ -1,5 +1,4 @@ -#ifndef HGL_GRAPH_VULKAN_PRIMITIVE_INCLUDE -#define HGL_GRAPH_VULKAN_PRIMITIVE_INCLUDE +#pragma once #include #include @@ -58,4 +57,3 @@ public: const AABB & GetBoundingBox ()const{return BoundingBox;} };//class Primitive VK_NAMESPACE_END -#endif//HGL_GRAPH_VULKAN_PRIMITIVE_INCLUDE diff --git a/src/SceneGraph/InlineGeometry.cpp b/src/SceneGraph/InlineGeometry.cpp index e59c82c9..b6475a42 100644 --- a/src/SceneGraph/InlineGeometry.cpp +++ b/src/SceneGraph/InlineGeometry.cpp @@ -16,7 +16,7 @@ namespace hgl { Primitive *CreateRectangle(RenderResource *db,const VIL *vil,const RectangleCreateInfo *rci) { - PrimitiveCreater rc(db,vil); + PrimitiveCreater rc(db->GetDevice(),vil); if(!rc.Init(4,0)) return(nullptr); @@ -28,7 +28,7 @@ namespace hgl vertex->WriteRectFan(rci->scope); - return rc.Finish("Rectangle"); + return rc.Finish(db,"Rectangle"); } Primitive *CreateGBufferCompositionRectangle(RenderResource *db,const VIL *vil) @@ -42,7 +42,7 @@ namespace hgl Primitive *CreateRoundRectangle(RenderResource *db,const VIL *vil,const RoundRectangleCreateInfo *rci) { - PrimitiveCreater rc(db,vil); + PrimitiveCreater rc(db->GetDevice(),vil); if(rci->radius==0||rci->round_per<=1) //这是要画矩形 { @@ -111,12 +111,12 @@ namespace hgl delete[] coord; } - return rc.Finish("RoundRectangle"); + return rc.Finish(db,"RoundRectangle"); } Primitive *CreateCircle(RenderResource *db,const VIL *vil,const CircleCreateInfo *cci) { - PrimitiveCreater rc(db,vil); + PrimitiveCreater rc(db->GetDevice(),vil); uint edge; @@ -159,12 +159,12 @@ namespace hgl color->Write(cci->border_color); } - return rc.Finish("Circle"); + return rc.Finish(db,"Circle"); } Primitive *CreatePlaneGrid(RenderResource *db,const VIL *vil,const PlaneGridCreateInfo *pgci) { - PrimitiveCreater rc(db,vil); + PrimitiveCreater rc(db->GetDevice(),vil); if(!rc.Init(((pgci->grid_size.Width()+1)+(pgci->grid_size.Height()+1))*2,0)) return(nullptr); @@ -209,7 +209,7 @@ namespace hgl } } - return rc.Finish("PlaneGrid"); + return rc.Finish(db,"PlaneGrid"); } Primitive *CreatePlane(RenderResource *db,const VIL *vil) @@ -219,7 +219,7 @@ namespace hgl const Vector3f xy_normal(0.0f,0.0f,1.0f); const Vector3f xy_tangent(1.0f,0.0f,0.0f); - PrimitiveCreater rc(db,vil); + PrimitiveCreater rc(db->GetDevice(),vil); if(!rc.Init(4,8)) return(nullptr); @@ -245,7 +245,7 @@ namespace hgl tex_coord->Write(xy_tex_coord,4); } - return rc.Finish("Plane"); + return rc.Finish(db,"Plane"); } Primitive *CreateCube(RenderResource *db,const VIL *vil,const CubeCreateInfo *cci) @@ -301,7 +301,7 @@ namespace hgl 16, 17, 18, 16, 18, 19, 20, 23, 22, 20, 22, 21}; - PrimitiveCreater rc(db,vil); + PrimitiveCreater rc(db->GetDevice(),vil); if(!rc.Init(24,6*2*3,IndexType::U16)) return(nullptr); @@ -343,7 +343,7 @@ namespace hgl //rc.CreateIBO16(6*2*3,indices); rc.WriteIBO(indices); - return rc.Finish("Cube"); + return rc.Finish(db,"Cube"); } template void CreateSphereIndices(T *tp,uint numberParallels,const uint numberSlices) @@ -443,7 +443,7 @@ namespace hgl */ Primitive *CreateSphere(RenderResource *db,const VIL *vil,const uint numberSlices) { - PrimitiveCreater rc(db,vil); + PrimitiveCreater rc(db->GetDevice(),vil); uint numberParallels = (numberSlices+1) / 2; uint numberVertices = (numberParallels + 1) * (numberSlices + 1); @@ -519,12 +519,12 @@ namespace hgl return(nullptr); } - return rc.Finish("Sphere"); + return rc.Finish(db,"Sphere"); } Primitive *CreateDome(RenderResource *db,const VIL *vil,const uint numberSlices) { - PrimitiveCreater rc(db,vil); + PrimitiveCreater rc(db->GetDevice(),vil); uint i, j; @@ -610,7 +610,7 @@ namespace hgl return(nullptr); } - return rc.Finish("Dome"); + return rc.Finish(db,"Dome"); } namespace @@ -650,7 +650,7 @@ namespace hgl Primitive *CreateTorus(RenderResource *db,const VIL *vil,const TorusCreateInfo *tci) { - PrimitiveCreater rc(db,vil); + PrimitiveCreater rc(db->GetDevice(),vil); // s, t = parametric values of the equations, in the range [0,1] float s = 0; @@ -755,7 +755,7 @@ namespace hgl if(index_type==IndexType::U8 )CreateTorusIndices(rc.AccessIBO(),tci->numberSlices,tci->numberStacks);else return(nullptr); } - return rc.Finish("Torus"); + return rc.Finish(db,"Torus"); } namespace @@ -815,7 +815,7 @@ namespace hgl if(numberIndices<=0) return(nullptr); - PrimitiveCreater rc(db,vil); + PrimitiveCreater rc(db->GetDevice(),vil); uint numberVertices = (cci->numberSlices + 2) * 2 + (cci->numberSlices + 1) * 2; @@ -989,7 +989,7 @@ namespace hgl return(nullptr); } - return rc.Finish("Cylinder"); + return rc.Finish(db,"Cylinder"); } namespace @@ -1034,7 +1034,7 @@ namespace hgl Primitive *CreateCone(RenderResource *db,const VIL *vil,const ConeCreateInfo *cci) { - PrimitiveCreater rc(db,vil); + PrimitiveCreater rc(db->GetDevice(),vil); uint i, j; @@ -1160,14 +1160,14 @@ namespace hgl return(nullptr); } - return rc.Finish("Cone"); + return rc.Finish(db,"Cone"); } Primitive *CreateAxis(RenderResource *db,const VIL *vil,const AxisCreateInfo *aci) { if(!db||!vil||!aci)return(nullptr); - PrimitiveCreater rc(db,vil); + PrimitiveCreater rc(db->GetDevice(),vil); if(!rc.Init(6,0)) return(nullptr); @@ -1187,7 +1187,7 @@ namespace hgl vertex->Write(0,0,0);color->Write(aci->color[2]); vertex->Write(0,0,s);color->Write(aci->color[2]); - return rc.Finish("Axis"); + return rc.Finish(db,"Axis"); } Primitive *CreateBoundingBox(RenderResource *db,const VIL *vil,const BoundingBoxCreateInfo *cci) @@ -1212,7 +1212,7 @@ namespace hgl 0,4, 1,5, 2,6, 3,7 }; - PrimitiveCreater rc(db,vil); + PrimitiveCreater rc(db->GetDevice(),vil); if(!rc.Init(8,24,IndexType::U16)) return(nullptr); @@ -1241,7 +1241,7 @@ namespace hgl rc.WriteIBO(indices); - return rc.Finish("BoundingBox"); + return rc.Finish(db,"BoundingBox"); } }//namespace inline_geometry }//namespace graph diff --git a/src/SceneGraph/PrimitiveCreater.cpp b/src/SceneGraph/PrimitiveCreater.cpp index 26f90e38..bbf6dda3 100644 --- a/src/SceneGraph/PrimitiveCreater.cpp +++ b/src/SceneGraph/PrimitiveCreater.cpp @@ -5,13 +5,12 @@ #include VK_NAMESPACE_BEGIN -PrimitiveCreater::PrimitiveCreater(RenderResource *sdb,const VIL *v) +PrimitiveCreater::PrimitiveCreater(GPUDevice *dev,const VIL *v) { - device =sdb->GetDevice(); + device =dev; phy_device =device->GetPhysicalDevice(); vdm =nullptr; - db =sdb; vil =v; vertices_number =0; @@ -26,7 +25,6 @@ PrimitiveCreater::PrimitiveCreater(VertexDataManager *_vdm) phy_device =device->GetPhysicalDevice(); vdm =_vdm; - db =nullptr; vil =vdm->GetVIL(); vertices_number =0; @@ -73,7 +71,7 @@ bool PrimitiveCreater::Init(const uint32 vertex_count,const uint32 index_count,I } ibo=device->CreateIBO(it,index_count); - //ibo=db->CreateIBO(it,index_count); + if(!ibo)return(false); } @@ -97,7 +95,7 @@ bool PrimitiveCreater::AcquirePVB(VABAccess *vad,const AnsiString &name,const vo if(vab_map.Get(name,*vad)) return true; - vad->vab =db->CreateVAB(vif->format,vertices_number,data); + vad->vab =device->CreateVAB(vif->format,vertices_number,data); if(!data) vad->map_ptr=vad->vab->Map(); @@ -154,32 +152,45 @@ void PrimitiveCreater::ClearAllData() } } -Primitive *PrimitiveCreater::Finish(const AnsiString &prim_name) +Primitive *PrimitiveCreater::Finish(RenderResource *rr,const AnsiString &prim_name) { const uint si_count=vil->GetCount(VertexInputGroup::Basic); if(vab_map.GetCount()!=si_count) return(nullptr); - Primitive *primitive=db->CreatePrimitive(prim_name,vertices_number); + Primitive *primitive=rr->CreatePrimitive(prim_name,vertices_number); - const auto *sp=vab_map.GetDataList(); - for(uint i=0;ivalue.vab) + const auto *sp=vab_map.GetDataList(); + for(uint i=0;ivalue.map_ptr) - (*sp)->value.vab->Unmap(); + if((*sp)->value.vab) + { + if((*sp)->value.map_ptr) + (*sp)->value.vab->Unmap(); - primitive->SetVAB((*sp)->key,(*sp)->value.vab); + primitive->SetVAB((*sp)->key,(*sp)->value.vab); + } + else + { + ClearAllData(); + return(nullptr); + } + + ++sp; } - else + } + + { + const auto *sp=vab_map.GetDataList(); + for(uint i=0;ivalue.vab) + rr->Add((*sp)->value.vab); - ++sp; + ++sp; + } } if(ibo) @@ -187,11 +198,11 @@ Primitive *PrimitiveCreater::Finish(const AnsiString &prim_name) ibo->Unmap(); primitive->SetIndex(ibo,0,index_number); - db->Add(ibo); + rr->Add(ibo); ibo=nullptr; //避免释构函数删除 } - db->Add(primitive); + rr->Add(primitive); return primitive; }