diff --git a/CMakeLists.txt b/CMakeLists.txt index 364c263c..90a0fe44 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.0) PROJECT(ULRE) diff --git a/cmake/compiler.cmake b/cmake/compiler.cmake index d225a452..243c918b 100644 --- a/cmake/compiler.cmake +++ b/cmake/compiler.cmake @@ -11,6 +11,7 @@ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++14") add_compile_options(/GR- /arch:AVX2) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) ELSE() IF(NOT ANDROID) diff --git a/example/Vulkan/Geometry2D.cpp b/example/Vulkan/Geometry2D.cpp index fda3087f..ffb8040a 100644 --- a/example/Vulkan/Geometry2D.cpp +++ b/example/Vulkan/Geometry2D.cpp @@ -6,7 +6,8 @@ #include"VulkanAppFramework.h" #include #include -#include +#include +#include using namespace hgl; using namespace hgl::graph; @@ -28,32 +29,27 @@ private: uint swap_chain_count=0; + SceneDB * db =nullptr; + vulkan::Material * material =nullptr; vulkan::DescriptorSets * descriptor_sets =nullptr; + vulkan::Renderable * render_obj =nullptr; - vulkan::RenderableInstance *render_instance =nullptr; + RenderableNode * render_node =nullptr; vulkan::Buffer * ubo_mvp =nullptr; vulkan::Pipeline * pipeline =nullptr; vulkan::CommandBuffer ** cmd_buf =nullptr; - vulkan::VertexBuffer * vertex_buffer =nullptr; - vulkan::VertexBuffer * color_buffer =nullptr; - public: ~TestApp() { - SAFE_CLEAR(render_instance); - SAFE_CLEAR(color_buffer); - SAFE_CLEAR(vertex_buffer); + SAFE_CLEAR(render_node); + SAFE_CLEAR(db); + SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count); - SAFE_CLEAR(pipeline); - SAFE_CLEAR(ubo_mvp); - SAFE_CLEAR(render_obj); - SAFE_CLEAR(descriptor_sets); - SAFE_CLEAR(material); } private: @@ -66,6 +62,9 @@ private: return(false); descriptor_sets=material->CreateDescriptorSets(); + + db->Add(material); + db->Add(descriptor_sets); return(true); } @@ -95,7 +94,7 @@ private: cci.field_count=8; - render_obj=CreateCircle(device,material,&cci); + render_obj=CreateCircle(db,material,&cci); return render_obj; } @@ -106,7 +105,7 @@ private: world.mvp=ortho(extent.width,extent.height); - ubo_mvp=device->CreateUBO(sizeof(WorldConfig),&world); + ubo_mvp=db->CreateUBO(sizeof(WorldConfig),&world); if(!ubo_mvp) return(false); @@ -130,14 +129,14 @@ private: pipeline_creater->Set(PRIM_TRIANGLE_FAN); pipeline=pipeline_creater->Create(); - + db->Add(pipeline); delete pipeline_creater; } return pipeline; } - void Draw(vulkan::CommandBuffer *cb,vulkan::RenderableInstance *ri) + void Draw(vulkan::CommandBuffer *cb,RenderableNode *ri) { cb->Bind(ri->GetPipeline()); cb->Bind(ri->GetDescriptorSets()); @@ -171,7 +170,7 @@ private: cmd_buf[i]->Begin(); cmd_buf[i]->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(i)); - Draw(cmd_buf[i],render_instance); + Draw(cmd_buf[i],render_node); cmd_buf[i]->EndRenderPass(); cmd_buf[i]->End(); } @@ -188,6 +187,8 @@ public: swap_chain_count=device->GetSwapChainImageCount(); + db=new SceneDB(device); + if(!InitMaterial()) return(false); @@ -200,7 +201,7 @@ public: if(!InitPipeline()) return(false); - render_instance=new vulkan::RenderableInstance(pipeline,descriptor_sets,render_obj); + render_node=new RenderableNode(pipeline,descriptor_sets,render_obj); if(!InitCommandBuffer()) return(false); diff --git a/inc/hgl/graph/InlineGeometry.h b/inc/hgl/graph/InlineGeometry.h index 08f893f1..19c603f8 100644 --- a/inc/hgl/graph/InlineGeometry.h +++ b/inc/hgl/graph/InlineGeometry.h @@ -8,6 +8,8 @@ namespace hgl { namespace graph { + class SceneDB; + /** * 矩形创建信息 */ @@ -16,7 +18,7 @@ namespace hgl RectScope2f scope; }; - vulkan::Renderable *CreateRectangle(vulkan::Device *device,vulkan::Material *mtl,const RectangleCreateInfo *rci); + vulkan::Renderable *CreateRectangle(SceneDB *db,vulkan::Material *mtl,const RectangleCreateInfo *rci); /** * 圆角矩形创建信息 @@ -27,7 +29,7 @@ namespace hgl uint32_t round_per; //圆角精度 }; - vulkan::Renderable *CreateRoundRectangle(vulkan::Device *device,vulkan::Material *mtl,const RoundRectangleCreateInfo *rci); + vulkan::Renderable *CreateRoundRectangle(SceneDB *db,vulkan::Material *mtl,const RoundRectangleCreateInfo *rci); /** * 圆形创建信息 @@ -39,7 +41,7 @@ namespace hgl uint field_count; //分段次数 }; - vulkan::Renderable *CreateCircle(vulkan::Device *device,vulkan::Material *mtl,const CircleCreateInfo *rci); + vulkan::Renderable *CreateCircle(SceneDB *db,vulkan::Material *mtl,const CircleCreateInfo *rci); }//namespace graph };//namespace hgl #endif//HGL_GRAPH_INLINE_GEOMETRY_INCLUDE diff --git a/inc/hgl/graph/SceneDB.h b/inc/hgl/graph/SceneDB.h index c48582ba..df16f804 100644 --- a/inc/hgl/graph/SceneDB.h +++ b/inc/hgl/graph/SceneDB.h @@ -1,7 +1,12 @@ #ifndef HGL_GRAPH_SCENE_DATABASE_INCLUDE #define HGL_GRAPH_SCENE_DATABASE_INCLUDE -#include +#include +#include +#include +#include +#include +#include #include namespace hgl { @@ -13,20 +18,24 @@ namespace hgl using RenderableID =int; using BufferID =int; + class VertexBufferCreater; + /** * 场景DB,用于管理场景内所需的所有数据 */ class SceneDB { + vulkan::Device *device; + IDResManage rm_material; ///<材质合集 IDResManage rm_pipeline; ///<管线合集 IDResManage rm_desc_sets; ///<描述符合集 - IDResManage rm_renderables; ///<可渲染对象合集 + IDResManage rm_renderables; ///<可渲染对象合集 IDResManage rm_buffers; ///<顶点缓冲区集合 public: - SceneDB()=default; + SceneDB(vulkan::Device *dev):device(dev){} virtual ~SceneDB()=default; MaterialID Add(vulkan::Material * mtl ){return rm_material.Add(mtl);} @@ -35,6 +44,19 @@ namespace hgl RenderableID Add(vulkan::Renderable * r ){return rm_renderables.Add(r);} BufferID Add(vulkan::Buffer * buf ){return rm_buffers.Add(buf);} + 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);} + + #define SCENE_DB_CREATE_FUNC(name) vulkan::Buffer *Create##name(VkDeviceSize size,void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE); \ + vulkan::Buffer *Create##name(VkDeviceSize size,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE); + + SCENE_DB_CREATE_FUNC(UBO) + SCENE_DB_CREATE_FUNC(SSBO) + SCENE_DB_CREATE_FUNC(INBO) + + #undef SCENE_DB_CREATE_FUNC + vulkan::Material * GetMaterial (const MaterialID &id){return rm_material.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);} diff --git a/inc/hgl/platform/.directory b/inc/hgl/platform/.directory deleted file mode 100644 index b635c0a9..00000000 --- a/inc/hgl/platform/.directory +++ /dev/null @@ -1,5 +0,0 @@ -[Dolphin] -PreviewsShown=false -Timestamp=2018,11,27,14,36,21 -Version=4 -ViewMode=1 diff --git a/inc/hgl/platform/compiler/Microsoft.h b/inc/hgl/platform/compiler/Microsoft.h index 9a3b8504..9b3de1ca 100644 --- a/inc/hgl/platform/compiler/Microsoft.h +++ b/inc/hgl/platform/compiler/Microsoft.h @@ -1,4 +1,4 @@ -#ifndef HGL_COMPILER_MICROSOFT_INCLUDE +#ifndef HGL_COMPILER_MICROSOFT_INCLUDE #define HGL_COMPILER_MICROSOFT_INCLUDE //-------------------------------------------------------------------------------------------------- #define HGL_COMPILER_NAME OS_TEXT("Microsoft C/C++") diff --git a/src/SceneGraph/InlineGeometry.cpp b/src/SceneGraph/InlineGeometry.cpp index d58fb219..0aeb2826 100644 --- a/src/SceneGraph/InlineGeometry.cpp +++ b/src/SceneGraph/InlineGeometry.cpp @@ -1,14 +1,13 @@ #include #include #include -#include -#include #include +#include namespace hgl { namespace graph { - vulkan::Renderable *CreateRectangle(vulkan::Device *device,vulkan::Material *mtl,const RectangleCreateInfo *rci) + vulkan::Renderable *CreateRectangle(SceneDB *db,vulkan::Material *mtl,const RectangleCreateInfo *rci) { const vulkan::VertexShaderModule *vsm=mtl->GetVertexShaderModule(); @@ -24,14 +23,15 @@ namespace hgl vertex->End(); vulkan::Renderable *render_obj=mtl->CreateRenderable(vertex->GetCount()); - render_obj->Set(vertex_binding,device->CreateVBO(vertex)); + render_obj->Set(vertex_binding,db->CreateVBO(vertex)); render_obj->SetBoundingBox(vertex->GetAABB()); delete vertex; + db->Add(render_obj); return render_obj; } - vulkan::Renderable *CreateRoundRectangle(vulkan::Device *device,vulkan::Material *mtl,const RoundRectangleCreateInfo *rci) + vulkan::Renderable *CreateRoundRectangle(SceneDB *db,vulkan::Material *mtl,const RoundRectangleCreateInfo *rci) { const vulkan::VertexShaderModule *vsm=mtl->GetVertexShaderModule(); @@ -111,14 +111,15 @@ namespace hgl } render_obj=mtl->CreateRenderable(vertex->GetCount()); - render_obj->Set(vertex_binding,device->CreateVBO(vertex)); + render_obj->Set(vertex_binding,db->CreateVBO(vertex)); render_obj->SetBoundingBox(vertex->GetAABB()); delete vertex; + db->Add(render_obj); return render_obj; } - vulkan::Renderable *CreateCircle(vulkan::Device *device,vulkan::Material *mtl,const CircleCreateInfo *cci) + vulkan::Renderable *CreateCircle(SceneDB *db,vulkan::Material *mtl,const CircleCreateInfo *cci) { const vulkan::VertexShaderModule *vsm=mtl->GetVertexShaderModule(); @@ -146,10 +147,11 @@ namespace hgl vertex->End(); vulkan::Renderable *render_obj=mtl->CreateRenderable(vertex->GetCount()); - render_obj->Set(vertex_binding,device->CreateVBO(vertex)); + render_obj->Set(vertex_binding,db->CreateVBO(vertex)); render_obj->SetBoundingBox(vertex->GetAABB()); delete vertex; + db->Add(render_obj); return render_obj; } }//namespace graph diff --git a/src/SceneGraph/SceneDB.cpp b/src/SceneGraph/SceneDB.cpp index ee82e03f..9428708b 100644 --- a/src/SceneGraph/SceneDB.cpp +++ b/src/SceneGraph/SceneDB.cpp @@ -1,8 +1,44 @@ #include +#include namespace hgl { namespace graph { + vulkan::VertexBuffer *SceneDB::CreateVBO(VkFormat format,uint32_t count,const void *data,VkSharingMode sharing_mode) + { + vulkan::VertexBuffer *vb=device->CreateVBO(format,count,data,sharing_mode); + + if(!vb) + return(nullptr); + + rm_buffers.Add(vb); + + return vb; + } + + #define SCENE_DB_CREATE_BUFFER(name) vulkan::Buffer *SceneDB::Create##name(VkDeviceSize size,void *data,VkSharingMode sharing_mode) \ + { \ + vulkan::Buffer *buf=device->Create##name(size,data,sharing_mode); \ + \ + if(!buf)return(nullptr); \ + rm_buffers.Add(buf); \ + return(buf); \ + } \ + \ + vulkan::Buffer *SceneDB::Create##name(VkDeviceSize size,VkSharingMode sharing_mode) \ + { \ + vulkan::Buffer *buf=device->Create##name(size,sharing_mode); \ + \ + if(!buf)return(nullptr); \ + rm_buffers.Add(buf); \ + return(buf); \ + } + + SCENE_DB_CREATE_BUFFER(UBO) + SCENE_DB_CREATE_BUFFER(SSBO) + SCENE_DB_CREATE_BUFFER(INBO) + + #undef SCENE_DB_CREATE_BUFFER }//namespace graph }//namespace hgl