diff --git a/CMCore b/CMCore index 2dfcdf0e..753b78dd 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 2dfcdf0e4114729384b1c8490c8ab048f9c11c80 +Subproject commit 753b78dddf234cd305b5d211c687b311eebaaf8a diff --git a/example/Basic/first_app.cpp b/example/Basic/first_app.cpp index 6acca385..57ba909e 100644 --- a/example/Basic/first_app.cpp +++ b/example/Basic/first_app.cpp @@ -1,8 +1,30 @@ #include +#include +#include +#include using namespace hgl; using namespace hgl::graph; +class TestRenderModule:public RenderModule +{ +public: + + RENDER_MODULE_CONSTRUCT(TestRenderModule) + + void OnResize(const VkExtent2D &size) override + { + LOG_INFO(OS_TEXT("Resize: ")+OSString::numberOf(size.width)+OS_TEXT("x")+OSString::numberOf(size.height)); + } + + void OnExecute(const double,RenderCmdBuffer *cmd) + { + LOG_INFO(OS_TEXT("Execute")); + + //cmd->Begin + } +};//class TestGraphModule:public RenderModule + int os_main(int,os_char **) { RenderFramework rf; @@ -10,6 +32,8 @@ int os_main(int,os_char **) if(!rf.Init(1280,720,OS_TEXT("FirstApp"))) return 1; + rf.AddModule(); + rf.Run(); return 0; diff --git a/inc/hgl/graph/RenderFramework.h b/inc/hgl/graph/RenderFramework.h index 7445ab0e..02d2047f 100644 --- a/inc/hgl/graph/RenderFramework.h +++ b/inc/hgl/graph/RenderFramework.h @@ -67,6 +67,15 @@ public: //module template T *GetModule(){return graph_module_manager->GetModule(false);} ///<获取指定类型的模块 + template T *AddModule() + { + T *tm=new T(graph_module_manager); + + module_list.Add(tm); + + return tm; + } + SwapchainModule *GetSwapchain(){return swapchain_module;} ///<取得Swapchain模块 public: //manager diff --git a/inc/hgl/graph/module/GraphModule.h b/inc/hgl/graph/module/GraphModule.h index 2f21daa6..cdb5d8a2 100644 --- a/inc/hgl/graph/module/GraphModule.h +++ b/inc/hgl/graph/module/GraphModule.h @@ -122,4 +122,14 @@ public: //回调事件 \ name(GraphModuleManager *gmm):GraphModule(gmm,GetModuleName()){} +#define RENDER_MODULE_CONSTRUCT(name) public:\ + NO_COPY_NO_MOVE(name) \ + static const AnsiIDName &GetModuleName() \ + { \ + static const AnsiIDName id_name(#name); \ + return id_name; \ + } \ + \ + name(GraphModuleManager *gmm):RenderModule(gmm,GetModuleName()){} + VK_NAMESPACE_END diff --git a/inc/hgl/graph/module/RenderModule.h b/inc/hgl/graph/module/RenderModule.h index 03e16570..674cfbef 100644 --- a/inc/hgl/graph/module/RenderModule.h +++ b/inc/hgl/graph/module/RenderModule.h @@ -24,6 +24,8 @@ public: virtual ~RenderModule()=default; virtual void OnResize(const VkExtent2D &ext)override{current_extent=ext;} + + virtual void OnExecute(const double,RenderCmdBuffer *){} };//class RenderModule VK_NAMESPACE_END diff --git a/inc/hgl/graph/module/SwapchainModule.h b/inc/hgl/graph/module/SwapchainModule.h index f2f745eb..361502f0 100644 --- a/inc/hgl/graph/module/SwapchainModule.h +++ b/inc/hgl/graph/module/SwapchainModule.h @@ -47,6 +47,8 @@ public: const VkExtent2D & GetSwapchainSize()const {return swapchain_rt->GetExtent();} + RenderCmdBuffer *GetRenderCmdBuffer(); + };//class SwapchainModule:public GraphModule VK_NAMESPACE_END diff --git a/src/SceneGraph/RenderFramework.cpp b/src/SceneGraph/RenderFramework.cpp index 89ab5f8c..878fcf48 100644 --- a/src/SceneGraph/RenderFramework.cpp +++ b/src/SceneGraph/RenderFramework.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -76,10 +77,20 @@ void RenderFramework::MainLoop() BeginFrame(); - for(auto rm:module_list) + RenderCmdBuffer *rcb=swapchain_module->GetRenderCmdBuffer(); + + if(rcb) { - if(rm->IsEnable()) - rm->OnExecute(delta_time,nullptr); + rcb->Begin(); + rcb->BindFramebuffer(swapchain_module->GetRenderPass(),swapchain_module->GetRenderTarget()->GetFramebuffer()); + + for(auto rm:module_list) + { + if(rm->IsEnable()) + rm->OnExecute(delta_time,rcb); + } + + rcb->End(); } EndFrame(); diff --git a/src/SceneGraph/module/SwapchainModule.cpp b/src/SceneGraph/module/SwapchainModule.cpp index 3864c30a..bbe34640 100644 --- a/src/SceneGraph/module/SwapchainModule.cpp +++ b/src/SceneGraph/module/SwapchainModule.cpp @@ -286,4 +286,14 @@ void SwapchainModule::EndFrame() swapchain_rt->WaitFence(); } +RenderCmdBuffer *SwapchainModule::GetRenderCmdBuffer() +{ + int index=swapchain_rt->GetCurrentFrameIndices(); + + if(index>=swapchain->image_count) + return(nullptr); + + return cmd_buf[index]; +} + VK_NAMESPACE_END