diff --git a/engine/3rdparty/zlib/include/meta/result.h b/engine/3rdparty/zlib/include/meta/result.h new file mode 100644 index 0000000..8698570 --- /dev/null +++ b/engine/3rdparty/zlib/include/meta/result.h @@ -0,0 +1,45 @@ +#pragma once +#include +#include + +namespace meta +{ + // a struct stolen from rust + // lets us define a result, or return an error otherwise + template + class result + : protected std::variant + { + protected: + using Base = std::variant; + private: + static constexpr auto Success = 0; + static constexpr auto Failure = 1; + static_assert(std::is_default_constructible_v, "Error must be default constructible"); + public: + using value_type = Result; + using Base::Base; + using Base::operator=; + + // accessors + Result& value(); + template>> + Result value_or(U&& result) const; + Error& error(); + const Result& value() const; + const Error& error() const; + + // monadic operators + template auto map(Fn&& visitor) const; + template auto and_then(Fn&& visitor) const; + template auto and_then(Fn&& visitor, ErrFn&& err_visitor) const; + template auto or_else(ErrFunc&& err_visitor) const; + + // operator overloads + explicit operator bool() const; + Result& operator*(); + Result* operator->(); + const Result& operator*() const; + const Result* operator->() const; + }; +} \ No newline at end of file diff --git a/engine/3rdparty/zlib/include/meta/result.inl b/engine/3rdparty/zlib/include/meta/result.inl new file mode 100644 index 0000000..b789f74 --- /dev/null +++ b/engine/3rdparty/zlib/include/meta/result.inl @@ -0,0 +1,57 @@ +#include "result.h" +#pragma once + +namespace meta +{ + template + inline Result& result::value() + { + return std::get(*this); + } + template + template + Result result::value_or(U&& result) const + { + return bool(*this) ? **this : static_cast(std::forward(result)); + } + template + inline Error& result::error() + { + return std::get(*this); + } + template + inline const Result& result::value() const + { + return std::get(*this); + } + template + inline const Error& result::error() const + { + return std::get(*this); + } + template + inline result::operator bool() const + { + return Base::index() == Success; + } + template + inline Result& result::operator*() + { + return value(); + } + template + inline Result* result::operator->() + { + return &operator*(); + } + template + const Result& result::operator*() const + { + return value(); + } + template + const Result* result::operator->() const + { + return &operator*(); + } +} \ No newline at end of file diff --git a/engine/3rdparty/zlib/include/yaml/yaml.h b/engine/3rdparty/zlib/include/yaml/yaml.h index 8ae2d83..149b783 100644 --- a/engine/3rdparty/zlib/include/yaml/yaml.h +++ b/engine/3rdparty/zlib/include/yaml/yaml.h @@ -1,16 +1,28 @@ #pragma once #include "serialize/binary.inl" #include "serialize/text.inl" +#include "meta/result.inl" namespace YAML { + using meta::result; + enum class SerializeError : char + { + TEXT_EMPTY, + TYPE_ERROR, + }; string Text_Serialize(const Any& any) { return Dump(TextArchive::Serialize(any)); } template - T Text_Unserialize(const string& text) { + result Text_Unserialize(const string& text) { + if (text.empty()) { + return SerializeError::TEXT_EMPTY; + } char data[sizeof(T)]; Any any(&data, &TypeInfo::StaticClass); - TextArchive::Unserialize(Load(text), any); + if (!TextArchive::Unserialize(Load(text), any)) { + return SerializeError::TYPE_ERROR; + } return *any.CastTo(); } } \ No newline at end of file diff --git a/engine/3rdparty/zlib/test/yaml/guid.h b/engine/3rdparty/zlib/test/yaml/guid.h index fec60e3..fd863b8 100644 --- a/engine/3rdparty/zlib/test/yaml/guid.h +++ b/engine/3rdparty/zlib/test/yaml/guid.h @@ -1,5 +1,9 @@ #include "refl/refl.h" -#include +#include +#include +#include +using std::string; +using std::vector; struct Guid { using MyMeta = class Guid_Meta; @@ -61,4 +65,19 @@ struct Guid return guid; } }; +struct SerializedMeta +{ + Guid guid; + string name; + string t_hash{}; + string metadata; +}; +struct ResourceBundle; + +struct MetaBundle +{ + vector metadatas; + + MetaBundle() = default; +}; #include "guid_gen.inl" \ No newline at end of file diff --git a/engine/3rdparty/zlib/test/yaml/main.cpp b/engine/3rdparty/zlib/test/yaml/main.cpp index e997266..55a47a4 100644 --- a/engine/3rdparty/zlib/test/yaml/main.cpp +++ b/engine/3rdparty/zlib/test/yaml/main.cpp @@ -11,8 +11,13 @@ int main() { string rx = YAML::Text_Serialize(x); string rg1 = YAML::Text_Serialize(g1); YAML::Node rg2 = YAML::Load(rg1); - Guid g2 = YAML::Text_Unserialize(rg1); + auto res1 = YAML::Text_Unserialize(rg1); + Guid g2 = res1.value(); assert(g1 == g2); + auto res2 = YAML::Text_Unserialize(rg1); + if (res2) { + MetaBundle aa = res2.value(); + } std::cout << rg1 << std::endl; YAML::Node primes = YAML::Load("[2, 3, 5, 7, 11]"); for (std::size_t i = 0; i < primes.size(); i++) { diff --git a/engine/3rdparty/zlog/test/01file.cpp b/engine/3rdparty/zlog/test/01file.cpp index b5b0d8f..2bc7556 100644 --- a/engine/3rdparty/zlog/test/01file.cpp +++ b/engine/3rdparty/zlog/test/01file.cpp @@ -1,12 +1,8 @@ #include #include "zlog.h" -#include "singleton.h" -#include "assetmanager.h" int main() { zlog::info("hello info"); zlog::warn("hello {}", "warn"); zlog::error("hello {}", "error"); - AssetManager re; - AssetManager::GetSingleton().GetSingleton(); return 0; } diff --git a/engine/3rdparty/zlog/test/assetmanager.cpp b/engine/3rdparty/zlog/test/assetmanager.cpp deleted file mode 100644 index 4ebd015..0000000 --- a/engine/3rdparty/zlog/test/assetmanager.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "assetmanager.h" diff --git a/engine/3rdparty/zlog/test/assetmanager.h b/engine/3rdparty/zlog/test/assetmanager.h deleted file mode 100644 index 251896d..0000000 --- a/engine/3rdparty/zlog/test/assetmanager.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -#include "singleton.h" -class AssetManager :public ISingleton { - -}; \ No newline at end of file diff --git a/engine/3rdparty/zlog/test/singleton.h b/engine/3rdparty/zlog/test/singleton.h deleted file mode 100644 index 6532128..0000000 --- a/engine/3rdparty/zlog/test/singleton.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -template -class Singleton { -protected: - static T* ms_Singleton; -public: - explicit Singleton() { - ms_Singleton = static_cast(this); - } - ~Singleton() { - ms_Singleton = nullptr; - } - static T& GetSingleton(void) { - return *ms_Singleton; - } - static T* GetSingletonPtr(void) { - return ms_Singleton; - } -}; \ No newline at end of file diff --git a/engine/3rdparty/zlog/xmake.lua b/engine/3rdparty/zlog/xmake.lua index 76e86f0..75662bb 100644 --- a/engine/3rdparty/zlog/xmake.lua +++ b/engine/3rdparty/zlog/xmake.lua @@ -6,9 +6,8 @@ target("zlog") add_files("src/*.cpp") add_headerfiles("include/*.h") -target("zlog_test01_file") - set_languages("cxx20") - set_kind("binary") - add_deps("zlog") - add_files("test/*.cpp") - add_headerfiles("test/*.h") \ No newline at end of file +-- target("zlog_test01_file") +-- set_languages("cxx20") +-- set_kind("binary") +-- add_deps("zlog") +-- add_files("test/*.cpp") \ No newline at end of file diff --git a/engine/src/engine/asset/resource_manager.cpp b/engine/src/engine/asset/resource_manager.cpp index 697ff3d..765c1f4 100644 --- a/engine/src/engine/asset/resource_manager.cpp +++ b/engine/src/engine/asset/resource_manager.cpp @@ -1,6 +1,5 @@ #include "resource_manager.inl" #include "file_manager.h" -#include "yaml/yaml.h" namespace engineapi { void ResourceManager::Init() { @@ -19,7 +18,7 @@ namespace engineapi { return nullptr; return itr->second; } - ResourceBundle ResourceManager::Load(PackagePath path, bool reload_resource) + LoadResult ResourceManager::Load(PackagePath path, bool reload_resource) { auto ext = path.GetExtension(); auto* loader = GetLoader(ext); @@ -30,9 +29,7 @@ namespace engineapi { MetaBundle ResourceManager::GetMeta(PackagePath path) { - auto bundlestream = FileManager::LoadTextFile(path.AbsolutePath() + ".meta"); - auto meta = YAML::Text_Unserialize(bundlestream); - return meta; + return {}; } } diff --git a/engine/src/engine/asset/resource_manager.h b/engine/src/engine/asset/resource_manager.h index a345b62..39770b2 100644 --- a/engine/src/engine/asset/resource_manager.h +++ b/engine/src/engine/asset/resource_manager.h @@ -4,14 +4,32 @@ #include "res/resource_bundle.h" #include "res/package_path.h" #include "res/meta_bundle.h" +#include "meta/result.inl" #include #include namespace engineapi { using std::array; using std::shared_ptr; class IFileLoader; + enum class ResourceLoadError : char + { + ExtensionNotRegistered, + FileDoesNotExist, + FailedToLoadResource, + }; + template + using LoadResult = result; class ResourceManager : public ISingleton { + public: + template + struct ResourceControlBlock; + template + using ResourceStorage = hash_table>; + using GenericPtr = shared_ptr; + private: + array mResourceTable; + hash_table mFileLoader; public: void Init() override; void Shutdown() override; @@ -26,18 +44,9 @@ namespace engineapi { FLoader& RegisterLoader(Name ext, Args&& ... args); template - Res* Load(PackagePath path, bool reload_resource = true); - ResourceBundle Load(PackagePath path, bool reload_resource = true); + LoadResult Load(PackagePath path, bool reload_resource = true); + LoadResult Load(PackagePath path, bool reload_resource = true); MetaBundle GetMeta(PackagePath path); - template - struct ResourceControlBlock; - template - using ResourceStorage = hash_table>; - - using GenericPtr = shared_ptr; - private: - array mResourceTable; - hash_table mFileLoader; }; template struct ResourceManager::ResourceControlBlock diff --git a/engine/src/engine/asset/resource_manager.inl b/engine/src/engine/asset/resource_manager.inl index 4e9f3dd..e1cbbb7 100644 --- a/engine/src/engine/asset/resource_manager.inl +++ b/engine/src/engine/asset/resource_manager.inl @@ -42,7 +42,7 @@ namespace engineapi { return *ptr; } template - inline Res* ResourceManager::Load(PackagePath path, bool reload_resource) + inline LoadResult ResourceManager::Load(PackagePath path, bool reload_resource) { auto res = Load(path, reload_resource); if (!res) diff --git a/engine/src/main.cpp b/engine/src/main.cpp index 349e943..0cb765b 100644 --- a/engine/src/main.cpp +++ b/engine/src/main.cpp @@ -4,6 +4,7 @@ #include "asset/resource_manager.h" #include "vulkanapi/loader/vulkan_glsl_loader.h" #include "zlog.h" +#include "yaml/yaml.h" using namespace engineapi; int main(int argc, char** argv) { diff --git a/engine/xmake.lua b/engine/xmake.lua index 3048e66..cf64687 100644 --- a/engine/xmake.lua +++ b/engine/xmake.lua @@ -9,7 +9,7 @@ target("zengine") add_rules("c++.codegen",{ files = {"src/engine/render/meta/*.h", "src/engine/asset/res/guid.h"} }) - add_deps("zlib","zlog") + add_deps("zlog","zlib") add_defines("VULKAN_API") add_packages("vulkansdk","tinyobjloader","assimp","nlohmann_json") add_includedirs("src/engine")