diff --git a/example/Basic/CMakeLists.txt b/example/Basic/CMakeLists.txt index 18c0514c..0aa206f8 100644 --- a/example/Basic/CMakeLists.txt +++ b/example/Basic/CMakeLists.txt @@ -10,7 +10,7 @@ set_property(TARGET ${name} PROPERTY FOLDER "ULRE/Example/Basic") endmacro() -CreateProject(00_RenderFrameworkTest rf_test.cpp) +CreateProject(00_RenderFrameworkTest rf_test.cpp ${WORK_FILES}) CreateProject(01_draw_triangle_in_NDC draw_triangle_in_NDC.cpp) CreateProject(02_draw_triangle_use_UBO draw_triangle_use_UBO.cpp) CreateProject(03_auto_instance auto_instance.cpp) diff --git a/example/Basic/rf_test.cpp b/example/Basic/rf_test.cpp index b7a18d20..00aae4b2 100644 --- a/example/Basic/rf_test.cpp +++ b/example/Basic/rf_test.cpp @@ -1,6 +1,6 @@ // 该范例主要演示使用NDC坐标系直接绘制一个渐变色的三角形 -#include"WorkObject.h" +#include"WorkManager.h" #include #include #include diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 078c5c4a..2d24c0ef 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -1,7 +1,13 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/common) -SET(VULKAN_APP_FRAMEWORK ${CMAKE_CURRENT_SOURCE_DIR}/common/VulkanAppFramework.h - ${CMAKE_CURRENT_SOURCE_DIR}/common/WorkObject.h) +SET(VULKAN_APP_FRAMEWORK ${CMAKE_CURRENT_SOURCE_DIR}/common/VulkanAppFramework.h) + + +SET(WORK_FILES ${CMAKE_CURRENT_SOURCE_DIR}/common/WorkObject.h + ${CMAKE_CURRENT_SOURCE_DIR}/common/WorkManager.h + ${CMAKE_CURRENT_SOURCE_DIR}/common/WorkManager.cpp) + +SOURCE_GROUP("Work" FILES ${WORK_FILES}) add_subdirectory(Basic) add_subdirectory(Texture) diff --git a/example/common/WorkManager.cpp b/example/common/WorkManager.cpp new file mode 100644 index 00000000..4c17d939 --- /dev/null +++ b/example/common/WorkManager.cpp @@ -0,0 +1,66 @@ +#pragma once +#include"WorkManager.h" + +namespace hgl +{ + void WorkManager::Tick(WorkObject *wo) + { + double delta_time=cur_time-last_update_time; + + if(delta_time>=frame_time) + { + last_update_time=cur_time; + wo->Tick(delta_time); + } + } + + void WorkManager::Render(WorkObject *wo) + { + double delta_time=cur_time-last_render_time; + + if(delta_time>=frame_time) + { + last_render_time=cur_time; + wo->Render(delta_time); + } + } + + void WorkManager::Run() + { + if(!cur_work_object) + return; + + Window *win=render_framework->GetWindow(); + graph::GPUDevice *dev=render_framework->GetDevice(); + + while(!cur_work_object->IsDestroy()) + { + cur_time=GetDoubleTime(); + + if(cur_work_object->IsTickable()) + Tick(cur_work_object); + + if(win->IsVisible()&&cur_work_object->IsRenderable()) + { + Render(cur_work_object); + dev->WaitIdle(); + } + + if(!win->Update()) + break; + } + } + + void WorkManager::Start(WorkObject *wo) + { + if(!wo)return; + + last_update_time=last_render_time=0; + + cur_work_object=wo; + + wo->Join(render_framework); + + Run(); + } +}//namespcae hgl diff --git a/example/common/WorkManager.h b/example/common/WorkManager.h new file mode 100644 index 00000000..2695d3af --- /dev/null +++ b/example/common/WorkManager.h @@ -0,0 +1,44 @@ +#pragma once +#include"WorkObject.h" + +namespace hgl +{ + class WorkManager + { + graph::RenderFramework *render_framework; + + uint fps=60; + double frame_time=1.0f/double(fps); + + double last_update_time=0; + double last_render_time=0; + double cur_time=0; + + WorkObject *cur_work_object=nullptr; + + public: + + WorkManager(graph::RenderFramework *rf) + { + render_framework=rf; + } + + virtual ~WorkManager() + { + SAFE_CLEAR(cur_work_object); + } + + void SetFPS(uint f) + { + fps=f; + frame_time=1.0f/double(fps); + } + + void Tick(WorkObject *wo); + void Render(WorkObject *wo); + + void Run(); + + void Start(WorkObject *wo); + };//class WorkManager +}//namespcae hgl diff --git a/example/common/WorkObject.h b/example/common/WorkObject.h index 62e51aba..1cc7b246 100644 --- a/example/common/WorkObject.h +++ b/example/common/WorkObject.h @@ -52,97 +52,4 @@ namespace hgl virtual void Render(double delta_time)=0; };//class WorkObject - - class WorkManager - { - graph::RenderFramework *render_framework; - - uint fps=60; - double frame_time=1.0f/double(fps); - - double last_update_time=0; - double last_render_time=0; - double cur_time=0; - - WorkObject *cur_work_object=nullptr; - - public: - - WorkManager(graph::RenderFramework *rf) - { - render_framework=rf; - } - - virtual ~WorkManager() - { - SAFE_CLEAR(cur_work_object); - } - - void SetFPS(uint f) - { - fps=f; - frame_time=1.0f/double(fps); - } - - void Tick(WorkObject *wo) - { - double delta_time=cur_time-last_update_time; - - if(delta_time>=frame_time) - { - last_update_time=cur_time; - wo->Tick(delta_time); - } - } - - void Render(WorkObject *wo) - { - double delta_time=cur_time-last_render_time; - - if(delta_time>=frame_time) - { - last_render_time=cur_time; - wo->Render(delta_time); - } - } - - void Run() - { - if(!cur_work_object) - return; - - Window *win=render_framework->GetWindow(); - graph::GPUDevice *dev=render_framework->GetDevice(); - - while(!cur_work_object->IsDestroy()) - { - cur_time=GetDoubleTime(); - - if(cur_work_object->IsTickable()) - Tick(cur_work_object); - - if(win->IsVisible()&&cur_work_object->IsRenderable()) - { - Render(cur_work_object); - dev->WaitIdle(); - } - - if(!win->Update()) - break; - } - } - - void Start(WorkObject *wo) - { - if(!wo)return; - - last_update_time=last_render_time=0; - - cur_work_object=wo; - - wo->Join(render_framework); - - Run(); - } - };//class WorkManager }//namespcae hgl