From d1311b829d064308782388ec66ae1187b0afe831 Mon Sep 17 00:00:00 2001 From: ouczbs Date: Fri, 21 Jun 2024 22:21:32 +0800 Subject: [PATCH] refl support overload --- .../3rdparty/zlib/include/refl/detail/meta.h | 2 +- .../zlib/include/refl/detail/meta.inl | 10 +- .../3rdparty/zlib/include/refl/detail/type.h | 37 +++-- .../zlib/include/refl/detail/uclass.inl | 20 +-- engine/3rdparty/zlib/include/refl/macro.h | 28 +++- engine/3rdparty/zlib/include/refl/refl.h | 38 ----- engine/3rdparty/zlib/test/refl/vertex.h | 1 - engine/3rdparty/zlib/test/yaml/guid.h | 148 +++++++++--------- engine/3rdparty/zlib/test/yaml/main.cpp | 11 +- engine/3rdparty/zlib/xmake.lua | 1 + engine/src/engine/asset/res/guid.h | 6 +- engine/src/engine/asset/res/package_path.h | 7 +- engine/src/engine/asset/resource_manager.cpp | 6 + engine/src/engine/render/meta/vertex.h | 3 - engine/src/main.cpp | 3 +- 15 files changed, 155 insertions(+), 166 deletions(-) diff --git a/engine/3rdparty/zlib/include/refl/detail/meta.h b/engine/3rdparty/zlib/include/refl/detail/meta.h index e7e976a..ea51959 100644 --- a/engine/3rdparty/zlib/include/refl/detail/meta.h +++ b/engine/3rdparty/zlib/include/refl/detail/meta.h @@ -29,7 +29,7 @@ namespace refl { META_UI_FLAG = 1 << 0, }; class UClass; - class Meta { + class MetaHelp { public: template static FieldPtr CtorField(char*& memory, const MethodData& data = {}); diff --git a/engine/3rdparty/zlib/include/refl/detail/meta.inl b/engine/3rdparty/zlib/include/refl/detail/meta.inl index 2ed4d63..025141e 100644 --- a/engine/3rdparty/zlib/include/refl/detail/meta.inl +++ b/engine/3rdparty/zlib/include/refl/detail/meta.inl @@ -8,7 +8,7 @@ namespace refl { new (mem) T(std::forward(args)...); } template - inline FieldPtr Meta::CtorField(char*& memory, const MethodData& data) + inline FieldPtr MetaHelp::CtorField(char*& memory, const MethodData& data) { MethodData method; uint32_t flag = FIELD_MEMBER_FLAG | FIELD_CTOR_FLAG; @@ -28,7 +28,7 @@ namespace refl { return { FName("Ctor"), cls, method,flag}; } template - inline FieldPtr Meta::MemberField(T Obj::* ptr, const Name& name, char*& memory, const MemberData& data) + inline FieldPtr MetaHelp::MemberField(T Obj::* ptr, const Name& name, char*& memory, const MemberData& data) { MemberData member; auto cls = &TypeInfo::StaticClass; @@ -47,7 +47,7 @@ namespace refl { return { name, cls, member,flag}; } template - inline FieldPtr Meta::MethodField(R(*ptr)(Args...), const Name& name, char*& memory, const MethodData& data) + inline FieldPtr MetaHelp::MethodField(R(*ptr)(Args...), const Name& name, char*& memory, const MethodData& data) { MethodData method; uint32_t flag = FIELD_METHOD_FLAG; @@ -67,7 +67,7 @@ namespace refl { return { name, cls, method,flag }; } template - inline FieldPtr Meta::MethodField(R(T::*ptr)(Args...),const Name& name, char*& memory, const MethodData& data) + inline FieldPtr MetaHelp::MethodField(R(T::*ptr)(Args...),const Name& name, char*& memory, const MethodData& data) { MethodData method; uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG; @@ -87,7 +87,7 @@ namespace refl { return { name, cls, method,flag }; } template - inline FieldPtr Meta::MethodField(R(T::* ptr)(Args...)const, const Name& name, char*& memory, const MethodData& data) + inline FieldPtr MetaHelp::MethodField(R(T::* ptr)(Args...)const, const Name& name, char*& memory, const MethodData& data) { MethodData method; uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG; diff --git a/engine/3rdparty/zlib/include/refl/detail/type.h b/engine/3rdparty/zlib/include/refl/detail/type.h index be137d7..914c5fc 100644 --- a/engine/3rdparty/zlib/include/refl/detail/type.h +++ b/engine/3rdparty/zlib/include/refl/detail/type.h @@ -1,13 +1,28 @@ #pragma once #include +namespace refl_impl { + template + struct MetaImpl; + + template + struct _Multy; + + template + struct _Static; + + template + struct _Meta; +} namespace refl { - template - concept _ReflCheck_Meta = requires { typename T::MyStatic; typename T::MyUClass;}; + using refl_impl::MetaImpl; + + template + concept _ReflCheck_Parent = requires { typename MyMeta::Parent;} && std::is_same_v; template concept _ReflCheck_Ctor = requires { T(); }; template - concept _ReflCheck_UClass = _ReflCheck_Meta; + concept _ReflCheck_UClass = requires { typename MetaImpl::MyMeta; }; template concept _ReflCheck_Ctor_NoUClass = _ReflCheck_Ctor && !_ReflCheck_UClass; @@ -43,22 +58,6 @@ namespace refl { template using args_type_t = args_type>::type; - // meta_type 的主模板定义 - template - struct meta_type { - using type = typename T::MyMeta; - }; - - // 对满足 _ReflCheck_Meta 概念的类型进行重载 - template<_ReflCheck_Meta T> - struct meta_type { - using type = T; - }; - - // 类型别名模板 - template - using meta_type_t = typename meta_type::type; - //类型接口 template struct TypeInfoImpl; diff --git a/engine/3rdparty/zlib/include/refl/detail/uclass.inl b/engine/3rdparty/zlib/include/refl/detail/uclass.inl index 0c5e582..2460b73 100644 --- a/engine/3rdparty/zlib/include/refl/detail/uclass.inl +++ b/engine/3rdparty/zlib/include/refl/detail/uclass.inl @@ -2,6 +2,9 @@ #include #include "uclass.h" namespace refl { + template + concept _ReflCheck_Metas = requires(const Name & name) { MetaImpl::MyMetas::GetMeta(name); }; + template<_ReflCheck_Ctor T> class UClass_Auto : public UClass { public: @@ -20,8 +23,8 @@ namespace refl { else { cls.vtable.CtorObject = &MyUClass::CtorObject; } - if constexpr (requires {typename T::MyMetas; }) { - cls.vtable.GetMeta = &T::MyMetas::GetMeta; + if constexpr (_ReflCheck_Metas) { + cls.vtable.GetMeta = &MetaImpl::MyMetas::GetMeta; } return cls; } @@ -112,21 +115,20 @@ namespace refl { return cls; } }; - template + template class UClass_Meta : public UClass { public: - using MyMeta = meta_type_t; using FieldsType = decltype(MyMeta::__MakeFields()); FieldsType Fields{ MyMeta::__MakeFields() }; UClass_Meta() : UClass(type_name().View(), sizeof(T)){ if constexpr (std::is_trivially_copyable_v) { flag = CLASS_TRIVIAL_FLAG; } - if constexpr (!std::is_same_v) { - parent = &TypeInfo

::StaticClass; + if constexpr (_ReflCheck_Parent) { + parent = &TypeInfo::StaticClass; } - if constexpr (requires(const Name & name) { T::MyMetas::GetMeta(name); }) { - vtable.GetMeta = &T::MyMetas::GetMeta; + if constexpr (_ReflCheck_Metas) { + vtable.GetMeta = &MetaImpl::MyMetas::GetMeta; } vtable.GetFields = &UClass_Meta::GetFields; vtable.CtorObject = &UClass::CtorObject; @@ -200,7 +202,7 @@ namespace refl { }; template<_ReflCheck_UClass T> struct TypeInfoImpl { - using MyUClass = typename T::MyMeta::MyUClass; + using MyUClass = UClass_Meta::MyMeta>; inline static MyUClass StaticClass = MyUClass(); }; // 函数指针类型的偏特化 diff --git a/engine/3rdparty/zlib/include/refl/macro.h b/engine/3rdparty/zlib/include/refl/macro.h index 87597dc..084e7cb 100644 --- a/engine/3rdparty/zlib/include/refl/macro.h +++ b/engine/3rdparty/zlib/include/refl/macro.h @@ -1,19 +1,33 @@ #pragma once #if !defined(__cppast) #define __cppast(...) -#else -class string_view; -class string; #endif -#define __Meta(...) __cppast(Meta,__VA_ARGS__) +#define __Meta(...) __cppast(Meta=__VA_ARGS__) #define UPROPERTY(...) __Meta(__VA_ARGS__) #define UFUNCTION(...) __Meta(__VA_ARGS__) -#define __vkMeta(...) __cppast(vkMeta,__VA_ARGS__) +#define __vkMeta(...) __cppast(vkMeta=__VA_ARGS__) #define UPROPERTY_vk(...) __vkMeta(__VA_ARGS__) #define UFUNCTION_vk(...) __vkMeta(__VA_ARGS__) -#define __dxMeta(...) __cppast(dxMeta,__VA_ARGS__) +#define __dxMeta(...) __cppast(dxMeta=__VA_ARGS__) #define UPROPERTY_dx(...) __dxMeta(__VA_ARGS__) -#define UFUNCTION_dx(...) __dxMeta(__VA_ARGS__) \ No newline at end of file +#define UFUNCTION_dx(...) __dxMeta(__VA_ARGS__) + +// 辅助宏,用于实际拼接 +#define CONCATENATE(arg1, arg2) CONCATENATE_IMPL(arg1, arg2) +#define CONCATENATE_IMPL(arg1, arg2) arg1##arg2 +#define MY_UNIQUE_NAME(base) CONCATENATE(base, __LINE__) + +#define USING_CTOR_NAME MY_UNIQUE_NAME(__Ctor) +#define USING_FUNC_NAME MY_UNIQUE_NAME(__Func) + +#define USING_OVERLOAD_CTOR(Class, ...) using USING_CTOR_NAME = Class(*)(__VA_ARGS__); +#define USING_OVERLOAD_FUNC(R, ...) using USING_FUNC_NAME = R(*)(__VA_ARGS__); +#define USING_OVERLOAD_CLASS_FUNC(R, Class, ...) using USING_FUNC_NAME = R(Class::*)(__VA_ARGS__); +namespace refl_impl { + struct Meta {}; + struct vkMeta {}; + struct dxMeta {}; +} \ No newline at end of file diff --git a/engine/3rdparty/zlib/include/refl/refl.h b/engine/3rdparty/zlib/include/refl/refl.h index 1129b01..c4053d0 100644 --- a/engine/3rdparty/zlib/include/refl/refl.h +++ b/engine/3rdparty/zlib/include/refl/refl.h @@ -60,42 +60,4 @@ namespace refl { FieldPtr::Data method(offset); return { name, cls,method,flag }; } - /* - //用处不大---------------begin - template<_ReflCheck_Meta T> - consteval int GetStaticFieldID(const Name& name) { - auto fields = T::MyStatic::__MakeStaticFields(); - auto first = fields.begin(); - for (auto& field : fields) { - if (field.name == name) { - return &field - &*first; - } - } - return 0; - } - template<_ReflCheck_Meta T> - consteval int GetStaticFieldID(bool(* fptr)(FieldPtr)) { - auto fields = T::MyStatic::__MakeStaticFields(); - auto first = fields.begin(); - for (auto& field : fields) { - if (fptr(field)) { - return &field - &*first; - } - } - return 0; - } - template<_ReflCheck_Meta T, auto name> - consteval auto GetStaticField() { - constexpr auto fields = T::MyMeta::__StaticFields(); - using AutoType = decltype(name); - if constexpr (std::is_same_v) { - return std::get(fields); - } - else { - constexpr auto id = GetStaticFieldID(name.Data()); - return std::get(fields); - } - } - //用处不大---------------end - */ } \ No newline at end of file diff --git a/engine/3rdparty/zlib/test/refl/vertex.h b/engine/3rdparty/zlib/test/refl/vertex.h index e87c08e..e4ffd19 100644 --- a/engine/3rdparty/zlib/test/refl/vertex.h +++ b/engine/3rdparty/zlib/test/refl/vertex.h @@ -10,7 +10,6 @@ struct vec3_parent { } }; struct vec3 : public vec3_parent { - using MyMeta = class vec3_Meta; UPROPERTY_vk({ 1.f}) float x = 1; UPROPERTY_dx({ 2.f}) diff --git a/engine/3rdparty/zlib/test/yaml/guid.h b/engine/3rdparty/zlib/test/yaml/guid.h index fd863b8..3c20f82 100644 --- a/engine/3rdparty/zlib/test/yaml/guid.h +++ b/engine/3rdparty/zlib/test/yaml/guid.h @@ -4,80 +4,84 @@ #include using std::string; using std::vector; -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 } - {} - Guid(const std::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) +using std::string_view; +namespace test { + struct Guid + { + 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 } + {} + + USING_OVERLOAD_CTOR(Guid, const string_view&) + UFUNCTION({}, ref = USING_CTOR_NAME) + Guid(const std::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) + } + {}; + auto operator<=>(const Guid&) const noexcept = default; + operator bool() const noexcept + { + return *reinterpret_cast(this) != GUID_NULL; } - {}; - auto operator<=>(const Guid&) const noexcept = default; - operator bool() const noexcept - { - return *reinterpret_cast(this) != GUID_NULL; - } - operator std::string() 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 std::string{ guid_cstr }; - } - static Guid Make() - { - Guid guid; - const auto res = CoCreateGuid((GUID*)&guid); - return guid; - } -}; -struct SerializedMeta -{ - Guid guid; - string name; - string t_hash{}; - string metadata; -}; -struct ResourceBundle; -struct MetaBundle -{ - vector metadatas; + USING_OVERLOAD_CLASS_FUNC(void, Guid, int) + UFUNCTION({}, ref = USING_FUNC_NAME) + void test(int x) { + + } + USING_OVERLOAD_CLASS_FUNC(void, Guid, float) + UFUNCTION({}, ref = USING_FUNC_NAME) + void test(float x) { + + } + operator std::string() 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 std::string{ guid_cstr }; + } + static Guid Make() + { + Guid guid; + const auto res = CoCreateGuid((GUID*)&guid); + return guid; + } + + }; +} - 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 55a47a4..966d5f6 100644 --- a/engine/3rdparty/zlib/test/yaml/main.cpp +++ b/engine/3rdparty/zlib/test/yaml/main.cpp @@ -4,7 +4,10 @@ #include using namespace refl; using namespace std; +using namespace test; int main() { + using T = test::Guid; + auto cls = &TypeInfo::StaticClass; int x = 123; Guid g1 = Guid::Make(); YAML::TextArchive::Register(); @@ -14,10 +17,10 @@ int main() { 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(); - } + //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/zlib/xmake.lua b/engine/3rdparty/zlib/xmake.lua index 22267ec..749b9ac 100644 --- a/engine/3rdparty/zlib/xmake.lua +++ b/engine/3rdparty/zlib/xmake.lua @@ -2,6 +2,7 @@ set_languages("cxx20") add_requires("UTemplate") target("zlib") set_kind("static") + set_basename("myzlib") add_packages("UTemplate", {public = true}) add_defines("YAML_CPP_STATIC_DEFINE", {public = true}) add_includedirs("include", {public = true}) diff --git a/engine/src/engine/asset/res/guid.h b/engine/src/engine/asset/res/guid.h index b1d6499..665f1b5 100644 --- a/engine/src/engine/asset/res/guid.h +++ b/engine/src/engine/asset/res/guid.h @@ -14,7 +14,6 @@ namespace engineapi } struct Guid { - using MyMeta = class Guid_Meta; UPROPERTY({}) unsigned int Data1; UPROPERTY({}) @@ -23,10 +22,13 @@ namespace engineapi unsigned short Data3; UPROPERTY({}) unsigned char Data4[8]; + Guid() noexcept : Data1{ 0 }, Data2{ 0 }, Data3{ 0 }, Data4{ 0,0,0,0,0,0,0,0 } {} - UFUNCTION({}) + + USING_OVERLOAD_CTOR(Guid, const string_view&) + UFUNCTION({}, ref = USING_CTOR_NAME) Guid(const string_view& str) noexcept : Guid{} { diff --git a/engine/src/engine/asset/res/package_path.h b/engine/src/engine/asset/res/package_path.h index d236cf6..7cc3a5b 100644 --- a/engine/src/engine/asset/res/package_path.h +++ b/engine/src/engine/asset/res/package_path.h @@ -11,7 +11,6 @@ namespace engineapi using zstd::hash_table; using Ubpa::Name; using Ubpa::NameID; - namespace fs = std::filesystem; struct PackagePath { string_view name; string_view path; @@ -34,8 +33,10 @@ namespace engineapi return false; } Name GetExtension() { - fs::path p(this->path); - return Name(p.extension().string()); + size_t pos = path.rfind('.'); + if (pos != std::string::npos) + return path.substr(pos); + return ""; } string AbsolutePath(); static string AbsolutePath(string_view path) { diff --git a/engine/src/engine/asset/resource_manager.cpp b/engine/src/engine/asset/resource_manager.cpp index 765c1f4..578e66b 100644 --- a/engine/src/engine/asset/resource_manager.cpp +++ b/engine/src/engine/asset/resource_manager.cpp @@ -1,5 +1,6 @@ #include "resource_manager.inl" #include "file_manager.h" +#include "yaml/yaml.h" namespace engineapi { void ResourceManager::Init() { @@ -29,6 +30,11 @@ namespace engineapi { MetaBundle ResourceManager::GetMeta(PackagePath path) { + string text = FileManager::LoadTextFile(path.AbsolutePath() + ".meta"); + auto res = YAML::Text_Unserialize(text); + if (res) { + return res.value(); + } return {}; } diff --git a/engine/src/engine/render/meta/vertex.h b/engine/src/engine/render/meta/vertex.h index 2132e13..063b5da 100644 --- a/engine/src/engine/render/meta/vertex.h +++ b/engine/src/engine/render/meta/vertex.h @@ -8,12 +8,10 @@ namespace engineapi { struct Vertex {}; struct PosVertex : public Vertex { - using MyMetas = class PosVertex_MultyMeta; UPROPERTY_vk({}, VertexMeta{ VK_FORMAT_R32G32B32_SFLOAT }) Vector3 Position = {}; }; struct TexVertex : public Vertex { - using MyMetas = class TexVertex_MulytMeta; UPROPERTY_vk({}, VertexMeta{ VK_FORMAT_R32G32B32_SFLOAT }) Vector3 Position = {}; UPROPERTY_vk() @@ -23,7 +21,6 @@ namespace engineapi { }; struct BoneVertex : public Vertex { - using MyMetas = class BoneVertex_MulytMeta; UPROPERTY_vk({}, VertexMeta{ VK_FORMAT_R32G32B32_SFLOAT }) Vector3 Position = {}; UPROPERTY_vk() diff --git a/engine/src/main.cpp b/engine/src/main.cpp index 0cb765b..3ca56b1 100644 --- a/engine/src/main.cpp +++ b/engine/src/main.cpp @@ -3,8 +3,7 @@ #include "asset/file_manager.h" #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) {