refl parent bugfix

This commit is contained in:
ouczbs 2024-07-03 21:59:02 +08:00
parent 67b41a4eee
commit 315985450e
18 changed files with 59 additions and 31 deletions

View File

@ -43,12 +43,13 @@ namespace refl {
return *(T*)ptr; return *(T*)ptr;
} }
} }
bool CheckParent()const;
bool Check(const UClass* toClass)const; bool Check(const UClass* toClass)const;
constexpr operator bool() const{ constexpr operator bool() const{
return cls != nullptr && ptr != nullptr; return cls != nullptr && ptr != nullptr;
} }
constexpr int Size()const; constexpr int Size()const;
constexpr const UClass* Parent()const; Any Parent()const;
constexpr Any Change(const void* ptr)const { constexpr Any Change(const void* ptr)const {
return {ptr, cls}; return {ptr, cls};
} }

View File

@ -103,7 +103,7 @@ namespace refl {
using refl_impl::MetaImpl; using refl_impl::MetaImpl;
template <class MyMeta> template <class MyMeta>
concept _ReflCheck_Parent = requires { typename MyMeta::Parent;} && std::is_same_v<typename MyMeta::Parent, void>; concept _ReflCheck_Parent = requires { typename MyMeta::MyParent;} && !std::is_same_v<typename MyMeta::MyParent, void>;
template <class T> template <class T>
concept _ReflCheck_Ctor = requires { T(); }; concept _ReflCheck_Ctor = requires { T(); };

View File

@ -12,6 +12,7 @@ namespace refl {
CLASS_CONTAINER_FLAG = 1 << 3, CLASS_CONTAINER_FLAG = 1 << 3,
CLASS_SEQUENCE_FLAG = 1 << 4, CLASS_SEQUENCE_FLAG = 1 << 4,
CLASS_MAP_FLAG = 1 << 5, CLASS_MAP_FLAG = 1 << 5,
CLASS_PARENT_FLAG = 1 << 6,
}; };
using enum ClassFlag; using enum ClassFlag;
enum EFieldFind :uint32_t { enum EFieldFind :uint32_t {

View File

@ -292,7 +292,8 @@ namespace refl {
flag = CLASS_TRIVIAL_FLAG; flag = CLASS_TRIVIAL_FLAG;
} }
if constexpr (_ReflCheck_Parent<MyMeta>) { if constexpr (_ReflCheck_Parent<MyMeta>) {
parent = &TypeInfo<typename MyMeta::Parent>::StaticClass; parent = &TypeInfo<typename MyMeta::MyParent>::StaticClass;
flag |= CLASS_PARENT_FLAG;
} }
if constexpr (_ReflCheck_Metas<T>) { if constexpr (_ReflCheck_Metas<T>) {
vtable.GetMeta = &MetaImpl<T>::MyMetas::GetMeta; vtable.GetMeta = &MetaImpl<T>::MyMetas::GetMeta;

View File

@ -4,6 +4,10 @@
#include "convert.h" #include "convert.h"
namespace refl { namespace refl {
using enum ClassFlag; using enum ClassFlag;
inline bool Any::CheckParent() const
{
return cls->flag & CLASS_PARENT_FLAG;
}
inline bool Any::Check(const UClass* toClass) const{ inline bool Any::Check(const UClass* toClass) const{
if (cls == toClass) { if (cls == toClass) {
return true; return true;
@ -17,9 +21,12 @@ namespace refl {
{ {
return cls->size; 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 inline Any Any::Member(const FieldPtr& field)const
{ {

View File

@ -1,6 +1,10 @@
#pragma once #pragma once
#if !defined(__cppast) #if !defined(__cppast)
#define __cppast(...) #define __cppast(...)
#else
namespace engineapi {
//class Asset {};
}
#endif #endif
#define __Meta(...) __cppast(Meta=__VA_ARGS__) #define __Meta(...) __cppast(Meta=__VA_ARGS__)

View File

@ -72,6 +72,9 @@ namespace YAML
} }
return result; return result;
} }
if (Any p = any.Parent()) {
result["__parent__"] = Serialize(p);
}
auto fieldList = any.cls->GetFields(refl::FIND_ALL_MEMBER, FName("")); auto fieldList = any.cls->GetFields(refl::FIND_ALL_MEMBER, FName(""));
for (auto& field : fieldList) { for (auto& field : fieldList) {
Node child = Serialize(any.Member(field)); Node child = Serialize(any.Member(field));
@ -113,11 +116,16 @@ namespace YAML
} }
if (res.IsMap() && any.IsObject()) { if (res.IsMap() && any.IsObject()) {
auto fieldList = any.cls->GetFields(refl::FIND_ALL_MEMBER, FName("")); 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; return false;
} }
auto ft = fieldList.begin(); auto ft = fieldList.begin();
auto rt = res.begin();
for (; ft != fieldList.end() && rt != res.end(); ++ft,++rt) { for (; ft != fieldList.end() && rt != res.end(); ++ft,++rt) {
if (ft->name != Name(rt->first.as<string>())) { if (ft->name != Name(rt->first.as<string>())) {
return false; return false;

View File

@ -25,4 +25,7 @@ namespace YAML
} }
return *any.CastTo<T*>(); return *any.CastTo<T*>();
} }
inline bool Text_Unserialize(const string& text, Any any) {
return TextArchive::Unserialize(Load(text), any);
}
} }

View File

@ -1,2 +0,0 @@
- name: engineapi::Mesh
data: "mMaterial:\n guid: 00000000-0000-0000-0000-000000000000"

View File

@ -6,4 +6,4 @@ metadatas:
- guid: 77b7a000-ed3c-4271-ae30-5e91346e09f4 - guid: 77b7a000-ed3c-4271-ae30-5e91346e09f4
name: "" name: ""
t_hash: engineapi::Asset t_hash: engineapi::Asset
t_meta: engineapi::Mesh t_meta: "mMaterial:\n guid: 00000000-0000-0000-0000-000000000000"

View File

@ -1,2 +0,0 @@
- name: engineapi::Mesh
data: ""

View File

@ -6,4 +6,4 @@ metadatas:
- guid: 54e69c4b-16ea-4fb8-87d6-0e2383d093b0 - guid: 54e69c4b-16ea-4fb8-87d6-0e2383d093b0
name: defaultobject name: defaultobject
t_hash: engineapi::Asset t_hash: engineapi::Asset
t_meta: engineapi::Mesh t_meta: "mMaterial:\n guid: 00000000-0000-0000-0000-000000000000"

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include "render/asset_struct.h" #include "render/asset_struct.h"
#include "resource_manager.h" #include "resource_manager.h"
#include "yaml/yaml.h"
namespace engineapi { namespace engineapi {
class Asset : public Resource<Asset> { class Asset : public Resource<Asset> {
private: private:
@ -10,13 +11,31 @@ namespace engineapi {
using Base = Resource<Asset>; using Base = Resource<Asset>;
const refl::UClass* meta; const refl::UClass* meta;
Asset(const refl::UClass* meta): Base(), meta(meta){} Asset(const refl::UClass* meta): Base(), meta(meta){}
refl::Any Meta() {
return refl::Any{ this, meta };
}
}; };
template<> template<>
inline void MetaBundle::Add(RscHandle<Asset> h) inline void MetaBundle::Add(RscHandle<Asset> h)
{ {
if (h) if (h)
{ {
metadatas.emplace_back(SerializedMeta{ h.guid, string(h->Name()), string(type_name<Asset>().View()), string(h->meta->name)}); metadatas.emplace_back(SerializedMeta{ h.guid, string(h->Name()), string(type_name<Asset>().View()), YAML::Text_Serialize(h->Meta())});
} }
} }
} }
/*
namespace refl {
struct Wrap_Asset {
engineapi::RscHandle<engineapi::Asset> mHandle;
UPROPERTY({})
string mName;
const refl::UClass* meta;
};
template<>
struct real_type<engineapi::Asset> {
using type = Wrap_Asset;
};
}
#include "asset_gen.inl"
*/

View File

@ -5,7 +5,6 @@
#include "assimp/Importer.hpp" #include "assimp/Importer.hpp"
#include "assimp/scene.h" #include "assimp/scene.h"
#include "assimp/postprocess.h" #include "assimp/postprocess.h"
#include <fstream>
namespace engineapi { namespace engineapi {
void AssimpLoader::Init() void AssimpLoader::Init()
{ {
@ -26,20 +25,8 @@ namespace engineapi {
for (auto& mesh : asset->GetMeshs()) { for (auto& mesh : asset->GetMeshs()) {
bundle.Add(mesh); 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; 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) void AssimpLoader::LoadModel(PackagePath handle, Model& model, const MetaBundle& meta)
{ {
// 用ASSIMP加载模型文件 // 用ASSIMP加载模型文件
@ -143,6 +130,9 @@ namespace engineapi {
} }
auto asset = m ? ResourceManager::GetSingleton().LoaderEmplaceResource<Mesh>(m->guid, vertices, indices) auto asset = m ? ResourceManager::GetSingleton().LoaderEmplaceResource<Mesh>(m->guid, vertices, indices)
: ResourceManager::GetSingleton().LoaderEmplaceResource<Mesh>(vertices, indices); : ResourceManager::GetSingleton().LoaderEmplaceResource<Mesh>(vertices, indices);
if (m) {
YAML::Text_Unserialize(m->t_meta, asset->Meta());
}
asset->Name(mesh->mName.C_Str()); asset->Name(mesh->mName.C_Str());
return asset; return asset;
} }

View File

@ -11,7 +11,6 @@ namespace engineapi {
public: public:
static void Init(); static void Init();
ResourceBundle LoadFile(PackagePath handle, const MetaBundle& meta) override; 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 LoadModel(PackagePath handle, Model& model, const MetaBundle& meta);
void ProcessNode(Model& model, const MetaBundle& meta, const aiNode* pNode, const aiScene* pScene); void ProcessNode(Model& model, const MetaBundle& meta, const aiNode* pNode, const aiScene* pScene);

View File

@ -39,6 +39,5 @@ namespace engineapi {
inline Mesh::Mesh(vector<T>& vertices, vector<uint32_t>& indices) inline Mesh::Mesh(vector<T>& vertices, vector<uint32_t>& indices)
: Asset(&refl::TypeInfo<Mesh>::StaticClass), mVertices(vertices), mIndices(indices) : Asset(&refl::TypeInfo<Mesh>::StaticClass), mVertices(vertices), mIndices(indices)
{ {
auto cls = &refl::TypeInfo<Mesh>::StaticClass;
} }
} }

View File

@ -1,6 +1,5 @@
#pragma once #pragma once
#include "asset/asset.h" #include "asset/asset.h"
namespace engineapi { namespace engineapi {
class ShaderProgram : public Resource<ShaderProgram> {}; class ShaderProgram : public Resource<ShaderProgram> {};
class Shader : public Asset { class Shader : public Asset {

View File

@ -8,6 +8,7 @@ target("zengine")
add_rules("volk.env", "glsl.env") add_rules("volk.env", "glsl.env")
add_rules("c++.codegen",{ add_rules("c++.codegen",{
files = {"src/engine/render/asset/*.h", files = {"src/engine/render/asset/*.h",
--"src/engine/asset/asset.h",
"src/engine/asset/res/*.h"} "src/engine/asset/res/*.h"}
}) })
add_deps("zlog","zlib") add_deps("zlog","zlib")