refl parent bugfix
This commit is contained in:
parent
67b41a4eee
commit
315985450e
@ -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};
|
||||
}
|
||||
|
||||
@ -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(); };
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
{
|
||||
|
||||
4
engine/3rdparty/zlib/include/refl/macro.h
vendored
4
engine/3rdparty/zlib/include/refl/macro.h
vendored
@ -1,6 +1,10 @@
|
||||
#pragma once
|
||||
#if !defined(__cppast)
|
||||
#define __cppast(...)
|
||||
#else
|
||||
namespace engineapi {
|
||||
//class Asset {};
|
||||
}
|
||||
#endif
|
||||
|
||||
#define __Meta(...) __cppast(Meta=__VA_ARGS__)
|
||||
|
||||
@ -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;
|
||||
|
||||
3
engine/3rdparty/zlib/include/yaml/yaml.h
vendored
3
engine/3rdparty/zlib/include/yaml/yaml.h
vendored
@ -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);
|
||||
}
|
||||
}
|
||||
@ -1,2 +0,0 @@
|
||||
- name: engineapi::Mesh
|
||||
data: "mMaterial:\n guid: 00000000-0000-0000-0000-000000000000"
|
||||
@ -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"
|
||||
@ -1,2 +0,0 @@
|
||||
- name: engineapi::Mesh
|
||||
data: ""
|
||||
@ -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"
|
||||
@ -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"
|
||||
*/
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,5 @@
|
||||
#pragma once
|
||||
#include "asset/asset.h"
|
||||
|
||||
namespace engineapi {
|
||||
class ShaderProgram : public Resource<ShaderProgram> {};
|
||||
class Shader : public Asset {
|
||||
|
||||
@ -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")
|
||||
|
||||
Loading…
Reference in New Issue
Block a user