From dc3bce761e7040b9df6188756215cd82f65ad35e Mon Sep 17 00:00:00 2001 From: ouczbs Date: Sat, 23 Nov 2024 18:05:54 +0800 Subject: [PATCH] refl bugfix --- engine/3rdparty/singleton/include/singleton.h | 8 ++++++++ .../modules/engine/asset/impl/asset_visit_impl.inl | 6 ++++++ engine/modules/engine/asset/include/asset/module.h | 1 + engine/modules/engine/asset/src/module.cpp | 1 + .../engine/render/include/render/asset/shader.h | 2 ++ engine/modules/engine/zlib/include/meta/tuple.h | 2 ++ engine/modules/engine/zlib/include/meta/tuple.inl | 13 +++++++++++++ engine/modules/engine/zlib/include/pmr/name.h | 1 + engine/modules/engine/zlib/include/pmr/name.inl | 5 ++++- .../modules/engine/zlib/include/refl/detail/any.inl | 2 ++ 10 files changed, 40 insertions(+), 1 deletion(-) diff --git a/engine/3rdparty/singleton/include/singleton.h b/engine/3rdparty/singleton/include/singleton.h index 2d3f61a..87c444c 100644 --- a/engine/3rdparty/singleton/include/singleton.h +++ b/engine/3rdparty/singleton/include/singleton.h @@ -8,6 +8,8 @@ namespace singleapi { }; template concept is_unique_wrap_t = requires(T* t) { typename T::UniqueType; { t->Ptr() } -> std::same_as; }; + template + concept is_reinitialize_t = requires(T * t) { { t->reinitialize() }; }; struct MemoryInfo { void* data; bool isAlive; @@ -67,6 +69,9 @@ public: else { ms_Singleton = new(info.data)T(std::forward(args)...); } + if constexpr (is_reinitialize_t) { + ms_Singleton->reinitialize(); + } } ~UniquePtr() { using namespace singleapi; @@ -109,6 +114,9 @@ public: else { ms_Singleton = new(info.data)T(std::forward(args)...); } + if constexpr (is_reinitialize_t) { + ms_Singleton->reinitialize(); + } } ~UniquePtr() { using namespace singleapi; diff --git a/engine/modules/engine/asset/impl/asset_visit_impl.inl b/engine/modules/engine/asset/impl/asset_visit_impl.inl index 67f6ecb..4004008 100644 --- a/engine/modules/engine/asset/impl/asset_visit_impl.inl +++ b/engine/modules/engine/asset/impl/asset_visit_impl.inl @@ -39,4 +39,10 @@ namespace api { } return new_meta; } + void AssetModule::InitResourceType() + { + meta::for_each_type([]() { + refl::register_meta(); + }); + } } \ No newline at end of file diff --git a/engine/modules/engine/asset/include/asset/module.h b/engine/modules/engine/asset/include/asset/module.h index 5b96c7b..f9ce5a8 100644 --- a/engine/modules/engine/asset/include/asset/module.h +++ b/engine/modules/engine/asset/include/asset/module.h @@ -6,5 +6,6 @@ namespace api { void OnLoad(int argc, char** argv) override; void OnUnload() override; void InitMetaData(void) override {}; + void InitResourceType(); }; } \ No newline at end of file diff --git a/engine/modules/engine/asset/src/module.cpp b/engine/modules/engine/asset/src/module.cpp index a3e0022..16c766d 100644 --- a/engine/modules/engine/asset/src/module.cpp +++ b/engine/modules/engine/asset/src/module.cpp @@ -5,6 +5,7 @@ namespace api { void AssetModule::OnLoad(int argc, char** argv) { + InitResourceType(); AddSystem(); AssetLoader::Init(); TextArchive::Register(); diff --git a/engine/modules/engine/render/include/render/asset/shader.h b/engine/modules/engine/render/include/render/asset/shader.h index f09fc1d..f50e8b1 100644 --- a/engine/modules/engine/render/include/render/asset/shader.h +++ b/engine/modules/engine/render/include/render/asset/shader.h @@ -8,11 +8,13 @@ namespace api { GENERATED_BODY() UPROPERTY() RscHandle mOwner; + UPROPERTY() ShaderStage mStage; public: refl::Any Meta() { return refl::Any{this}; } + ShaderProgram() : mOwner{},mStage(ShaderStage::NONE) {} ShaderProgram(ShaderStage stage) : mStage(stage) {}; ShaderStage GetStage() { return mStage; diff --git a/engine/modules/engine/zlib/include/meta/tuple.h b/engine/modules/engine/zlib/include/meta/tuple.h index ba78540..e8d42b3 100644 --- a/engine/modules/engine/zlib/include/meta/tuple.h +++ b/engine/modules/engine/zlib/include/meta/tuple.h @@ -39,5 +39,7 @@ namespace meta template constexpr auto tuple_construct(const std::tuple&) noexcept; + template + void for_each_type(Func&& func)noexcept; } #include "tuple.inl" \ No newline at end of file diff --git a/engine/modules/engine/zlib/include/meta/tuple.inl b/engine/modules/engine/zlib/include/meta/tuple.inl index 6a84f95..be4e1ad 100644 --- a/engine/modules/engine/zlib/include/meta/tuple.inl +++ b/engine/modules/engine/zlib/include/meta/tuple.inl @@ -27,4 +27,17 @@ namespace meta { using type = std::tuple...>; }; + // 泛型接口 + template + void for_each_type_impl(Func&& func, std::index_sequence) noexcept { + (func.template operator() < std::tuple_element_t > (), ...); + } + + template + void for_each_type(Func&& func) noexcept { + for_each_type_impl( + std::forward(func), + std::make_index_sequence>{} + ); + } } \ No newline at end of file diff --git a/engine/modules/engine/zlib/include/pmr/name.h b/engine/modules/engine/zlib/include/pmr/name.h index b551cdd..f15971c 100644 --- a/engine/modules/engine/zlib/include/pmr/name.h +++ b/engine/modules/engine/zlib/include/pmr/name.h @@ -163,6 +163,7 @@ namespace pmr { std::mutex mutex; public: StringEntryMemoryManager(); + void reinitialize(); StringEntry* GetStringEntry(StringEntryHandle stringEntryHandle) const; StringEntryHandle AllocateStringEntry(StringEntryHeader stringEntryHeader, const char* data); private: diff --git a/engine/modules/engine/zlib/include/pmr/name.inl b/engine/modules/engine/zlib/include/pmr/name.inl index 8092918..f1beac5 100644 --- a/engine/modules/engine/zlib/include/pmr/name.inl +++ b/engine/modules/engine/zlib/include/pmr/name.inl @@ -82,12 +82,15 @@ namespace pmr { slotPool.slotArray = (Slot*)(xmalloc(SlotPool::SLOT_POOL_INITIALIZE_SIZE * sizeof(Slot))); std::memset(slotPool.slotArray, 0, SlotPool::SLOT_POOL_INITIALIZE_SIZE); } - g_memory_blocks = memoryBlockArray; currentMemoryBlockIndex = 0; currentMemoryBlockAlignedCursor = 0; memoryBlockArray[0] = (char*)(xmalloc(MAX_MEMORY_BLOCK_SIZE)); std::memset(memoryBlockArray[0], 0, MAX_MEMORY_BLOCK_SIZE); } + inline void Name::StringEntryMemoryManager::reinitialize() + { + g_memory_blocks = memoryBlockArray; + } inline Name::StringEntry* Name::StringEntryMemoryManager::GetStringEntry(StringEntryHandle stringEntryHandle) const { return reinterpret_cast(memoryBlockArray[stringEntryHandle.GetMemoryBlockIndex()] + stringEntryHandle.GetMemoryBlockAlignedOffset() * ALIGN_BYTES); diff --git a/engine/modules/engine/zlib/include/refl/detail/any.inl b/engine/modules/engine/zlib/include/refl/detail/any.inl index b22c958..545f670 100644 --- a/engine/modules/engine/zlib/include/refl/detail/any.inl +++ b/engine/modules/engine/zlib/include/refl/detail/any.inl @@ -112,6 +112,7 @@ namespace refl{ } auto fieldList = GetFields(EFieldFind::FIND_CTOR, Name("Ctor")); if (fieldList.empty()) { + memset(ptr, 0, size); return false; } std::array ArgsArray = { Any{} , Any{ptr} }; @@ -129,6 +130,7 @@ namespace refl{ return true; } } + memset(ptr, 0, size); return false; } if (!ArgsList.empty() && ArgsList[0].Check(this)) {