diff --git a/engine/3rdparty/zlib/include/refl/detail/any.h b/engine/3rdparty/zlib/include/refl/detail/any.h index e4f11c2..e83eca0 100644 --- a/engine/3rdparty/zlib/include/refl/detail/any.h +++ b/engine/3rdparty/zlib/include/refl/detail/any.h @@ -43,12 +43,13 @@ namespace refl { return *(T*)ptr; } } + bool CheckParent()const; bool Check(const UClass* toClass)const; constexpr operator bool() const{ return cls != nullptr && ptr != nullptr; } constexpr int Size()const; - constexpr const UClass* Parent()const; + Any Parent()const; constexpr Any Change(const void* ptr)const { return {ptr, cls}; } diff --git a/engine/3rdparty/zlib/include/refl/detail/type.h b/engine/3rdparty/zlib/include/refl/detail/type.h index 742ebda..988a785 100644 --- a/engine/3rdparty/zlib/include/refl/detail/type.h +++ b/engine/3rdparty/zlib/include/refl/detail/type.h @@ -103,7 +103,7 @@ namespace refl { using refl_impl::MetaImpl; template - concept _ReflCheck_Parent = requires { typename MyMeta::Parent;} && std::is_same_v; + concept _ReflCheck_Parent = requires { typename MyMeta::MyParent;} && !std::is_same_v; template concept _ReflCheck_Ctor = requires { T(); }; diff --git a/engine/3rdparty/zlib/include/refl/detail/uclass.h b/engine/3rdparty/zlib/include/refl/detail/uclass.h index 570514a..ab18a23 100644 --- a/engine/3rdparty/zlib/include/refl/detail/uclass.h +++ b/engine/3rdparty/zlib/include/refl/detail/uclass.h @@ -12,6 +12,7 @@ namespace refl { CLASS_CONTAINER_FLAG = 1 << 3, CLASS_SEQUENCE_FLAG = 1 << 4, CLASS_MAP_FLAG = 1 << 5, + CLASS_PARENT_FLAG = 1 << 6, }; using enum ClassFlag; enum EFieldFind :uint32_t { diff --git a/engine/3rdparty/zlib/include/refl/detail/uclass.inl b/engine/3rdparty/zlib/include/refl/detail/uclass.inl index 082019a..36828ea 100644 --- a/engine/3rdparty/zlib/include/refl/detail/uclass.inl +++ b/engine/3rdparty/zlib/include/refl/detail/uclass.inl @@ -292,7 +292,8 @@ namespace refl { flag = CLASS_TRIVIAL_FLAG; } if constexpr (_ReflCheck_Parent) { - parent = &TypeInfo::StaticClass; + parent = &TypeInfo::StaticClass; + flag |= CLASS_PARENT_FLAG; } if constexpr (_ReflCheck_Metas) { vtable.GetMeta = &MetaImpl::MyMetas::GetMeta; diff --git a/engine/3rdparty/zlib/include/refl/detail/view.inl b/engine/3rdparty/zlib/include/refl/detail/view.inl index e5f8e3a..cf2b017 100644 --- a/engine/3rdparty/zlib/include/refl/detail/view.inl +++ b/engine/3rdparty/zlib/include/refl/detail/view.inl @@ -4,6 +4,10 @@ #include "convert.h" namespace refl { using enum ClassFlag; + inline bool Any::CheckParent() const + { + return cls->flag & CLASS_PARENT_FLAG; + } inline bool Any::Check(const UClass* toClass) const{ if (cls == toClass) { return true; @@ -17,9 +21,12 @@ namespace refl { { return cls->size; } - inline constexpr const UClass* Any::Parent()const + inline Any Any::Parent()const { - return cls->parent; + if (!(cls->flag & CLASS_PARENT_FLAG)) { + return {}; + } + return Any{ptr, cls->parent }; } inline Any Any::Member(const FieldPtr& field)const { diff --git a/engine/3rdparty/zlib/include/refl/macro.h b/engine/3rdparty/zlib/include/refl/macro.h index 1a852ce..f62a2f1 100644 --- a/engine/3rdparty/zlib/include/refl/macro.h +++ b/engine/3rdparty/zlib/include/refl/macro.h @@ -1,6 +1,10 @@ #pragma once #if !defined(__cppast) #define __cppast(...) +#else +namespace engineapi { + //class Asset {}; +} #endif #define __Meta(...) __cppast(Meta=__VA_ARGS__) diff --git a/engine/3rdparty/zlib/include/yaml/serialize/text.inl b/engine/3rdparty/zlib/include/yaml/serialize/text.inl index 2aefdaa..70425d8 100644 --- a/engine/3rdparty/zlib/include/yaml/serialize/text.inl +++ b/engine/3rdparty/zlib/include/yaml/serialize/text.inl @@ -72,6 +72,9 @@ namespace YAML } return result; } + if (Any p = any.Parent()) { + result["__parent__"] = Serialize(p); + } auto fieldList = any.cls->GetFields(refl::FIND_ALL_MEMBER, FName("")); for (auto& field : fieldList) { Node child = Serialize(any.Member(field)); @@ -113,11 +116,16 @@ namespace YAML } if (res.IsMap() && any.IsObject()) { auto fieldList = any.cls->GetFields(refl::FIND_ALL_MEMBER, FName("")); - if (fieldList.size() != res.size()) { + auto rt = res.begin(); + int diff = res.size() - fieldList.size(); + if (diff == 1 && any.CheckParent()) { + diff = 0; + Unserialize(rt++->second, any.Parent()); + } + else if (diff != 0) { return false; } auto ft = fieldList.begin(); - auto rt = res.begin(); for (; ft != fieldList.end() && rt != res.end(); ++ft,++rt) { if (ft->name != Name(rt->first.as())) { return false; diff --git a/engine/3rdparty/zlib/include/yaml/yaml.h b/engine/3rdparty/zlib/include/yaml/yaml.h index de1a8df..7329718 100644 --- a/engine/3rdparty/zlib/include/yaml/yaml.h +++ b/engine/3rdparty/zlib/include/yaml/yaml.h @@ -25,4 +25,7 @@ namespace YAML } return *any.CastTo(); } + inline bool Text_Unserialize(const string& text, Any any) { + return TextArchive::Unserialize(Load(text), any); + } } \ No newline at end of file diff --git a/engine/assets/models/box.ply.asset b/engine/assets/models/box.ply.asset deleted file mode 100644 index c67e139..0000000 --- a/engine/assets/models/box.ply.asset +++ /dev/null @@ -1,2 +0,0 @@ -- name: engineapi::Mesh - data: "mMaterial:\n guid: 00000000-0000-0000-0000-000000000000" \ No newline at end of file diff --git a/engine/assets/models/box.ply.meta b/engine/assets/models/box.ply.meta index f8ae790..231d11d 100644 --- a/engine/assets/models/box.ply.meta +++ b/engine/assets/models/box.ply.meta @@ -6,4 +6,4 @@ metadatas: - guid: 77b7a000-ed3c-4271-ae30-5e91346e09f4 name: "" t_hash: engineapi::Asset - t_meta: engineapi::Mesh \ No newline at end of file + t_meta: "mMaterial:\n guid: 00000000-0000-0000-0000-000000000000" \ No newline at end of file diff --git a/engine/assets/models/cube.obj.asset b/engine/assets/models/cube.obj.asset deleted file mode 100644 index 117b300..0000000 --- a/engine/assets/models/cube.obj.asset +++ /dev/null @@ -1,2 +0,0 @@ -- name: engineapi::Mesh - data: "" \ No newline at end of file diff --git a/engine/assets/models/cube.obj.meta b/engine/assets/models/cube.obj.meta index ab8bf58..466283d 100644 --- a/engine/assets/models/cube.obj.meta +++ b/engine/assets/models/cube.obj.meta @@ -6,4 +6,4 @@ metadatas: - guid: 54e69c4b-16ea-4fb8-87d6-0e2383d093b0 name: defaultobject t_hash: engineapi::Asset - t_meta: engineapi::Mesh \ No newline at end of file + t_meta: "mMaterial:\n guid: 00000000-0000-0000-0000-000000000000" \ No newline at end of file diff --git a/engine/src/engine/asset/asset.h b/engine/src/engine/asset/asset.h index 153f28a..83f6a95 100644 --- a/engine/src/engine/asset/asset.h +++ b/engine/src/engine/asset/asset.h @@ -1,6 +1,7 @@ #pragma once #include "render/asset_struct.h" #include "resource_manager.h" +#include "yaml/yaml.h" namespace engineapi { class Asset : public Resource { private: @@ -10,13 +11,31 @@ namespace engineapi { using Base = Resource; const refl::UClass* meta; Asset(const refl::UClass* meta): Base(), meta(meta){} + refl::Any Meta() { + return refl::Any{ this, meta }; + } }; template<> inline void MetaBundle::Add(RscHandle h) { if (h) { - metadatas.emplace_back(SerializedMeta{ h.guid, string(h->Name()), string(type_name().View()), string(h->meta->name)}); + metadatas.emplace_back(SerializedMeta{ h.guid, string(h->Name()), string(type_name().View()), YAML::Text_Serialize(h->Meta())}); } } -} \ No newline at end of file +} +/* +namespace refl { + struct Wrap_Asset { + engineapi::RscHandle mHandle; + UPROPERTY({}) + string mName; + const refl::UClass* meta; + }; + template<> + struct real_type { + using type = Wrap_Asset; + }; +} +#include "asset_gen.inl" +*/ \ No newline at end of file diff --git a/engine/src/engine/object/loader/assimp_loader.cpp b/engine/src/engine/object/loader/assimp_loader.cpp index 0f478e3..6e8138d 100644 --- a/engine/src/engine/object/loader/assimp_loader.cpp +++ b/engine/src/engine/object/loader/assimp_loader.cpp @@ -5,7 +5,6 @@ #include "assimp/Importer.hpp" #include "assimp/scene.h" #include "assimp/postprocess.h" -#include namespace engineapi { void AssimpLoader::Init() { @@ -26,20 +25,8 @@ namespace engineapi { for (auto& mesh : asset->GetMeshs()) { bundle.Add(mesh); } - PackagePath asset_handle(handle + ".asset"); - std::ifstream file(asset_handle.RealPath()); - if (!file.good()) { - auto& block = ResourceManager::GetSingleton().GetFileBlock(handle); - block.is_dirty = true; - } return bundle; } - void AssimpLoader::SaveFile(PackagePath handle, const ResourceBundle& bundle) - { - auto loader = ResourceManager::GetSingleton().GetLoader(".asset"); - if(loader) - loader->SaveFile(handle + ".asset", bundle); - } void AssimpLoader::LoadModel(PackagePath handle, Model& model, const MetaBundle& meta) { // 用ASSIMP加载模型文件 @@ -143,6 +130,9 @@ namespace engineapi { } auto asset = m ? ResourceManager::GetSingleton().LoaderEmplaceResource(m->guid, vertices, indices) : ResourceManager::GetSingleton().LoaderEmplaceResource(vertices, indices); + if (m) { + YAML::Text_Unserialize(m->t_meta, asset->Meta()); + } asset->Name(mesh->mName.C_Str()); return asset; } diff --git a/engine/src/engine/object/loader/assimp_loader.h b/engine/src/engine/object/loader/assimp_loader.h index ac15c55..09aece5 100644 --- a/engine/src/engine/object/loader/assimp_loader.h +++ b/engine/src/engine/object/loader/assimp_loader.h @@ -11,7 +11,6 @@ namespace engineapi { public: static void Init(); ResourceBundle LoadFile(PackagePath handle, const MetaBundle& meta) override; - void SaveFile(PackagePath handle, const ResourceBundle& bundle) override; void LoadModel(PackagePath handle, Model& model, const MetaBundle& meta); void ProcessNode(Model& model, const MetaBundle& meta, const aiNode* pNode, const aiScene* pScene); diff --git a/engine/src/engine/render/asset/mesh.h b/engine/src/engine/render/asset/mesh.h index 6c4a941..0a67e33 100644 --- a/engine/src/engine/render/asset/mesh.h +++ b/engine/src/engine/render/asset/mesh.h @@ -39,6 +39,5 @@ namespace engineapi { inline Mesh::Mesh(vector& vertices, vector& indices) : Asset(&refl::TypeInfo::StaticClass), mVertices(vertices), mIndices(indices) { - auto cls = &refl::TypeInfo::StaticClass; } } \ No newline at end of file diff --git a/engine/src/engine/render/asset/shader.h b/engine/src/engine/render/asset/shader.h index 0b1de30..dd5da16 100644 --- a/engine/src/engine/render/asset/shader.h +++ b/engine/src/engine/render/asset/shader.h @@ -1,6 +1,5 @@ #pragma once #include "asset/asset.h" - namespace engineapi { class ShaderProgram : public Resource {}; class Shader : public Asset { diff --git a/engine/xmake.lua b/engine/xmake.lua index 55c3119..8462147 100644 --- a/engine/xmake.lua +++ b/engine/xmake.lua @@ -8,6 +8,7 @@ target("zengine") add_rules("volk.env", "glsl.env") add_rules("c++.codegen",{ files = {"src/engine/render/asset/*.h", + --"src/engine/asset/asset.h", "src/engine/asset/res/*.h"} }) add_deps("zlog","zlib")