From fc043a0a8d28d75e46a624ca8bf421553a18513b Mon Sep 17 00:00:00 2001 From: ouczbs Date: Sat, 15 Jun 2024 18:02:23 +0800 Subject: [PATCH] rebuild zengine --- engine/3rdparty/zlib/include/refl/macro.h | 3 + engine/src/engine/app.cpp | 3 + engine/src/engine/asset/asset.h | 3 +- engine/src/engine/asset/asset_manager.h | 1 + engine/src/engine/asset/file_manager.cpp | 9 ++- engine/src/engine/asset/file_manager.h | 7 +- engine/src/engine/asset/guid.h | 79 +++++++++++++++++++ engine/src/engine/asset/package_path.h | 2 +- engine/src/engine/asset/resource_config.h | 25 ++++++ engine/src/engine/asset/resource_manager.cpp | 0 engine/src/engine/asset/resource_manager.h | 4 + engine/src/engine/object/scene/scene.cpp | 6 +- .../src/engine/object/scene/scene_manager.cpp | 7 ++ .../src/engine/object/scene/scene_manager.h | 3 + engine/src/engine/render/asset/shader.cpp | 8 +- engine/xmake.lua | 4 +- 16 files changed, 148 insertions(+), 16 deletions(-) create mode 100644 engine/src/engine/asset/guid.h create mode 100644 engine/src/engine/asset/resource_config.h create mode 100644 engine/src/engine/asset/resource_manager.cpp create mode 100644 engine/src/engine/asset/resource_manager.h diff --git a/engine/3rdparty/zlib/include/refl/macro.h b/engine/3rdparty/zlib/include/refl/macro.h index af537b2..87597dc 100644 --- a/engine/3rdparty/zlib/include/refl/macro.h +++ b/engine/3rdparty/zlib/include/refl/macro.h @@ -1,6 +1,9 @@ #pragma once #if !defined(__cppast) #define __cppast(...) +#else +class string_view; +class string; #endif #define __Meta(...) __cppast(Meta,__VA_ARGS__) diff --git a/engine/src/engine/app.cpp b/engine/src/engine/app.cpp index bf0db4c..f4eb2ac 100644 --- a/engine/src/engine/app.cpp +++ b/engine/src/engine/app.cpp @@ -3,15 +3,18 @@ #include "render/window.h" #include "object/mesh/actor.h" #include "data/property/actor_property.h" +#include "asset/file_manager.h" #include "asset/asset_manager.h" #include "object/scene/scene_manager.h" namespace engineapi { App::App(const string& path) { const char* name = "zengine"; + SystemList.push_back(new FileManager()); SystemList.push_back(new AssetManager()); SystemList.push_back(RenderAPI::MakeInstance()); SystemList.push_back(Window::MakeInstance(3, 640, 720, name)); + SystemList.push_back(new SceneManager()); } App::~App() { diff --git a/engine/src/engine/asset/asset.h b/engine/src/engine/asset/asset.h index 0202572..0c06dad 100644 --- a/engine/src/engine/asset/asset.h +++ b/engine/src/engine/asset/asset.h @@ -1,8 +1,9 @@ #pragma once +#include "guid.h" +#include "package_path.h" #include #include #include -#include "package_path.h" namespace engineapi { using std::vector; diff --git a/engine/src/engine/asset/asset_manager.h b/engine/src/engine/asset/asset_manager.h index 562c725..c24f0cc 100644 --- a/engine/src/engine/asset/asset_manager.h +++ b/engine/src/engine/asset/asset_manager.h @@ -46,5 +46,6 @@ namespace engineapi AssetManager() = default; private: inline static table AssetMap; + inline static table AssetNext; }; } diff --git a/engine/src/engine/asset/file_manager.cpp b/engine/src/engine/asset/file_manager.cpp index def79b0..b1bc82c 100644 --- a/engine/src/engine/asset/file_manager.cpp +++ b/engine/src/engine/asset/file_manager.cpp @@ -5,9 +5,12 @@ using namespace std; namespace engineapi { void FileManager::Init() { + std::filesystem::path path = std::filesystem::current_path(); + Mount(string_view("engine"), path.string()); } void FileManager::Shutdown() { + } string FileManager::LoadTextFile(const string& path) { @@ -32,18 +35,18 @@ namespace engineapi { } vector FileManager::LoadBinaryFile(const string& path) { - // ate:在文件末尾开始读取,从文件末尾开始读取的优点是我们可以使用读取位置来确定文件的大小并分配缓冲区 + // ate:鍦ㄦ枃浠舵湯灏惧紑濮嬭鍙栵紝浠庢枃浠舵湯灏惧紑濮嬭鍙栫殑浼樼偣鏄垜浠彲浠ヤ娇鐢ㄨ鍙栦綅缃潵纭畾鏂囦欢鐨勫ぇ灏忓苟鍒嗛厤缂撳啿鍖 ifstream file(path, std::ios::ate | std::ios::binary); if (!file.is_open()) { zlog::info("Failed to load binary file: {}", path); return vector(); } - // 使用读取位置来确定文件的大小并分配缓冲区 + // 浣跨敤璇诲彇浣嶇疆鏉ョ‘瀹氭枃浠剁殑澶у皬骞跺垎閰嶇紦鍐插尯 size_t fileSize = (size_t)file.tellg(); vector data(fileSize); - // 返回文件开头,真正读取内容 + // 杩斿洖鏂囦欢寮澶达紝鐪熸璇诲彇鍐呭 file.seekg(0); file.read(data.data(), fileSize); file.close(); diff --git a/engine/src/engine/asset/file_manager.h b/engine/src/engine/asset/file_manager.h index 8409332..11a99ca 100644 --- a/engine/src/engine/asset/file_manager.h +++ b/engine/src/engine/asset/file_manager.h @@ -1,5 +1,5 @@ #pragma once -#include "package_path.h". +#include "asset.h" #include "singleton.h" #include namespace engineapi @@ -11,9 +11,12 @@ namespace engineapi void Init() override; void Shutdown() override; public: + static void Mount(NameID id, const string& path) { + MountMap.emplace(id, path); + } static string FindMount(NameID id) { auto it = MountMap.find(id); - if (it == MountMap.end()) { + if (it != MountMap.end()) { return it->second; } return ""; diff --git a/engine/src/engine/asset/guid.h b/engine/src/engine/asset/guid.h new file mode 100644 index 0000000..f8aa3c5 --- /dev/null +++ b/engine/src/engine/asset/guid.h @@ -0,0 +1,79 @@ +#pragma once +#include "refl/refl.h" +#include +#include +namespace engineapi +{ + using std::string; + using std::string_view; + struct Guid + { + using MyMeta = class Guid_Meta; + UPROPERTY({}) + unsigned int Data1; + UPROPERTY({}) + unsigned short Data2; + UPROPERTY({}) + unsigned short Data3; + UPROPERTY({}) + unsigned char Data4[8]; + constexpr Guid() noexcept + : Data1{ 0 }, Data2{ 0 }, Data3{ 0 }, Data4{ 0,0,0,0,0,0,0,0 } + {} + UFUNCTION({}) + Guid(const string_view& str) noexcept + : Guid{} + { + sscanf_s(str.data(), + "%8x-%4hx-%4hx-%2hhx%2hhx-%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx", + &Data1, &Data2, &Data3, + &Data4[0], &Data4[1], &Data4[2], &Data4[3], + &Data4[4], &Data4[5], &Data4[6], &Data4[7]); + + } + constexpr Guid(unsigned int a, unsigned short b, unsigned short c, unsigned long long d) + : Data1{ a } + , Data2{ b } + , Data3{ c } + , Data4{ + (unsigned char)(d >> 56 & 0xFF) + , (unsigned char)(d >> 48 & 0xFF) + , (unsigned char)(d >> 40 & 0xFF) + , (unsigned char)(d >> 32 & 0xFF) + , (unsigned char)(d >> 24 & 0xFF) + , (unsigned char)(d >> 16 & 0xFF) + , (unsigned char)(d >> 8 & 0xFF) + , (unsigned char)(d >> 0 & 0xFF) + } + {}; + UFUNCTION({}) + string ToString()const { + char guid_cstr[39]; + snprintf(guid_cstr, sizeof(guid_cstr), + "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", + Data1, Data2, Data3, + Data4[0], Data4[1], Data4[2], Data4[3], + Data4[4], Data4[5], Data4[6], Data4[7]); + return string{ guid_cstr }; + } + public: + auto operator<=>(const Guid&) const noexcept = default; + operator bool() const noexcept + { + return *reinterpret_cast(this) != GUID_NULL; + } + operator string() const + { + return ToString(); + } + public: + UFUNCTION({}) + static Guid Make() + { + Guid guid; + const auto res = CoCreateGuid((GUID*)&guid); + return guid; + } + }; +} +#include "guid_gen.inl" \ No newline at end of file diff --git a/engine/src/engine/asset/package_path.h b/engine/src/engine/asset/package_path.h index df2b41f..91361a1 100644 --- a/engine/src/engine/asset/package_path.h +++ b/engine/src/engine/asset/package_path.h @@ -16,7 +16,7 @@ namespace engineapi PackagePath(const string& path) : path(StringView(path)) {}; PackagePath(const string&& path) : path(path) {} bool CheckPackage() { - if (name.empty()) { + if (!name.empty()) { return true; } if (path[0] == '/') { diff --git a/engine/src/engine/asset/resource_config.h b/engine/src/engine/asset/resource_config.h new file mode 100644 index 0000000..b7f5b80 --- /dev/null +++ b/engine/src/engine/asset/resource_config.h @@ -0,0 +1,25 @@ +#pragma once +#include +namespace engineapi { + template + constexpr uint8_t index_in_tuple() { + constexpr std::size_t N = std::tuple_size_v; + for (std::size_t i = 0; i < N; ++i) { + if constexpr (is_same>::value) { + return i; + } + } + return N; + } + + template + constexpr uint8_t index_in_tuple_v = index_in_tuple(); + + using Resources = std::tuple< + class Scene + , class Shader + >; + template + constexpr auto ResourceID = index_in_tuple_v; + constexpr auto ResourceCount = std::tuple_size_v; +} \ No newline at end of file diff --git a/engine/src/engine/asset/resource_manager.cpp b/engine/src/engine/asset/resource_manager.cpp new file mode 100644 index 0000000..e69de29 diff --git a/engine/src/engine/asset/resource_manager.h b/engine/src/engine/asset/resource_manager.h new file mode 100644 index 0000000..bb80e48 --- /dev/null +++ b/engine/src/engine/asset/resource_manager.h @@ -0,0 +1,4 @@ +#pragma once +namespace engineapi { + +} \ No newline at end of file diff --git a/engine/src/engine/object/scene/scene.cpp b/engine/src/engine/object/scene/scene.cpp index 1227f70..bc03cac 100644 --- a/engine/src/engine/object/scene/scene.cpp +++ b/engine/src/engine/object/scene/scene.cpp @@ -8,12 +8,12 @@ namespace engineapi { { mCamera = new Camera(); auto flags = Asset::ASSET_SHARED_FLAG | Asset::ASSET_ASYNC_FLAG; - Material* material = new Material("assets/shader/simple", flags); + Material* material = new Material("/engine/assets/shader/simple", flags); { ActorProperty property; property.id = 1; property.flags = flags; - property.path = "assets/models/cube.obj"; + property.path = "/engine/assets/models/cube.obj"; actor1 = ActorMesh::New(property); actor1->Ptr().SetMaterial(material); } @@ -21,7 +21,7 @@ namespace engineapi { ActorProperty property; property.id = 1; property.flags = flags; - property.path = "assets/models/box.ply"; + property.path = "/engine/assets/models/box.ply"; actor2 = ActorMesh::New(property); actor2->Ptr().SetMaterial(material); } diff --git a/engine/src/engine/object/scene/scene_manager.cpp b/engine/src/engine/object/scene/scene_manager.cpp index c1659f2..ec6fc79 100644 --- a/engine/src/engine/object/scene/scene_manager.cpp +++ b/engine/src/engine/object/scene/scene_manager.cpp @@ -1,6 +1,13 @@ #include "scene_manager.h" #include "zlog.h" namespace engineapi { + void SceneManager::Init() + { + LoadScene("hello", true); + } + void SceneManager::Shutdown() + { + } Scene* SceneManager::GetScene(const Name& name) { auto sceneInfo = GetSceneInfo(name); diff --git a/engine/src/engine/object/scene/scene_manager.h b/engine/src/engine/object/scene/scene_manager.h index 165ae57..a993fa7 100644 --- a/engine/src/engine/object/scene/scene_manager.h +++ b/engine/src/engine/object/scene/scene_manager.h @@ -12,6 +12,9 @@ namespace engineapi { protected: SceneInfo* curScene = nullptr; table scenes; + public: + void Init() override; + void Shutdown() override; public: Scene* GetScene(const Name& name); void LoadScene(const Name& path, bool switchNow = true); diff --git a/engine/src/engine/render/asset/shader.cpp b/engine/src/engine/render/asset/shader.cpp index 824e70f..200a52b 100644 --- a/engine/src/engine/render/asset/shader.cpp +++ b/engine/src/engine/render/asset/shader.cpp @@ -1,5 +1,5 @@ #include "shader.h" -#include "asset/asset_manager.h" +#include "asset/file_manager.h" #include "../renderapi.h" namespace engineapi { Shader::Shader(string_view name, uint32_t flags) @@ -12,17 +12,17 @@ namespace engineapi { } void Shader::BeginLoad() { - json data = AssetManager::LoadJsonFile(string(mName) + ".json"); + json data = FileManager::LoadJsonFile(PackagePath::AbsolutePath(mName) + ".json"); RenderAPI::GetSingletonPtr()->LoadShader(this); //ShaderProperty //mInfo.vertProperties.baseProperties.push_back } vector Shader::GetVertData() { - return AssetManager::LoadBinaryFile(string(mName) + ".vert.spv"); + return FileManager::LoadBinaryFile(PackagePath::AbsolutePath(mName) + ".vert.spv"); } vector Shader::GetFragData() { - return AssetManager::LoadBinaryFile(string(mName) + ".frag.spv"); + return FileManager::LoadBinaryFile(PackagePath::AbsolutePath(mName) + ".frag.spv"); } } diff --git a/engine/xmake.lua b/engine/xmake.lua index 04550a4..5f0094f 100644 --- a/engine/xmake.lua +++ b/engine/xmake.lua @@ -7,14 +7,14 @@ target("zengine") set_rundir(".") add_rules("volk.env", "glsl.env") add_rules("c++.codegen",{ - files = {"src/engine/render/meta/*.h"} + files = {"src/engine/render/meta/*.h", "src/engine/asset/guid.h"} }) add_deps("zlib","zlog") add_defines("VULKAN_API") add_packages("vulkansdk","tinyobjloader","assimp","nlohmann_json") add_includedirs("src/engine") add_includedirs("src/3rdparty/volk", "src/3rdparty/vulkan-memory-allocator", "src/3rdparty/template") - add_syslinks("user32") + add_syslinks("user32", "Ole32") add_files("src/*.cpp", "src/**.cpp") add_files("src/3rdparty/**.c") add_headerfiles("src/**.h")