From bce38fe13efd6f5308b65791702118cdfe6d7838 Mon Sep 17 00:00:00 2001 From: ouczbs Date: Sun, 12 May 2024 23:44:11 +0800 Subject: [PATCH] convert map to table --- .../zlib/include/refl/detail/convert.h | 5 +-- .../zlib/include/refl/detail/uclass.h | 1 - engine/3rdparty/zlib/include/zstd/table.h | 6 ++++ engine/3rdparty/zlib/test/refl/vertex.cpp | 4 +-- engine/3rdparty/zlog/test/assetmanager.h | 6 ++-- engine/src/3rdparty/template/singleton.h | 34 +++++++++++++++++-- engine/src/engine/app.cpp | 30 +++++++++++----- engine/src/engine/app.h | 13 ++++--- engine/src/engine/asset/asset.h | 4 +++ engine/src/engine/asset/asset_manager.cpp | 6 ++++ engine/src/engine/asset/asset_manager.h | 7 ++-- engine/src/engine/data/property/property.cpp | 2 +- engine/src/engine/data/property/property.h | 6 ++-- .../src/engine/object/scene/scene_manager.cpp | 14 ++++---- .../src/engine/object/scene/scene_manager.h | 20 +++++------ engine/src/engine/render/meta/vertex.h | 3 +- .../engine/render/node/rendernode_forward.cpp | 2 +- .../engine/render/node/rendernode_forward.h | 2 +- engine/src/engine/render/renderapi.cpp | 2 +- engine/src/engine/render/renderapi.h | 14 ++++---- engine/src/engine/render/window.h | 9 ++--- engine/src/engine/vulkanapi/backend.h | 2 +- .../src/engine/vulkanapi/tool/glsl_loader.cpp | 0 .../src/engine/vulkanapi/tool/glsl_loader.h | 0 engine/src/engine/vulkanapi/vulkan.h | 4 +-- engine/src/engine/vulkanapi/vulkan_struct.h | 2 +- engine/src/engine/vulkanapi/wrapper/device.h | 2 +- engine/xmake/gen/meta_refl.lua | 2 +- 28 files changed, 128 insertions(+), 74 deletions(-) create mode 100644 engine/3rdparty/zlib/include/zstd/table.h create mode 100644 engine/src/engine/vulkanapi/tool/glsl_loader.cpp create mode 100644 engine/src/engine/vulkanapi/tool/glsl_loader.h diff --git a/engine/3rdparty/zlib/include/refl/detail/convert.h b/engine/3rdparty/zlib/include/refl/detail/convert.h index 632f329..be08420 100644 --- a/engine/3rdparty/zlib/include/refl/detail/convert.h +++ b/engine/3rdparty/zlib/include/refl/detail/convert.h @@ -1,9 +1,10 @@ #pragma once #include "any.h" -#include +#include namespace refl { + using ConvertFunc = bool (*)(Any&, const Any&); - using ConvertMap = std::map; + using ConvertMap = std::unordered_map; class Convert { protected: static ConvertMap BuildClassMap(); diff --git a/engine/3rdparty/zlib/include/refl/detail/uclass.h b/engine/3rdparty/zlib/include/refl/detail/uclass.h index b4201fa..2d2c945 100644 --- a/engine/3rdparty/zlib/include/refl/detail/uclass.h +++ b/engine/3rdparty/zlib/include/refl/detail/uclass.h @@ -31,7 +31,6 @@ namespace refl { uint32_t size; uint32_t flag{0}; const UClass* parent; - Meta* meta{nullptr}; vtable_uclass vtable{}; public: constexpr UClass(std::string_view name, uint32_t size, const UClass* parent = nullptr) diff --git a/engine/3rdparty/zlib/include/zstd/table.h b/engine/3rdparty/zlib/include/zstd/table.h new file mode 100644 index 0000000..025e239 --- /dev/null +++ b/engine/3rdparty/zlib/include/zstd/table.h @@ -0,0 +1,6 @@ +#pragma once +#include +namespace zstd { + template> + using table = std::unordered_map; +} \ No newline at end of file diff --git a/engine/3rdparty/zlib/test/refl/vertex.cpp b/engine/3rdparty/zlib/test/refl/vertex.cpp index fce28d3..a649f17 100644 --- a/engine/3rdparty/zlib/test/refl/vertex.cpp +++ b/engine/3rdparty/zlib/test/refl/vertex.cpp @@ -1,3 +1 @@ -#include "vertex.h" -#include "vkmeta_vertex_gen.inl" -#include "dxmeta_vertex_gen.inl" \ No newline at end of file +#include "vertex.h" \ No newline at end of file diff --git a/engine/3rdparty/zlog/test/assetmanager.h b/engine/3rdparty/zlog/test/assetmanager.h index 29fe76c..251896d 100644 --- a/engine/3rdparty/zlog/test/assetmanager.h +++ b/engine/3rdparty/zlog/test/assetmanager.h @@ -1,7 +1,5 @@ #pragma once #include "singleton.h" -class AssetManager :public Singleton { +class AssetManager :public ISingleton { -}; -template<> -AssetManager* Singleton::ms_Singleton = nullptr; \ No newline at end of file +}; \ No newline at end of file diff --git a/engine/src/3rdparty/template/singleton.h b/engine/src/3rdparty/template/singleton.h index 4087a92..64ab8cc 100644 --- a/engine/src/3rdparty/template/singleton.h +++ b/engine/src/3rdparty/template/singleton.h @@ -1,9 +1,37 @@ #pragma once - +class ISystem { +public: + virtual void Init() = 0; + virtual void LateInit() {}; + virtual void EarlyShutdown() {}; + virtual void Shutdown() = 0; + virtual ~ISystem() = default; +}; template -class Singleton { +class ISingleton : public ISystem{ protected: - static T* ms_Singleton; + inline static T* ms_Singleton = nullptr; +public: + explicit ISingleton() { + ms_Singleton = static_cast(this); + } + ~ISingleton() { + ms_Singleton = nullptr; + } + static constexpr T& GetSingleton(void) { + return *ms_Singleton; + } + static constexpr T* GetSingletonPtr(void) { + return ms_Singleton; + } +public: + void Init() override = 0; + void Shutdown()override = 0; +}; +template +class Singleton{ +protected: + inline static T* ms_Singleton = nullptr; public: explicit Singleton() { ms_Singleton = static_cast(this); diff --git a/engine/src/engine/app.cpp b/engine/src/engine/app.cpp index 34cff57..bf0db4c 100644 --- a/engine/src/engine/app.cpp +++ b/engine/src/engine/app.cpp @@ -9,21 +9,33 @@ namespace engineapi { App::App(const string& path) { const char* name = "zengine"; - new AssetManager(); - _RenderAPI = RenderAPI::MakeInstance(); - _Window = Window::MakeInstance(3, 640, 720, name); - _RenderAPI->OnInit(); - auto scene_manager = new SceneManager(); - scene_manager->LoadScene(path); + SystemList.push_back(new AssetManager()); + SystemList.push_back(RenderAPI::MakeInstance()); + SystemList.push_back(Window::MakeInstance(3, 640, 720, name)); } App::~App() { - delete _Window; - delete _RenderAPI; + for (auto system : SystemList) { + delete system; + } + SystemList.clear(); + } + void App::Init() + { + for (auto system : SystemList) { + system->Init(); + } + } + void App::Shutdown() + { + for (auto system : SystemList) { + system->Shutdown(); + } } void App::Launch() { - while (true) { + Init(); + while (Loop) { Update(); Render(); } diff --git a/engine/src/engine/app.h b/engine/src/engine/app.h index 397a083..cf2bec3 100644 --- a/engine/src/engine/app.h +++ b/engine/src/engine/app.h @@ -1,19 +1,22 @@ #pragma once #include +#include +#include "singleton.h" +using std::vector; using std::string; namespace engineapi { - class RenderAPI; - class Window; class App { public: - RenderAPI* _RenderAPI{nullptr}; - Window* _Window{ nullptr }; + bool Loop{true}; + vector SystemList; public: App(const string& path); ~App(); - void Launch(); public: + void Init(); + void Shutdown(); + void Launch(); void Update(); void Render(); }; diff --git a/engine/src/engine/asset/asset.h b/engine/src/engine/asset/asset.h index f7e127b..1dd097e 100644 --- a/engine/src/engine/asset/asset.h +++ b/engine/src/engine/asset/asset.h @@ -3,11 +3,15 @@ #include #include #include +#include "zstd/table.h" +#include "UTemplate/Type.hpp" namespace engineapi { using std::string; using std::vector; using std::map; + using zstd::table; + using Ubpa::Name; class Asset { public: friend class AssetManager; diff --git a/engine/src/engine/asset/asset_manager.cpp b/engine/src/engine/asset/asset_manager.cpp index 02356da..91884e6 100644 --- a/engine/src/engine/asset/asset_manager.cpp +++ b/engine/src/engine/asset/asset_manager.cpp @@ -2,6 +2,12 @@ #include "zlog.h" using namespace std; namespace engineapi { + void AssetManager::Init() + { + } + void AssetManager::Shutdown() + { + } void AssetManager::ClearAsset(Asset* asset) { auto it = mAssetMap.find(asset->mName); diff --git a/engine/src/engine/asset/asset_manager.h b/engine/src/engine/asset/asset_manager.h index 040ca5f..dff34d3 100644 --- a/engine/src/engine/asset/asset_manager.h +++ b/engine/src/engine/asset/asset_manager.h @@ -9,7 +9,7 @@ using json = nlohmann::json; namespace engineapi { - class AssetManager : public Singleton + class AssetManager : public ISingleton { public: struct AssetWrap { @@ -22,6 +22,9 @@ namespace engineapi private: map mAssetMap; + public: + void Init() override; + void Shutdown() override; public: void ClearAsset(Asset* asset); template @@ -55,5 +58,3 @@ namespace engineapi static json LoadJsonFile(const string& path); }; } -template<> -engineapi::AssetManager* Singleton::ms_Singleton = nullptr; diff --git a/engine/src/engine/data/property/property.cpp b/engine/src/engine/data/property/property.cpp index 47ea42b..503c206 100644 --- a/engine/src/engine/data/property/property.cpp +++ b/engine/src/engine/data/property/property.cpp @@ -1,5 +1,5 @@ #include "property.h" namespace engineapi { - map Property::PropertyMap; + } \ No newline at end of file diff --git a/engine/src/engine/data/property/property.h b/engine/src/engine/data/property/property.h index d322651..bf27f49 100644 --- a/engine/src/engine/data/property/property.h +++ b/engine/src/engine/data/property/property.h @@ -1,11 +1,11 @@ #pragma once #include #include -#include +#include "zstd/table.h" namespace engineapi { using std::string; using std::vector; - using std::map; + using zstd::table; class Property { public: enum { @@ -17,7 +17,7 @@ namespace engineapi { uint32_t flags = 0; string path = ""; public: - static map PropertyMap; + inline static table PropertyMap; template static TProperty* GetProperty(uint32_t id) { diff --git a/engine/src/engine/object/scene/scene_manager.cpp b/engine/src/engine/object/scene/scene_manager.cpp index 3344954..db726da 100644 --- a/engine/src/engine/object/scene/scene_manager.cpp +++ b/engine/src/engine/object/scene/scene_manager.cpp @@ -1,7 +1,7 @@ #include "scene_manager.h" #include "zlog.h" namespace engineapi { - Scene* SceneManager::GetScene(const string& name) + Scene* SceneManager::GetScene(const Name& name) { auto sceneInfo = GetSceneInfo(name); if (sceneInfo == nullptr) @@ -14,7 +14,7 @@ namespace engineapi { } } - void SceneManager::LoadScene(const string& path, bool switchNow) + void SceneManager::LoadScene(const Name& path, bool switchNow) { curScene = new SceneInfo{ path, @@ -22,14 +22,14 @@ namespace engineapi { }; } - void SceneManager::SwitchScene(const string& name) + void SceneManager::SwitchScene(const Name& name) { } - void SceneManager::DeleteScene(const string& name) + void SceneManager::DeleteScene(const Name& name) { - map::iterator iter = scenes.find(name); + auto iter = scenes.find(name); if (iter != scenes.end()) { delete iter->second->scene; @@ -73,9 +73,9 @@ namespace engineapi { return curScene->scene; } - SceneInfo* SceneManager::GetSceneInfo(const string& name) + SceneInfo* SceneManager::GetSceneInfo(const Name& name) { - map::iterator iter = scenes.find(name); + auto iter = scenes.find(name); if (iter != scenes.end()) return iter->second; else diff --git a/engine/src/engine/object/scene/scene_manager.h b/engine/src/engine/object/scene/scene_manager.h index 8114360..165ae57 100644 --- a/engine/src/engine/object/scene/scene_manager.h +++ b/engine/src/engine/object/scene/scene_manager.h @@ -5,25 +5,23 @@ namespace engineapi { struct SceneInfo { - string path; + Name name; Scene* scene = nullptr; }; - class SceneManager :public Singleton { + class SceneManager :public ISingleton { protected: SceneInfo* curScene = nullptr; - map scenes; + table scenes; public: - Scene* GetScene(const string& name); - void LoadScene(const string& path, bool switchNow = true); - void SwitchScene(const string& name); - void DeleteScene(const string& name); + Scene* GetScene(const Name& name); + void LoadScene(const Name& path, bool switchNow = true); + void SwitchScene(const Name& name); + void DeleteScene(const Name& name); void DeleteAllScene(); void ReloadScene(); void Render(); void Update(); Scene* GetCurScene(); - SceneInfo* GetSceneInfo(const string& name); + SceneInfo* GetSceneInfo(const Name& name); }; -} -template<> -engineapi::SceneManager* Singleton::ms_Singleton = nullptr; \ No newline at end of file +} \ No newline at end of file diff --git a/engine/src/engine/render/meta/vertex.h b/engine/src/engine/render/meta/vertex.h index 41058cf..d941b2d 100644 --- a/engine/src/engine/render/meta/vertex.h +++ b/engine/src/engine/render/meta/vertex.h @@ -9,8 +9,7 @@ namespace engineapi { struct Vertex { }; - - struct PosVertex { + struct PosVertex : public Vertex { using MyMetas = class PosVertex_MultyMeta; UPROPERTY_vk({}, VertexMeta{ VK_FORMAT_R32G32B32_SFLOAT }) Vector3 Position = {}; diff --git a/engine/src/engine/render/node/rendernode_forward.cpp b/engine/src/engine/render/node/rendernode_forward.cpp index 9888096..867aa3e 100644 --- a/engine/src/engine/render/node/rendernode_forward.cpp +++ b/engine/src/engine/render/node/rendernode_forward.cpp @@ -44,7 +44,7 @@ namespace engineapi { //RenderAPI::GetInstance()->Draw(skyBox->VAO); } - void RenderNodeForwardRendering::RenderBatches(const map>& batchs) + void RenderNodeForwardRendering::RenderBatches(const table>& batchs) { } diff --git a/engine/src/engine/render/node/rendernode_forward.h b/engine/src/engine/render/node/rendernode_forward.h index 07cc329..0b3f5e3 100644 --- a/engine/src/engine/render/node/rendernode_forward.h +++ b/engine/src/engine/render/node/rendernode_forward.h @@ -16,6 +16,6 @@ namespace engineapi { Model* mSky; void RenderSkyBox(Camera& camera); - void RenderBatches(const map>& batchs); + void RenderBatches(const table>& batchs); }; } \ No newline at end of file diff --git a/engine/src/engine/render/renderapi.cpp b/engine/src/engine/render/renderapi.cpp index 970569a..4dc2a27 100644 --- a/engine/src/engine/render/renderapi.cpp +++ b/engine/src/engine/render/renderapi.cpp @@ -9,7 +9,7 @@ namespace engineapi { { } - void RenderAPI::OnInit() + void RenderAPI::Init() { InitRenderNode(); InitRenderPass(); diff --git a/engine/src/engine/render/renderapi.h b/engine/src/engine/render/renderapi.h index 36b50e8..bd6af82 100644 --- a/engine/src/engine/render/renderapi.h +++ b/engine/src/engine/render/renderapi.h @@ -7,7 +7,7 @@ namespace engineapi class Shader; class Camera; class RenderNode; - class RenderAPI : public Singleton + class RenderAPI : public ISingleton { protected: uint32_t mFrame; @@ -19,11 +19,13 @@ namespace engineapi RenderAPI(); virtual ~RenderAPI() {}; public: - virtual RenderContext* GetContext() = 0; - public: - virtual void OnInit(); + void Init() override; + void Shutdown() override {}; + virtual void InitRenderNode(); virtual void InitRenderPass() = 0; + public: + virtual RenderContext* GetContext() = 0; public: virtual void SetViewPort(uint32_t width, uint32_t height, uint32_t xOffset = 0, uint32_t yOffset = 0) = 0; virtual void BeginFrame() = 0; @@ -39,6 +41,4 @@ namespace engineapi public: static RenderAPI* MakeInstance(); }; -} -template<> -engineapi::RenderAPI* Singleton::ms_Singleton = nullptr; \ No newline at end of file +} \ No newline at end of file diff --git a/engine/src/engine/render/window.h b/engine/src/engine/render/window.h index 32e286f..6e1510d 100644 --- a/engine/src/engine/render/window.h +++ b/engine/src/engine/render/window.h @@ -3,7 +3,7 @@ #include #include "singleton.h" namespace engineapi { - class Window : public Singleton { + class Window : public ISingleton { protected: int mWidth; int mHeight; @@ -29,6 +29,9 @@ namespace engineapi { static LRESULT CALLBACK HandleMsgSetup(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) noexcept; static LRESULT CALLBACK HandleMsgThunk(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) noexcept; LRESULT HandleMsg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) noexcept; + public: + void Init() override {}; + void Shutdown() override {}; public: Window(int width, int height, const char* title); HWND Ptr() { @@ -42,6 +45,4 @@ namespace engineapi { static bool ProcessMessages(int& code); static Window* MakeInstance(int frames, uint32_t width, uint32_t height, const char* title); }; -}; -template<> -engineapi::Window* Singleton::ms_Singleton = nullptr; \ No newline at end of file +}; \ No newline at end of file diff --git a/engine/src/engine/vulkanapi/backend.h b/engine/src/engine/vulkanapi/backend.h index 321cb07..a95dfbe 100644 --- a/engine/src/engine/vulkanapi/backend.h +++ b/engine/src/engine/vulkanapi/backend.h @@ -11,7 +11,7 @@ namespace vulkanapi { Instance* mInstance; Device* mDevice; DescriptorPool* mPool; - map mWorkerMap; + table mWorkerMap; public: Instance& GetInstance() { return *mInstance; diff --git a/engine/src/engine/vulkanapi/tool/glsl_loader.cpp b/engine/src/engine/vulkanapi/tool/glsl_loader.cpp new file mode 100644 index 0000000..e69de29 diff --git a/engine/src/engine/vulkanapi/tool/glsl_loader.h b/engine/src/engine/vulkanapi/tool/glsl_loader.h new file mode 100644 index 0000000..e69de29 diff --git a/engine/src/engine/vulkanapi/vulkan.h b/engine/src/engine/vulkanapi/vulkan.h index 7ecc24e..58ac31f 100644 --- a/engine/src/engine/vulkanapi/vulkan.h +++ b/engine/src/engine/vulkanapi/vulkan.h @@ -5,7 +5,7 @@ #include "volk.h" #include #include -#include +#include "zstd/table.h" namespace vulkanapi { #define Z_USE_GRAPHIC_DEBUG class CommandBuffer; @@ -13,7 +13,7 @@ using std::array; using std::string; using std::to_string; using std::vector; -using std::map; +using zstd::table; using std::make_pair; using voidFn = std::function; using commandFn = std::function; diff --git a/engine/src/engine/vulkanapi/vulkan_struct.h b/engine/src/engine/vulkanapi/vulkan_struct.h index 79c1b93..a14d8ea 100644 --- a/engine/src/engine/vulkanapi/vulkan_struct.h +++ b/engine/src/engine/vulkanapi/vulkan_struct.h @@ -8,7 +8,7 @@ using engineapi::Matrix4; using engineapi::FrameBufferType; using engineapi::ClearInfo; using engineapi::CommandType; -#define ShaderModuleSet map +#define ShaderModuleSet table namespace vulkanapi { diff --git a/engine/src/engine/vulkanapi/wrapper/device.h b/engine/src/engine/vulkanapi/wrapper/device.h index 5a18f1c..68dc0bb 100644 --- a/engine/src/engine/vulkanapi/wrapper/device.h +++ b/engine/src/engine/vulkanapi/wrapper/device.h @@ -9,7 +9,7 @@ namespace vulkanapi { protected: VkDevice mPtr{ NULL }; VkPhysicalDevice mPhysical{NULL}; - map mQueueMap; + table mQueueMap; public: VkDevice& Ptr() { return mPtr; diff --git a/engine/xmake/gen/meta_refl.lua b/engine/xmake/gen/meta_refl.lua index 47c8a7a..2e4a65f 100644 --- a/engine/xmake/gen/meta_refl.lua +++ b/engine/xmake/gen/meta_refl.lua @@ -15,7 +15,7 @@ function cmd_compile(genfile, sourcefile, template, macro, define) table.insert(argv, define) end print("cmd_meta_compile", genfile) - os.runv(meta.program, argv) + os.execv(meta.program, argv) return argv end