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;
}
}
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};
}

View File

@ -103,7 +103,7 @@ namespace refl {
using refl_impl::MetaImpl;
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>
concept _ReflCheck_Ctor = requires { T(); };

View File

@ -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 {

View File

@ -292,7 +292,8 @@ namespace refl {
flag = CLASS_TRIVIAL_FLAG;
}
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>) {
vtable.GetMeta = &MetaImpl<T>::MyMetas::GetMeta;

View File

@ -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
{

View File

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

View File

@ -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<string>())) {
return false;

View File

@ -25,4 +25,7 @@ namespace YAML
}
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
name: ""
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
name: defaultobject
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
#include "render/asset_struct.h"
#include "resource_manager.h"
#include "yaml/yaml.h"
namespace engineapi {
class Asset : public Resource<Asset> {
private:
@ -10,13 +11,31 @@ namespace engineapi {
using Base = Resource<Asset>;
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<Asset> 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/scene.h"
#include "assimp/postprocess.h"
#include <fstream>
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<Mesh>(m->guid, vertices, indices)
: ResourceManager::GetSingleton().LoaderEmplaceResource<Mesh>(vertices, indices);
if (m) {
YAML::Text_Unserialize(m->t_meta, asset->Meta());
}
asset->Name(mesh->mName.C_Str());
return asset;
}

View File

@ -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);

View File

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

View File

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

View File

@ -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")