From 8d3cd8d5612b474488dcd66c58d838db3f175e62 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sat, 25 May 2024 22:47:26 +0800 Subject: [PATCH] remove RenderablePrimitiveCreater.h, fixed auto_instance.cpp/auto_merge_material_instance.cpp examples, can RUN. --- example/Basic/auto_instance.cpp | 26 ++++++--- .../Basic/auto_merge_material_instance.cpp | 19 +++++-- inc/hgl/graph/PrimitiveCreater.h | 4 +- inc/hgl/graph/VKRenderResource.h | 2 + inc/hgl/graph/VKRenderablePrimitiveCreater.h | 56 ------------------- inc/hgl/graph/mtl/Material2DCreateConfig.h | 4 +- inc/hgl/graph/mtl/Material3DCreateConfig.h | 2 +- inc/hgl/graph/mtl/MaterialConfig.h | 15 +++-- src/SceneGraph/MaterialRenderList.cpp | 1 + src/SceneGraph/PrimitiveCreater.cpp | 1 - src/SceneGraph/Vulkan/VKRenderResource.cpp | 24 ++++++++ 11 files changed, 74 insertions(+), 80 deletions(-) delete mode 100644 inc/hgl/graph/VKRenderablePrimitiveCreater.h diff --git a/example/Basic/auto_instance.cpp b/example/Basic/auto_instance.cpp index 58bea897..53b27d60 100644 --- a/example/Basic/auto_instance.cpp +++ b/example/Basic/auto_instance.cpp @@ -3,7 +3,7 @@ #include"VulkanAppFramework.h" #include #include -#include +#include #include #include #include @@ -16,6 +16,8 @@ constexpr uint32_t SCREEN_HEIGHT=1024; constexpr uint32_t VERTEX_COUNT=3; +constexpr uint32_t TRIANGLE_NUMBER=12; + constexpr float position_data[VERTEX_COUNT*2]= { 0.0, 0.0, @@ -72,18 +74,28 @@ private: bool InitVBO() { - RenderablePrimitiveCreater rpc(db,"Triangle",VERTEX_COUNT); + PrimitiveCreater rpc(device,material_instance->GetVIL()); - if(!rpc.SetVAB(VAN::Position, VF_V2F, position_data))return(false); - if(!rpc.SetVAB(VAN::Color, VF_V4UN8, color_data ))return(false); + rpc.Init("Triangle",VERTEX_COUNT); + + if(!rpc.WriteVAB(VAN::Position, VF_V2F, position_data))return(false); + if(!rpc.WriteVAB(VAN::Color, VF_V4UN8, color_data ))return(false); - render_obj=rpc.Create(material_instance,pipeline); + render_obj=db->CreateRenderable(&rpc,material_instance,pipeline); if(!render_obj) return(false); + + double rad; + Matrix4f mat; - for(uint i=0;i<12;i++) - render_root.CreateSubNode(rotate(deg2rad(30*i),Vector3f(0,0,1)),render_obj); + for(uint i=0;i((360/TRIANGLE_NUMBER)*i); //这里一定要加,否则结果用int保存会出现问题 + mat=rotate(rad,Vector3f(0,0,1)); + + render_root.CreateSubNode(mat,render_obj); + } render_root.RefreshMatrix(); diff --git a/example/Basic/auto_merge_material_instance.cpp b/example/Basic/auto_merge_material_instance.cpp index f2a8f0b2..b1bada3a 100644 --- a/example/Basic/auto_merge_material_instance.cpp +++ b/example/Basic/auto_merge_material_instance.cpp @@ -3,7 +3,6 @@ #include"VulkanAppFramework.h" #include #include -#include #include #include #include @@ -84,18 +83,28 @@ private: bool InitVBOAndRenderList() { - RenderablePrimitiveCreater rpc(db,"Triangle",VERTEX_COUNT); + PrimitiveCreater pc(device,material->GetDefaultVIL()); - if(!rpc.SetVAB(VAN::Position, VF_V2F, position_data))return(false); + if(!pc.Init("Triangle",VERTEX_COUNT)) + return(false); + + if(!pc.WriteVAB(VAN::Position, VF_V2F, position_data)) + return(false); + + Primitive *prim=pc.Create(); + if(!prim) + return(false); + + db->Add(prim); for(uint i=0;iCreateRenderable(prim,render_obj[i].mi,pipeline); if(!render_obj[i].r) return(false); - render_root.CreateSubNode(rotate(deg2rad(double(360/DRAW_OBJECT_COUNT*i)),Vector3f(0,0,1)),render_obj[i].r); + render_root.CreateSubNode(rotate(deg2rad(double(360/DRAW_OBJECT_COUNT*i)),Vector3f(0,0,1)),render_obj[i].r); } render_root.RefreshMatrix(); diff --git a/inc/hgl/graph/PrimitiveCreater.h b/inc/hgl/graph/PrimitiveCreater.h index dbbba4dc..d7477a20 100644 --- a/inc/hgl/graph/PrimitiveCreater.h +++ b/inc/hgl/graph/PrimitiveCreater.h @@ -35,10 +35,10 @@ public: PrimitiveCreater(VertexDataManager *); virtual ~PrimitiveCreater(); - virtual bool Init(const AnsiString &name,const VkDeviceSize vertices_count,const VkDeviceSize index_count,IndexType it=IndexType::AUTO); ///<初始化,参数为顶点数量 + virtual bool Init(const AnsiString &name,const VkDeviceSize vertices_count,const VkDeviceSize index_count=0,IndexType it=IndexType::AUTO); ///<初始化,参数为顶点数量 void Clear(); ///<清除创建器数据 - + public: //顶点缓冲区 const VkDeviceSize GetVertexCount()const{ return vertices_number; } ///<取得顶点数量 diff --git a/inc/hgl/graph/VKRenderResource.h b/inc/hgl/graph/VKRenderResource.h index c45e4bba..6a680279 100644 --- a/inc/hgl/graph/VKRenderResource.h +++ b/inc/hgl/graph/VKRenderResource.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -148,6 +149,7 @@ public: //Material MaterialInstance * CreateMaterialInstance(const mtl::MaterialCreateInfo *,const VILConfig *vil_cfg=nullptr); Renderable * CreateRenderable(Primitive *r,MaterialInstance *mi,Pipeline *p); + Renderable * CreateRenderable(PrimitiveCreater *pc,MaterialInstance *mi,Pipeline *p); Sampler * CreateSampler(VkSamplerCreateInfo *sci=nullptr); Sampler * CreateSampler(Texture *); diff --git a/inc/hgl/graph/VKRenderablePrimitiveCreater.h b/inc/hgl/graph/VKRenderablePrimitiveCreater.h deleted file mode 100644 index 5e7c4095..00000000 --- a/inc/hgl/graph/VKRenderablePrimitiveCreater.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef HGL_VK_RENDERABLE_PRIMITIVE_CREATER_INCLUDE -#define HGL_VK_RENDERABLE_PRIMITIVE_CREATER_INCLUDE - -#include - -VK_NAMESPACE_BEGIN -/** -* 可绘制图元创建器 -*/ -class RenderablePrimitiveCreater -{ - RenderResource *rr; - - VkDeviceSize vertex_count; - - Primitive *prim; - -public: - - RenderablePrimitiveCreater(RenderResource *_rr,const AnsiString &name,VkDeviceSize vc) - { - rr=_rr; - vertex_count=vc; - - prim=rr->CreatePrimitive(name,vertex_count); - } - - VAB *SetVAB(const AnsiString &name,const VkFormat &fmt,const void *buf) - { - VAB *vab=rr->CreateVAB(fmt,vertex_count,buf); - - if(!vab) - return(nullptr); - - prim->SetVAB(name,vab); - return(vab); - } - - IndexBuffer *SetIndex(const IndexType &it,const void *buf,const VkDeviceSize index_count) - { - IndexBuffer *ibo=rr->CreateIBO(it,index_count,buf); - - if(!ibo) - return(nullptr); - - prim->SetIndex(ibo,0,index_count); - return(ibo); - } - - Renderable *Create(MaterialInstance *mi,Pipeline *p) - { - return rr->CreateRenderable(prim,mi,p); - } -};//class RenderablePrimitiveCreater -VK_NAMESPACE_END -#endif // HGL_VK_RENDERABLE_PRIMITIVE_CREATER_INCLUDE diff --git a/inc/hgl/graph/mtl/Material2DCreateConfig.h b/inc/hgl/graph/mtl/Material2DCreateConfig.h index bd2fd67a..f9ef2447 100644 --- a/inc/hgl/graph/mtl/Material2DCreateConfig.h +++ b/inc/hgl/graph/mtl/Material2DCreateConfig.h @@ -16,7 +16,7 @@ struct Material2DCreateConfig:public MaterialCreateConfig public: - Material2DCreateConfig(const GPUDeviceAttribute *da,const AnsiString &name,const bool &mi,const Prim &p):MaterialCreateConfig(da,name,mi,p) + Material2DCreateConfig(const GPUDeviceAttribute *da,const AnsiString &name,const Prim &p):MaterialCreateConfig(da,name,p) { rt_output.color=1; //输出一个颜色 rt_output.depth=false; //不输出深度 @@ -45,7 +45,7 @@ public: if(off)return off; off=position_format.Comp(cfg.position_format); - + return off; } diff --git a/inc/hgl/graph/mtl/Material3DCreateConfig.h b/inc/hgl/graph/mtl/Material3DCreateConfig.h index 1e80129a..b3fc6195 100644 --- a/inc/hgl/graph/mtl/Material3DCreateConfig.h +++ b/inc/hgl/graph/mtl/Material3DCreateConfig.h @@ -17,7 +17,7 @@ struct Material3DCreateConfig:public MaterialCreateConfig public: - Material3DCreateConfig(const GPUDeviceAttribute *da,const AnsiString &name,const bool &mi,const Prim &p):MaterialCreateConfig(da,name,mi,p) + Material3DCreateConfig(const GPUDeviceAttribute *da,const AnsiString &name,const Prim &p):MaterialCreateConfig(da,name,p) { rt_output.color=1; //输出一个颜色 rt_output.depth=true; //不输出深度 diff --git a/inc/hgl/graph/mtl/MaterialConfig.h b/inc/hgl/graph/mtl/MaterialConfig.h index 78f6ed54..94e32c56 100644 --- a/inc/hgl/graph/mtl/MaterialConfig.h +++ b/inc/hgl/graph/mtl/MaterialConfig.h @@ -29,32 +29,35 @@ struct MaterialCreateConfig public: - MaterialCreateConfig(const GPUDeviceAttribute *da,const AnsiString &name,const bool mi,const Prim &p) + MaterialCreateConfig(const GPUDeviceAttribute *da,const AnsiString &name,const Prim &p) { dev_attr=da; mtl_name=name; - material_instance=mi; + material_instance=false; shader_stage_flag_bit=VK_SHADER_STAGE_VERTEX_BIT|VK_SHADER_STAGE_FRAGMENT_BIT; prim=p; } - int Comp(const MaterialCreateConfig &cfg)const + virtual int Comp(const MaterialCreateConfig &cfg)const { int off; + + off=material_instance-cfg.material_instance; + if(off)return(off); off=hgl_cmp(rt_output,cfg.rt_output); - if(off)return(off); off=(int)prim-(int)cfg.prim; - if(off)return(off); - return shader_stage_flag_bit-cfg.shader_stage_flag_bit; + off=shader_stage_flag_bit-cfg.shader_stage_flag_bit; + + return off; } CompOperator(const MaterialCreateConfig &,Comp) diff --git a/src/SceneGraph/MaterialRenderList.cpp b/src/SceneGraph/MaterialRenderList.cpp index 5cadcd93..2fcaf1a1 100644 --- a/src/SceneGraph/MaterialRenderList.cpp +++ b/src/SceneGraph/MaterialRenderList.cpp @@ -219,6 +219,7 @@ void MaterialRenderList::Render(RenderItem *ri) if(!ri->vid->Comp(last_vid)) { last_vid=ri->vid; + last_dd=nullptr; } if(!ri->dd->Comp(last_dd)) diff --git a/src/SceneGraph/PrimitiveCreater.cpp b/src/SceneGraph/PrimitiveCreater.cpp index 635e4024..6a7e18f2 100644 --- a/src/SceneGraph/PrimitiveCreater.cpp +++ b/src/SceneGraph/PrimitiveCreater.cpp @@ -137,7 +137,6 @@ VABAccess *PrimitiveCreater::AcquireVAB(const AnsiString &name,const VkFormat &a return vab_access; } - void *PrimitiveCreater::MapIBO() { if(!prim_data)return(nullptr); diff --git a/src/SceneGraph/Vulkan/VKRenderResource.cpp b/src/SceneGraph/Vulkan/VKRenderResource.cpp index 250b6fdc..dbe821d4 100644 --- a/src/SceneGraph/Vulkan/VKRenderResource.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResource.cpp @@ -93,6 +93,30 @@ Renderable *RenderResource::CreateRenderable(Primitive *r,MaterialInstance *mi,P return ri; } +Renderable *RenderResource::CreateRenderable(PrimitiveCreater *pc,MaterialInstance *mi,Pipeline *p) +{ + if(!p||!mi||!pc) + return(nullptr); + + Primitive *prim=pc->Create(); + + if(!prim) + return(nullptr); + + Renderable *ri=VK_NAMESPACE::CreateRenderable(prim,mi,p); + + if(ri) + { + Add(prim); + Add(ri); + + return ri; + } + + delete prim; + return(nullptr); +} + Sampler *RenderResource::CreateSampler(VkSamplerCreateInfo *sci) { Sampler *s=device->CreateSampler(sci);