refl parent bugfix
This commit is contained in:
parent
67b41a4eee
commit
315985450e
@ -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};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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(); };
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
4
engine/3rdparty/zlib/include/refl/macro.h
vendored
4
engine/3rdparty/zlib/include/refl/macro.h
vendored
@ -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__)
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
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*>();
|
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
|
- 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"
|
||||||
@ -1,2 +0,0 @@
|
|||||||
- name: engineapi::Mesh
|
|
||||||
data: ""
|
|
||||||
@ -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"
|
||||||
@ -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"
|
||||||
|
*/
|
||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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 {
|
||||||
|
|||||||
@ -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")
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user