diff --git a/example/Vulkan/RectanglePrimitive.cpp b/example/Vulkan/RectanglePrimitive.cpp index 968f999d..ec771eea 100644 --- a/example/Vulkan/RectanglePrimitive.cpp +++ b/example/Vulkan/RectanglePrimitive.cpp @@ -17,7 +17,7 @@ constexpr uint32_t SCREEN_SIZE=512; constexpr uint32_t VERTEX_COUNT=1; -constexpr float BORDER=0.1; +constexpr float BORDER=0.1f; constexpr float vertex_data[4]= { @@ -48,21 +48,6 @@ private: vulkan::VertexBuffer * vertex_buffer =nullptr; vulkan::VertexBuffer * tex_coord_buffer =nullptr; -public: - - ~TestApp() - { - SAFE_CLEAR(tex_coord_buffer); - SAFE_CLEAR(vertex_buffer); - SAFE_CLEAR(pipeline); - SAFE_CLEAR(ubo_mvp); - SAFE_CLEAR(render_obj); - SAFE_CLEAR(material_instance); - SAFE_CLEAR(sampler); - SAFE_CLEAR(texture); - SAFE_CLEAR(material); - } - private: bool InitMaterial() @@ -78,12 +63,16 @@ private: texture=vulkan::CreateTextureFromFile(device,OS_TEXT("res/image/lena.Tex2D")); - sampler=device->CreateSampler(); + sampler=db->CreateSampler(); material_instance->BindSampler("tex",texture,sampler); material_instance->BindUBO("world",ubo_mvp); material_instance->Update(); + db->Add(material); + db->Add(material_instance); + db->Add(texture); + db->Add(render_obj); return(true); } @@ -96,7 +85,7 @@ private: cam.Refresh(); - ubo_mvp=device->CreateUBO(sizeof(WorldMatrix),&cam.matrix); + ubo_mvp=db->CreateUBO(sizeof(WorldMatrix),&cam.matrix); if(!ubo_mvp) return(false); @@ -106,8 +95,8 @@ private: void InitVBO() { - vertex_buffer =device->CreateVBO(FMT_RGBA32F,VERTEX_COUNT,vertex_data); - tex_coord_buffer=device->CreateVBO(FMT_RGBA32F,VERTEX_COUNT,tex_coord_data); + vertex_buffer =db->CreateVBO(FMT_RGBA32F,VERTEX_COUNT,vertex_data); + tex_coord_buffer=db->CreateVBO(FMT_RGBA32F,VERTEX_COUNT,tex_coord_data); render_obj->Set("Vertex",vertex_buffer); render_obj->Set("TexCoord",tex_coord_buffer); @@ -122,6 +111,7 @@ private: pipeline=pipeline_creater->Create(); + db->Add(pipeline); return pipeline; } @@ -163,11 +153,6 @@ public: int main(int,char **) { -#ifdef _DEBUG - if(!vulkan::CheckStrideBytesByFormat()) - return 0xff; -#endif// - TestApp app; if(!app.Init()) diff --git a/inc/hgl/graph/SceneDB.h b/inc/hgl/graph/SceneDB.h index b49d055b..1fcbf643 100644 --- a/inc/hgl/graph/SceneDB.h +++ b/inc/hgl/graph/SceneDB.h @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include #include #include @@ -21,6 +23,8 @@ namespace hgl using DescriptorSetsID =int; using RenderableID =int; using RenderableInstanceID =int; + using SamplerID =int; + using TextureID =int; class VertexBufferCreater; @@ -37,6 +41,8 @@ namespace hgl IDResManage rm_desc_sets; ///<描述符合集 IDResManage rm_renderables; ///<可渲染对象合集 IDResManage rm_buffers; ///<顶点缓冲区合集 + IDResManage rm_samplers; ///<采样器合集 + IDResManage rm_textures; ///<纹理合集 IDResManage rm_renderable_instances; ///<渲染实例集合集 public: @@ -44,14 +50,20 @@ namespace hgl SceneDB(vulkan::Device *dev):device(dev){} virtual ~SceneDB()=default; + public: //Add + MaterialID Add(vulkan::Material * mtl ){return rm_material.Add(mtl);} MaterialInstanceID Add(vulkan::MaterialInstance * mi ){return rm_material_instance.Add(mi);} PipelineID Add(vulkan::Pipeline * p ){return rm_pipeline.Add(p);} DescriptorSetsID Add(vulkan::DescriptorSets * ds ){return rm_desc_sets.Add(ds);} RenderableID Add(vulkan::Renderable * r ){return rm_renderables.Add(r);} BufferID Add(vulkan::Buffer * buf ){return rm_buffers.Add(buf);} + SamplerID Add(vulkan::Sampler * s ){return rm_samplers.Add(s);} + TextureID Add(vulkan::Texture * t ){return rm_textures.Add(t);} RenderableInstanceID Add(RenderableInstance * ri ){return rm_renderable_instances.Add(ri);} + public: //Create + 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(const VertexBufferCreater *vbc,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateVBO(vbc->GetDataType(),vbc->GetCount(),vbc->GetData(),sharing_mode);} @@ -76,12 +88,18 @@ namespace hgl RenderableInstance * CreateRenderableInstance(vulkan::Pipeline *p,vulkan::MaterialInstance *mi,vulkan::Renderable *r); + vulkan::Sampler *CreateSampler(VkSamplerCreateInfo *sci=nullptr); + + public: //Get + vulkan::Material * GetMaterial (const MaterialID &id){return rm_material.Get(id);} vulkan::MaterialInstance * GetMaterialInstance (const MaterialInstanceID &id){return rm_material_instance.Get(id);} vulkan::Pipeline * GetPipeline (const PipelineID &id){return rm_pipeline.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);} + vulkan::Sampler * GetSampler (const SamplerID &id){return rm_samplers.Get(id);} + vulkan::Texture * GetTexture (const TextureID &id){return rm_textures.Get(id);} RenderableInstance * GetRenderableInstance (const RenderableInstanceID &id){return rm_renderable_instances.Get(id);} };//class SceneDB }//namespace graph diff --git a/src/SceneGraph/SceneDB.cpp b/src/SceneGraph/SceneDB.cpp index 185355e5..780dc4a6 100644 --- a/src/SceneGraph/SceneDB.cpp +++ b/src/SceneGraph/SceneDB.cpp @@ -58,9 +58,20 @@ namespace hgl RenderableInstance *ri=new RenderableInstance(p,mi,r); - Add(ri); + if(ri) + Add(ri); return ri; } + + vulkan::Sampler *SceneDB::CreateSampler(VkSamplerCreateInfo *sci) + { + vulkan::Sampler *s=device->CreateSampler(sci); + + if(s) + Add(s); + + return s; + } }//namespace graph }//namespace hgl