From 6de3cf789aa4a2d26044d9bdf480b53f3ebffbbb Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sat, 25 May 2024 01:48:15 +0800 Subject: [PATCH] upgraded InlineGeometry, removed RenderResource::CreatePrimitive. --- .../LightBasic/BlinnPhongDirectionLight.cpp | 16 ++-- inc/hgl/graph/InlineGeometry.h | 28 +++--- inc/hgl/graph/VKRenderResource.h | 5 +- res | 2 +- src/SceneGraph/InlineGeometry.cpp | 85 +++++++++---------- src/SceneGraph/Vulkan/VKRenderResource.cpp | 30 ------- 6 files changed, 66 insertions(+), 100 deletions(-) diff --git a/example/LightBasic/BlinnPhongDirectionLight.cpp b/example/LightBasic/BlinnPhongDirectionLight.cpp index ee30db0e..92d13e2f 100644 --- a/example/LightBasic/BlinnPhongDirectionLight.cpp +++ b/example/LightBasic/BlinnPhongDirectionLight.cpp @@ -40,7 +40,7 @@ private: //plane grid Material * mtl_vertex_lum =nullptr; MaterialInstance * mi_plane_grid =nullptr; Pipeline * p_line =nullptr; - Primitive * prim_plane_grid =nullptr; + AutoDelete prim_plane_grid =nullptr; private: @@ -54,9 +54,9 @@ private: //sphere MaterialInstance * mi_blinnphong[4]{}; Pipeline * p_blinnphong =nullptr; - Primitive * prim_sphere =nullptr; - Primitive * prim_cone =nullptr; - Primitive * prim_cylinder =nullptr; + AutoDelete prim_sphere =nullptr; + AutoDelete prim_cone =nullptr; + AutoDelete prim_cylinder =nullptr; private: @@ -135,11 +135,11 @@ private: pgci.lum=0.5; pgci.sub_lum=0.75; - prim_plane_grid=CreatePlaneGrid(db,mtl_vertex_lum->GetDefaultVIL(),&pgci); + prim_plane_grid=CreatePlaneGrid(device,mtl_vertex_lum->GetDefaultVIL(),&pgci); } //Sphere - prim_sphere=CreateSphere(db,mi_blinnphong[0]->GetVIL(),16); + prim_sphere=CreateSphere(device,mi_blinnphong[0]->GetVIL(),16); //Cone { @@ -150,7 +150,7 @@ private: cci.numberSlices=16; //圆锥底部分割数 cci.numberStacks=8; //圆锥高度分割数 - prim_cone=CreateCone(db,mi_blinnphong[1]->GetVIL(),&cci); + prim_cone=CreateCone(device,mi_blinnphong[1]->GetVIL(),&cci); } //Cyliner @@ -161,7 +161,7 @@ private: cci.numberSlices=16; //圆柱底部分割数 cci.radius =0.25f; //圆柱半径 - prim_cylinder=CreateCylinder(db,mi_blinnphong[2]->GetVIL(),&cci); + prim_cylinder=CreateCylinder(device,mi_blinnphong[2]->GetVIL(),&cci); } return(true); diff --git a/inc/hgl/graph/InlineGeometry.h b/inc/hgl/graph/InlineGeometry.h index f52cebb7..edec354b 100644 --- a/inc/hgl/graph/InlineGeometry.h +++ b/inc/hgl/graph/InlineGeometry.h @@ -21,12 +21,12 @@ namespace hgl RectScope2f scope; };//struct RectangleCreateInfo - Primitive *CreateRectangle(RenderResource *db,const VIL *vil,const RectangleCreateInfo *rci); + Primitive *CreateRectangle(GPUDevice *device,const VIL *vil,const RectangleCreateInfo *rci); /** * 创建延迟渲染用全屏平面 */ - Primitive *CreateGBufferCompositionRectangle(RenderResource *db,const VIL *vil); + Primitive *CreateGBufferCompositionRectangle(GPUDevice *device,const VIL *vil); /** * 圆角矩形创建信息(扇形/线圈) @@ -37,7 +37,7 @@ namespace hgl uint32_t round_per; ///<圆角精度 };//struct RoundRectangleCreateInfo:public RectangleCreateInfo - Primitive *CreateRoundRectangle(RenderResource *db,const VIL *vil,const RoundRectangleCreateInfo *rci); + Primitive *CreateRoundRectangle(GPUDevice *device,const VIL *vil,const RoundRectangleCreateInfo *rci); /** * 圆形创建信息 @@ -57,7 +57,7 @@ namespace hgl /** * 创建一个2D圆形(扇形/线圈) */ - Primitive *CreateCircle(RenderResource *db,const VIL *vil,const CircleCreateInfo *cci); + Primitive *CreateCircle(GPUDevice *device,const VIL *vil,const CircleCreateInfo *cci); /** * 平面网格创建信息
@@ -76,12 +76,12 @@ namespace hgl /** * 创建一个平面网格(线条) */ - Primitive *CreatePlaneGrid(RenderResource *db,const VIL *vil,const PlaneGridCreateInfo *pgci); + Primitive *CreatePlaneGrid(GPUDevice *device,const VIL *vil,const PlaneGridCreateInfo *pgci); /** * 创建一个平面(三角形) */ - Primitive *CreatePlane(RenderResource *db,const VIL *vil); + Primitive *CreatePlane(GPUDevice *device,const VIL *vil); struct CubeCreateInfo { @@ -117,7 +117,7 @@ namespace hgl /** * 创建一个立方体(三角形) */ - Primitive *CreateCube(RenderResource *db,const VIL *vil,const CubeCreateInfo *cci); + Primitive *CreateCube(GPUDevice *device,const VIL *vil,const CubeCreateInfo *cci); struct BoundingBoxCreateInfo { @@ -148,17 +148,17 @@ namespace hgl /** * 创建一个绑定盒(线条) */ - Primitive *CreateBoundingBox(RenderResource *db,const VIL *vil,const BoundingBoxCreateInfo *cci); + Primitive *CreateBoundingBox(GPUDevice *device,const VIL *vil,const BoundingBoxCreateInfo *cci); /** * 创建一个球心坐标为0,0,0,半径为1的球体(三角形) */ - Primitive *CreateSphere(RenderResource *db,const VIL *vil,const uint numberSlices); + Primitive *CreateSphere(GPUDevice *device,const VIL *vil,const uint numberSlices); /** * 创建一个穹顶(三角形) */ - Primitive *CreateDome(RenderResource *db,const VIL *vil, const uint numberSlices); + Primitive *CreateDome(GPUDevice *device,const VIL *vil, const uint numberSlices); struct TorusCreateInfo { @@ -174,7 +174,7 @@ namespace hgl /** * 创建一个圆环(三角形) */ - Primitive *CreateTorus(RenderResource *db,const VIL *vil,const TorusCreateInfo *tci); + Primitive *CreateTorus(GPUDevice *device,const VIL *vil,const TorusCreateInfo *tci); struct CylinderCreateInfo { @@ -186,7 +186,7 @@ namespace hgl /** * 创建一个圆柱(三角形) */ - Primitive *CreateCylinder(RenderResource *db,const VIL *vil,const CylinderCreateInfo *cci); + Primitive *CreateCylinder(GPUDevice *device,const VIL *vil,const CylinderCreateInfo *cci); struct ConeCreateInfo { @@ -199,7 +199,7 @@ namespace hgl /** * 创建一个圆锥(三角形) */ - Primitive *CreateCone(RenderResource *db,const VIL *vil,const ConeCreateInfo *cci); + Primitive *CreateCone(GPUDevice *device,const VIL *vil,const ConeCreateInfo *cci); struct AxisCreateInfo { @@ -220,7 +220,7 @@ namespace hgl /** * 创建一个坐标线(线条) */ - Primitive *CreateAxis(RenderResource *db,const VIL *vil,const AxisCreateInfo *aci); + Primitive *CreateAxis(GPUDevice *device,const VIL *vil,const AxisCreateInfo *aci); }//namespace inline_geometry }//namespace graph };//namespace hgl diff --git a/inc/hgl/graph/VKRenderResource.h b/inc/hgl/graph/VKRenderResource.h index 4f899bc3..c45e4bba 100644 --- a/inc/hgl/graph/VKRenderResource.h +++ b/inc/hgl/graph/VKRenderResource.h @@ -92,7 +92,7 @@ public: {} virtual ~RenderResource()=default; -public: //Add +public: //添加数据到管理器(如果指针为nullptr会返回-1) MaterialID Add(Material * mtl ){return rm_material.Add(mtl);} MaterialInstanceID Add(MaterialInstance * mi ){return rm_material_instance.Add(mi);} @@ -147,9 +147,6 @@ public: //Material MaterialInstance * CreateMaterialInstance(const mtl::MaterialCreateInfo *,const VILConfig *vil_cfg=nullptr); - Primitive * CreatePrimitive( const AnsiString &,PrimitiveData *); - Primitive * CreatePrimitive(VertexDataManager *,const AnsiString &,PrimitiveData *); - Renderable * CreateRenderable(Primitive *r,MaterialInstance *mi,Pipeline *p); Sampler * CreateSampler(VkSamplerCreateInfo *sci=nullptr); diff --git a/res b/res index 008dbd53..5e5814c1 160000 --- a/res +++ b/res @@ -1 +1 @@ -Subproject commit 008dbd5353e6afe7add287333cbda1b5c5fffdec +Subproject commit 5e5814c15e936fd6e865c344b98f5ce79f364079 diff --git a/src/SceneGraph/InlineGeometry.cpp b/src/SceneGraph/InlineGeometry.cpp index bc60b030..b0197be0 100644 --- a/src/SceneGraph/InlineGeometry.cpp +++ b/src/SceneGraph/InlineGeometry.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include namespace hgl @@ -14,9 +13,9 @@ namespace hgl { namespace inline_geometry { - Primitive *CreateRectangle(RenderResource *db,const VIL *vil,const RectangleCreateInfo *rci) + Primitive *CreateRectangle(GPUDevice *device,const VIL *vil,const RectangleCreateInfo *rci) { - PrimitiveCreater rc(db->GetDevice(),vil,"Rectangle"); + PrimitiveCreater rc(device,vil,"Rectangle"); if(!rc.Init(4,0)) return(nullptr); @@ -28,21 +27,21 @@ namespace hgl vertex->WriteRectFan(rci->scope); - return rc.Finish(db); + return rc.Create(); } - Primitive *CreateGBufferCompositionRectangle(RenderResource *db,const VIL *vil) + Primitive *CreateGBufferCompositionRectangle(GPUDevice *device,const VIL *vil) { RectangleCreateInfo rci; rci.scope.Set(-1,-1,2,2); - return CreateRectangle(db,vil,&rci); + return CreateRectangle(device,vil,&rci); } - Primitive *CreateRoundRectangle(RenderResource *db,const VIL *vil,const RoundRectangleCreateInfo *rci) + Primitive *CreateRoundRectangle(GPUDevice *device,const VIL *vil,const RoundRectangleCreateInfo *rci) { - PrimitiveCreater rc(db->GetDevice(),vil,"RoundRectangle"); + PrimitiveCreater rc(device,vil,"RoundRectangle"); if(rci->radius==0||rci->round_per<=1) //这是要画矩形 { @@ -111,12 +110,12 @@ namespace hgl delete[] coord; } - return rc.Finish(db); + return rc.Create(); } - Primitive *CreateCircle(RenderResource *db,const VIL *vil,const CircleCreateInfo *cci) + Primitive *CreateCircle(GPUDevice *device,const VIL *vil,const CircleCreateInfo *cci) { - PrimitiveCreater rc(db->GetDevice(),vil,"Circle"); + PrimitiveCreater rc(device,vil,"Circle"); uint edge; @@ -159,12 +158,12 @@ namespace hgl color->Write(cci->border_color); } - return rc.Finish(db); + return rc.Create(); } - Primitive *CreatePlaneGrid(RenderResource *db,const VIL *vil,const PlaneGridCreateInfo *pgci) + Primitive *CreatePlaneGrid(GPUDevice *device,const VIL *vil,const PlaneGridCreateInfo *pgci) { - PrimitiveCreater rc(db->GetDevice(),vil,"PlaneGrid"); + PrimitiveCreater rc(device,vil,"PlaneGrid"); if(!rc.Init(((pgci->grid_size.Width()+1)+(pgci->grid_size.Height()+1))*2,0)) return(nullptr); @@ -210,17 +209,17 @@ namespace hgl } } - return rc.Finish(db); + return rc.Create(); } - Primitive *CreatePlane(RenderResource *db,const VIL *vil) + Primitive *CreatePlane(GPUDevice *device,const VIL *vil) { const float xy_vertices [] = { -0.5f,-0.5f,0.0f, +0.5f,-0.5f,0.0f, +0.5f,+0.5f,0.0f, -0.5f,+0.5f,0.0f }; float xy_tex_coord[] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; const Vector3f xy_normal(0.0f,0.0f,1.0f); const Vector3f xy_tangent(1.0f,0.0f,0.0f); - PrimitiveCreater rc(db->GetDevice(),vil,"Plane"); + PrimitiveCreater rc(device,vil,"Plane"); if(!rc.Init(4,8)) return(nullptr); @@ -249,10 +248,10 @@ namespace hgl tex_coord->Write(xy_tex_coord,4); } - return rc.Finish(db); + return rc.Create(); } - Primitive *CreateCube(RenderResource *db,const VIL *vil,const CubeCreateInfo *cci) + Primitive *CreateCube(GPUDevice *device,const VIL *vil,const CubeCreateInfo *cci) { /** * 4 5 @@ -305,7 +304,7 @@ namespace hgl 16, 17, 18, 16, 18, 19, 20, 23, 22, 20, 22, 21}; - PrimitiveCreater rc(db->GetDevice(),vil,"Cube"); + PrimitiveCreater rc(device,vil,"Cube"); if(!rc.Init(24,6*2*3,IndexType::U16)) return(nullptr); @@ -351,7 +350,7 @@ namespace hgl //rc.CreateIBO16(6*2*3,indices); rc.WriteIBO(indices); - return rc.Finish(db); + return rc.Create(); } template @@ -453,9 +452,9 @@ namespace hgl * @param numberSlices 切片数 * @return 可渲染数据 */ - Primitive *CreateSphere(RenderResource *db,const VIL *vil,const uint numberSlices) + Primitive *CreateSphere(GPUDevice *device,const VIL *vil,const uint numberSlices) { - PrimitiveCreater rc(db->GetDevice(),vil,"Sphere"); + PrimitiveCreater rc(device,vil,"Sphere"); uint numberParallels = (numberSlices+1) / 2; uint numberVertices = (numberParallels + 1) * (numberSlices + 1); @@ -534,12 +533,12 @@ namespace hgl return(nullptr); } - return rc.Finish(db); + return rc.Create(); } - Primitive *CreateDome(RenderResource *db,const VIL *vil,const uint numberSlices) + Primitive *CreateDome(GPUDevice *device,const VIL *vil,const uint numberSlices) { - PrimitiveCreater rc(db->GetDevice(),vil,"Dome"); + PrimitiveCreater rc(device,vil,"Dome"); uint i, j; @@ -628,7 +627,7 @@ namespace hgl return(nullptr); } - return rc.Finish(db); + return rc.Create(); } namespace @@ -669,9 +668,9 @@ namespace hgl } }//namespace - Primitive *CreateTorus(RenderResource *db,const VIL *vil,const TorusCreateInfo *tci) + Primitive *CreateTorus(GPUDevice *device,const VIL *vil,const TorusCreateInfo *tci) { - PrimitiveCreater rc(db->GetDevice(),vil,"Torus"); + PrimitiveCreater rc(device,vil,"Torus"); // s, t = parametric values of the equations, in the range [0,1] float s = 0; @@ -779,7 +778,7 @@ namespace hgl if(index_type==IndexType::U8 )CreateTorusIndices(&rc,tci->numberSlices,tci->numberStacks);else return(nullptr); } - return rc.Finish(db); + return rc.Create(); } namespace @@ -834,14 +833,14 @@ namespace hgl } }//namespace - Primitive *CreateCylinder(RenderResource *db,const VIL *vil,const CylinderCreateInfo *cci) + Primitive *CreateCylinder(GPUDevice *device,const VIL *vil,const CylinderCreateInfo *cci) { uint numberIndices = cci->numberSlices * 3 * 2 + cci->numberSlices * 6; if(numberIndices<=0) return(nullptr); - PrimitiveCreater rc(db->GetDevice(),vil,"Cylinder"); + PrimitiveCreater rc(device,vil,"Cylinder"); uint numberVertices = (cci->numberSlices + 2) * 2 + (cci->numberSlices + 1) * 2; @@ -1018,7 +1017,7 @@ namespace hgl return(nullptr); } - return rc.Finish(db); + return rc.Create(); } namespace @@ -1064,9 +1063,9 @@ namespace hgl } }//namespace - Primitive *CreateCone(RenderResource *db,const VIL *vil,const ConeCreateInfo *cci) + Primitive *CreateCone(GPUDevice *device,const VIL *vil,const ConeCreateInfo *cci) { - PrimitiveCreater rc(db->GetDevice(),vil,"Cone"); + PrimitiveCreater rc(device,vil,"Cone"); uint i, j; @@ -1195,14 +1194,14 @@ namespace hgl return(nullptr); } - return rc.Finish(db); + return rc.Create(); } - Primitive *CreateAxis(RenderResource *db,const VIL *vil,const AxisCreateInfo *aci) + Primitive *CreateAxis(GPUDevice *device,const VIL *vil,const AxisCreateInfo *aci) { - if(!db||!vil||!aci)return(nullptr); + if(!device||!vil||!aci)return(nullptr); - PrimitiveCreater rc(db->GetDevice(),vil,"Axis"); + PrimitiveCreater rc(device,vil,"Axis"); if(!rc.Init(6,0)) return(nullptr); @@ -1222,10 +1221,10 @@ 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(db); + return rc.Create(); } - Primitive *CreateBoundingBox(RenderResource *db,const VIL *vil,const BoundingBoxCreateInfo *cci) + Primitive *CreateBoundingBox(GPUDevice *device,const VIL *vil,const BoundingBoxCreateInfo *cci) { // Points of a cube. /* 4 5 */ const float points[]={ -0.5,-0.5, 0.5, 0.5,-0.5,0.5, 0.5,-0.5,-0.5, -0.5,-0.5,-0.5, @@ -1247,7 +1246,7 @@ namespace hgl 0,4, 1,5, 2,6, 3,7 }; - PrimitiveCreater rc(db->GetDevice(),vil,"BoundingBox"); + PrimitiveCreater rc(device,vil,"BoundingBox"); if(!rc.Init(8,24,IndexType::U16)) return(nullptr); @@ -1273,7 +1272,7 @@ namespace hgl rc.WriteIBO(indices); - return rc.Finish(db); + return rc.Create(); } }//namespace inline_geometry }//namespace graph diff --git a/src/SceneGraph/Vulkan/VKRenderResource.cpp b/src/SceneGraph/Vulkan/VKRenderResource.cpp index f448d976..250b6fdc 100644 --- a/src/SceneGraph/Vulkan/VKRenderResource.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResource.cpp @@ -80,36 +80,6 @@ MaterialInstance *RenderResource::CreateMaterialInstance(const mtl::MaterialCrea return CreateMaterialInstance(mtl,vil_cfg); } -Primitive *CreatePrimitivePrivate(const AnsiString &,PrimitiveData *); - -Primitive *RenderResource::CreatePrimitive(const AnsiString &name,PrimitiveData *pd) -{ - if(!pd)return(nullptr); - - Primitive *prim=CreatePrimitivePrivate(name,pd); - - if(prim) - Add(prim); - - return prim; -} - -Primitive *CreatePrimitivePrivate(VertexDataManager *,const AnsiString &,PrimitiveData *); - -Primitive *RenderResource::CreatePrimitive(VertexDataManager *vdm,const AnsiString &name,PrimitiveData *pd) -{ - if(!vdm)return(nullptr); - if(!pd)return(nullptr); - if(name.IsEmpty())return(nullptr); - - Primitive *prim=CreatePrimitivePrivate(vdm,name,pd); - - if(prim) - Add(prim); - - return prim; -} - Renderable *RenderResource::CreateRenderable(Primitive *r,MaterialInstance *mi,Pipeline *p) { if(!p||!mi||!r)