bugfix
This commit is contained in:
parent
e555a6e709
commit
7ef0bfad0e
@ -6,9 +6,9 @@ metadatas:
|
|||||||
__class__: engineapi::Shader
|
__class__: engineapi::Shader
|
||||||
__data__:
|
__data__:
|
||||||
mVert:
|
mVert:
|
||||||
guid: 9419e2a5-ddc4-414f-aa76-d08e9b162492
|
guid: 020486aa-8987-4bd1-9de9-eeb7ab82c437
|
||||||
mFrag:
|
mFrag:
|
||||||
guid: eb1c9b43-a86b-40cb-9b3d-a3296d168c70
|
guid: a4064a70-89d5-4d8f-b3c3-6486dcf786c0
|
||||||
- guid: 7a01231c-c35d-4b74-b20f-4ca6823995d9
|
- guid: 7a01231c-c35d-4b74-b20f-4ca6823995d9
|
||||||
name: ""
|
name: ""
|
||||||
t_hash: engineapi::Asset
|
t_hash: engineapi::Asset
|
||||||
@ -16,4 +16,8 @@ metadatas:
|
|||||||
__class__: engineapi::Material
|
__class__: engineapi::Material
|
||||||
__data__:
|
__data__:
|
||||||
mShader:
|
mShader:
|
||||||
guid: 0a2ef3e8-db70-4d3f-94b1-09f9f92519cd
|
guid: 0a2ef3e8-db70-4d3f-94b1-09f9f92519cd
|
||||||
|
includes:
|
||||||
|
- /engine/assets/asset/mesh1.asset
|
||||||
|
- /engine/assets/shader/simple.frag
|
||||||
|
- /engine/assets/shader/simple.vert
|
||||||
@ -1,10 +1,10 @@
|
|||||||
/engine/assets/shader/simple.vert:
|
/engine/assets/shader/simple.vert:
|
||||||
- 9419e2a5-ddc4-414f-aa76-d08e9b162492
|
- 020486aa-8987-4bd1-9de9-eeb7ab82c437
|
||||||
/engine/assets/asset/mesh1.asset:
|
/engine/assets/asset/mesh1.asset:
|
||||||
- 0a2ef3e8-db70-4d3f-94b1-09f9f92519cd
|
|
||||||
- 7a01231c-c35d-4b74-b20f-4ca6823995d9
|
- 7a01231c-c35d-4b74-b20f-4ca6823995d9
|
||||||
/engine/assets/shader/simple.frag:
|
- 0a2ef3e8-db70-4d3f-94b1-09f9f92519cd
|
||||||
- eb1c9b43-a86b-40cb-9b3d-a3296d168c70
|
|
||||||
/engine/assets/models/cube.obj:
|
/engine/assets/models/cube.obj:
|
||||||
- 619d2750-cedc-40cc-8781-fbdd116ded89
|
- 3f6a5afc-2f21-47c4-86ba-9ddb9852d8f4
|
||||||
- 6c60e6b2-2ae6-4508-8117-8e797b9ac4bd
|
- b91ca918-6b3c-4647-8773-d93d2807cb98
|
||||||
|
/engine/assets/shader/simple.frag:
|
||||||
|
- a4064a70-89d5-4d8f-b3c3-6486dcf786c0
|
||||||
@ -1,13 +1,15 @@
|
|||||||
metadatas:
|
metadatas:
|
||||||
- guid: 6c60e6b2-2ae6-4508-8117-8e797b9ac4bd
|
- guid: 3f6a5afc-2f21-47c4-86ba-9ddb9852d8f4
|
||||||
name: ""
|
name: ""
|
||||||
t_hash: engineapi::Model
|
t_hash: engineapi::Model
|
||||||
meta: ~
|
meta: ~
|
||||||
- guid: 619d2750-cedc-40cc-8781-fbdd116ded89
|
- guid: b91ca918-6b3c-4647-8773-d93d2807cb98
|
||||||
name: defaultobject
|
name: defaultobject
|
||||||
t_hash: engineapi::Asset
|
t_hash: engineapi::Asset
|
||||||
meta:
|
meta:
|
||||||
__class__: engineapi::Mesh
|
__class__: engineapi::Mesh
|
||||||
__data__:
|
__data__:
|
||||||
mMaterial:
|
mMaterial:
|
||||||
guid: 7a01231c-c35d-4b74-b20f-4ca6823995d9
|
guid: 7a01231c-c35d-4b74-b20f-4ca6823995d9
|
||||||
|
includes:
|
||||||
|
- /engine/assets/asset/mesh1.asset
|
||||||
@ -1,5 +1,6 @@
|
|||||||
metadatas:
|
metadatas:
|
||||||
- guid: eb1c9b43-a86b-40cb-9b3d-a3296d168c70
|
- guid: a4064a70-89d5-4d8f-b3c3-6486dcf786c0
|
||||||
name: ""
|
name: ""
|
||||||
t_hash: engineapi::ShaderProgram
|
t_hash: engineapi::ShaderProgram
|
||||||
metadata: ""
|
meta: ~
|
||||||
|
includes: ~
|
||||||
@ -1,5 +1,6 @@
|
|||||||
metadatas:
|
metadatas:
|
||||||
- guid: 9419e2a5-ddc4-414f-aa76-d08e9b162492
|
- guid: 020486aa-8987-4bd1-9de9-eeb7ab82c437
|
||||||
name: ""
|
name: ""
|
||||||
t_hash: engineapi::ShaderProgram
|
t_hash: engineapi::ShaderProgram
|
||||||
metadata: ""
|
meta: ~
|
||||||
|
includes: ~
|
||||||
@ -6,11 +6,37 @@
|
|||||||
#include "object/loader/assimp_loader.h"
|
#include "object/loader/assimp_loader.h"
|
||||||
#include "yaml/yaml.h"
|
#include "yaml/yaml.h"
|
||||||
namespace engineapi {
|
namespace engineapi {
|
||||||
|
void FindIncludes(MetaBundle& bundle, Asset* asset) {
|
||||||
|
auto fieldList = asset->meta->GetFields(refl::FIND_ALL_MEMBER, FName(""));
|
||||||
|
refl::Any any(asset, asset->meta);
|
||||||
|
auto cls = &refl::TypeInfo<RscHandleBase>::StaticClass;
|
||||||
|
for (auto field : fieldList) {
|
||||||
|
if (field.type == cls) {
|
||||||
|
RscHandleBase* base = any.Member(field).CastTo<RscHandleBase*>();
|
||||||
|
FileBlock* file = ResourceManager::GetSingleton().GetResourceFile(base->guid);
|
||||||
|
if (file) {
|
||||||
|
bundle.includes.push_back(file->path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
MetaBundle ResourceManager::GetVisitMeta(const ResourceBundle& bundle)
|
MetaBundle ResourceManager::GetVisitMeta(const ResourceBundle& bundle)
|
||||||
{
|
{
|
||||||
MetaBundle new_meta = MetaBundle{};
|
MetaBundle new_meta = MetaBundle{};
|
||||||
for (auto& elem : bundle.GetAll())
|
for (auto& elem : bundle.GetAll())
|
||||||
std::visit([&](auto& handle) { new_meta.Add(handle); }, elem);
|
std::visit([&](auto& handle) {
|
||||||
|
using T = std::decay_t<decltype(*handle)>;
|
||||||
|
new_meta.Add(handle);
|
||||||
|
if constexpr (std::is_same_v<T, Asset>) {
|
||||||
|
FindIncludes(new_meta, &*handle);
|
||||||
|
}
|
||||||
|
}, elem);
|
||||||
|
auto& v = new_meta.includes;
|
||||||
|
if (v.size() > 1) {
|
||||||
|
std::sort(v.begin(), v.end()); // 首先排序
|
||||||
|
auto end_unique = std::unique(v.begin(), v.end()); // 去除重复元素
|
||||||
|
v.erase(end_unique, v.end());
|
||||||
|
}
|
||||||
return new_meta;
|
return new_meta;
|
||||||
}
|
}
|
||||||
void Asset::__Init__()
|
void Asset::__Init__()
|
||||||
|
|||||||
@ -3,8 +3,6 @@
|
|||||||
#include "yaml/yaml.h"
|
#include "yaml/yaml.h"
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include "file_handle.h"
|
#include "file_handle.h"
|
||||||
|
|
||||||
#include "render/asset/material.h"
|
|
||||||
namespace engineapi {
|
namespace engineapi {
|
||||||
void AssetLoader::Init() {
|
void AssetLoader::Init() {
|
||||||
ResourceManager::GetSingleton().RegisterLoader<AssetLoader>(".asset");
|
ResourceManager::GetSingleton().RegisterLoader<AssetLoader>(".asset");
|
||||||
@ -16,22 +14,6 @@ namespace engineapi {
|
|||||||
if (!meta.meta)
|
if (!meta.meta)
|
||||||
continue;
|
continue;
|
||||||
auto rsc = ResourceManager::GetSingleton().LoadFromMeta<Asset>(meta.guid, meta);
|
auto rsc = ResourceManager::GetSingleton().LoadFromMeta<Asset>(meta.guid, meta);
|
||||||
if (meta.meta.cls == &refl::TypeInfo<Shader>::StaticClass) {
|
|
||||||
Shader* asset = (Shader*)& *rsc;
|
|
||||||
Guid g1 = asset->GetGuid();
|
|
||||||
Guid g2 = meta.guid;
|
|
||||||
bool isame = g1 == g2;
|
|
||||||
g1 = meta.guid;
|
|
||||||
g2 = asset->GetGuid();
|
|
||||||
}
|
|
||||||
else if (meta.meta.cls == &refl::TypeInfo<Material>::StaticClass) {
|
|
||||||
Material* asset = (Material*)&*rsc;
|
|
||||||
Guid g1 = asset->GetGuid();
|
|
||||||
Guid g2 = meta.guid;
|
|
||||||
bool isame = g1 == g2;
|
|
||||||
g1 = meta.guid;
|
|
||||||
g2 = asset->GetGuid();
|
|
||||||
}
|
|
||||||
bundle.Add(rsc);
|
bundle.Add(rsc);
|
||||||
}
|
}
|
||||||
return bundle;
|
return bundle;
|
||||||
|
|||||||
@ -3,9 +3,18 @@
|
|||||||
|
|
||||||
namespace engineapi
|
namespace engineapi
|
||||||
{
|
{
|
||||||
|
const SerializedMeta* MetaBundle::FetchMeta(const Guid& guid) const
|
||||||
|
{
|
||||||
|
for (auto& elem : metadatas)
|
||||||
|
{
|
||||||
|
if (elem.guid == guid)
|
||||||
|
return &elem;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
bool MetaBundle::operator==(const MetaBundle& other)const
|
bool MetaBundle::operator==(const MetaBundle& other)const
|
||||||
{
|
{
|
||||||
return metadatas == other.metadatas;
|
return metadatas == other.metadatas && includes == other.includes;
|
||||||
}
|
}
|
||||||
bool MetaBundle::operator!=(const MetaBundle& other)const
|
bool MetaBundle::operator!=(const MetaBundle& other)const
|
||||||
{
|
{
|
||||||
|
|||||||
@ -11,7 +11,7 @@ namespace engineapi
|
|||||||
UPROPERTY({})
|
UPROPERTY({})
|
||||||
string name;
|
string name;
|
||||||
UPROPERTY({})
|
UPROPERTY({})
|
||||||
string t_hash{};
|
string t_hash;
|
||||||
UPROPERTY({})
|
UPROPERTY({})
|
||||||
refl::Any meta;
|
refl::Any meta;
|
||||||
bool operator==(const SerializedMeta& other)const{
|
bool operator==(const SerializedMeta& other)const{
|
||||||
@ -23,9 +23,11 @@ namespace engineapi
|
|||||||
{
|
{
|
||||||
UPROPERTY({})
|
UPROPERTY({})
|
||||||
vector<SerializedMeta> metadatas;
|
vector<SerializedMeta> metadatas;
|
||||||
|
UPROPERTY({})
|
||||||
|
vector<string> includes;
|
||||||
MetaBundle() = default;
|
MetaBundle() = default;
|
||||||
|
|
||||||
|
const SerializedMeta* FetchMeta(const Guid& guid) const;
|
||||||
template<typename T>
|
template<typename T>
|
||||||
const SerializedMeta* FetchMeta() const;
|
const SerializedMeta* FetchMeta() const;
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
|||||||
@ -21,7 +21,7 @@ namespace engineapi
|
|||||||
};
|
};
|
||||||
//占位符浪费了四个字节
|
//占位符浪费了四个字节
|
||||||
struct FileBlock {
|
struct FileBlock {
|
||||||
uint32_t flag;
|
uint32_t flag{0};
|
||||||
string path;
|
string path;
|
||||||
string addr;
|
string addr;
|
||||||
operator bool() {
|
operator bool() {
|
||||||
|
|||||||
@ -19,6 +19,7 @@ namespace engineapi {
|
|||||||
RscHandle<Res> mHandle;
|
RscHandle<Res> mHandle;
|
||||||
std::string mName;
|
std::string mName;
|
||||||
friend class RscHandle<Res>;
|
friend class RscHandle<Res>;
|
||||||
|
friend class ResourceManager;
|
||||||
};
|
};
|
||||||
using Resources = std::tuple<
|
using Resources = std::tuple<
|
||||||
class ShaderProgram
|
class ShaderProgram
|
||||||
|
|||||||
@ -8,7 +8,7 @@ namespace engineapi
|
|||||||
struct RscHandleBase {
|
struct RscHandleBase {
|
||||||
UPROPERTY({})
|
UPROPERTY({})
|
||||||
Guid guid;
|
Guid guid;
|
||||||
void* res;
|
void* res{nullptr};
|
||||||
};
|
};
|
||||||
template<typename Res>
|
template<typename Res>
|
||||||
struct RscHandle : public RscHandleBase
|
struct RscHandle : public RscHandleBase
|
||||||
@ -17,7 +17,7 @@ namespace engineapi
|
|||||||
constexpr RscHandle() noexcept = default;
|
constexpr RscHandle() noexcept = default;
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr RscHandle(const RscHandle<T>& other) noexcept : RscHandleBase(other.guid, other.res) {};
|
constexpr RscHandle(const RscHandle<T>& other) noexcept : RscHandleBase(other.guid, other.res) {};
|
||||||
constexpr RscHandle(const Guid& guid, Res* res) noexcept : RscHandleBase(guid, res) { ((Resource<Res>*)res)->mHandle = *this; }
|
constexpr RscHandle(const Guid& guid, Res* res) noexcept : RscHandleBase(guid, res) {}
|
||||||
void Init();
|
void Init();
|
||||||
void Clear() { res = nullptr; };
|
void Clear() { res = nullptr; };
|
||||||
Res* operator->() { if (!res && guid) Init(); return (Res*)res; }
|
Res* operator->() { if (!res && guid) Init(); return (Res*)res; }
|
||||||
|
|||||||
@ -31,16 +31,14 @@ namespace engineapi {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
return itr->second;
|
return itr->second;
|
||||||
}
|
}
|
||||||
ResourceBundle& ResourceManager::Load(const PackagePath& path, bool reload_resource)
|
ResourceBundle& ResourceManager::Load(const PackagePath& path, bool reload_resource, int deep)
|
||||||
{
|
{
|
||||||
NameID name = path();
|
NameID name = path();
|
||||||
auto it = mFileBlock.find(name);
|
auto it = mFileBlock.find(name);
|
||||||
if (it != mFileBlock.end()) {
|
|
||||||
if (!reload_resource) {
|
|
||||||
return it->second.bundle;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
auto& res = mFileBlock[name];
|
auto& res = mFileBlock[name];
|
||||||
|
if (deep > 5 || (!reload_resource && res && it != mFileBlock.end())) {
|
||||||
|
return res.bundle;
|
||||||
|
}
|
||||||
Name ext = path.GetExtension();
|
Name ext = path.GetExtension();
|
||||||
IFileLoader* loader = GetLoader(ext);
|
IFileLoader* loader = GetLoader(ext);
|
||||||
MetaBundle meta = GetMeta(path);
|
MetaBundle meta = GetMeta(path);
|
||||||
@ -54,13 +52,18 @@ namespace engineapi {
|
|||||||
mResourceFile[handle.guid] = FileManager::FindPathBlock(path);
|
mResourceFile[handle.guid] = FileManager::FindPathBlock(path);
|
||||||
}, elem);
|
}, elem);
|
||||||
}
|
}
|
||||||
if (is_dirty_meta || res.is_dirty) {
|
if (is_dirty_meta || res.IsDirty()) {
|
||||||
mDirtyBlock.push_back(&res);
|
mDirtyBlock.push_back(&res);
|
||||||
}
|
}
|
||||||
res.path = path.SafePath();
|
res.path = path.SafePath();
|
||||||
res.bundle = bundle;
|
res.bundle = bundle;
|
||||||
res.is_meta_dirty = is_dirty_meta;
|
res.Loaded(true).MetaDirty(is_dirty_meta);
|
||||||
res.bundle = bundle;
|
res.bundle = bundle;
|
||||||
|
if (!new_meta.includes.empty()) {
|
||||||
|
for (auto include : new_meta.includes) {
|
||||||
|
Load(include, false, deep + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
return res.bundle;
|
return res.bundle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,13 +100,13 @@ namespace engineapi {
|
|||||||
void ResourceManager::SaveDirtyFile()
|
void ResourceManager::SaveDirtyFile()
|
||||||
{
|
{
|
||||||
for (auto block : mDirtyBlock) {
|
for (auto block : mDirtyBlock) {
|
||||||
if (block->is_meta_dirty) {
|
if (block->IsMetaDirty()) {
|
||||||
block->is_meta_dirty = false;
|
block->MetaDirty(false);
|
||||||
MetaBundle new_meta = GetVisitMeta(block->bundle);
|
MetaBundle new_meta = GetVisitMeta(block->bundle);
|
||||||
SaveMeta(block->path, new_meta);
|
SaveMeta(block->path, new_meta);
|
||||||
}
|
}
|
||||||
if (block->is_dirty) {
|
if (block->IsDirty()) {
|
||||||
block->is_dirty = false;
|
block->Dirty(false);
|
||||||
auto loader = GetLoader(block->path.GetExtension());
|
auto loader = GetLoader(block->path.GetExtension());
|
||||||
loader->SaveFile(block->path, block->bundle);
|
loader->SaveFile(block->path, block->bundle);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,6 +17,22 @@ namespace engineapi {
|
|||||||
FileDoesNotExist,
|
FileDoesNotExist,
|
||||||
FailedToLoadResource,
|
FailedToLoadResource,
|
||||||
};
|
};
|
||||||
|
struct ResourceFileFlag{
|
||||||
|
enum Value : uint32_t {
|
||||||
|
File_Default = 0,
|
||||||
|
File_Dirty = 1 << 0,
|
||||||
|
File_Meta_Dirty = 1 << 1,
|
||||||
|
File_Loaded = 1 << 2,
|
||||||
|
};
|
||||||
|
Value val{ File_Default };
|
||||||
|
// 构造函数和操作符重载,使类实例像整数一样使用
|
||||||
|
ResourceFileFlag(Value v = File_Default) : val(v) {}
|
||||||
|
operator uint32_t() const { return val; }
|
||||||
|
ResourceFileFlag& operator=(Value v) {
|
||||||
|
val = v;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
template<typename Res>
|
template<typename Res>
|
||||||
using LoadResult = result<Res, ResourceLoadError>;
|
using LoadResult = result<Res, ResourceLoadError>;
|
||||||
class ResourceManager : public ISingleton<ResourceManager>
|
class ResourceManager : public ISingleton<ResourceManager>
|
||||||
@ -69,7 +85,7 @@ namespace engineapi {
|
|||||||
|
|
||||||
template<typename Res>
|
template<typename Res>
|
||||||
RscHandle<Res> Load(const PackagePath& path, bool reload_resource = true);
|
RscHandle<Res> Load(const PackagePath& path, bool reload_resource = true);
|
||||||
ResourceBundle& Load(const PackagePath& path, bool reload_resource = true);
|
ResourceBundle& Load(const PackagePath& path, bool reload_resource = true, int deep = 0);
|
||||||
MetaBundle GetMeta(const PackagePath& path);
|
MetaBundle GetMeta(const PackagePath& path);
|
||||||
MetaBundle GetVisitMeta(const ResourceBundle& bundle);
|
MetaBundle GetVisitMeta(const ResourceBundle& bundle);
|
||||||
void SaveMeta(const PackagePath& path, const MetaBundle& bundle);
|
void SaveMeta(const PackagePath& path, const MetaBundle& bundle);
|
||||||
@ -86,14 +102,29 @@ namespace engineapi {
|
|||||||
{
|
{
|
||||||
ResourceBundle bundle;
|
ResourceBundle bundle;
|
||||||
PackagePath path;
|
PackagePath path;
|
||||||
bool is_dirty{ false };
|
uint32_t flag{0};
|
||||||
bool is_meta_dirty{ false };
|
ResourceFileBlock& SetFlag(bool is, ResourceFileFlag _flag) {
|
||||||
|
if (is)
|
||||||
|
flag |= _flag;
|
||||||
|
else
|
||||||
|
flag &= ~_flag;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
operator bool() {
|
||||||
|
return IsLoaded();
|
||||||
|
}
|
||||||
|
ResourceFileBlock& Loaded(bool is) { return SetFlag(is, ResourceFileFlag::File_Loaded); }
|
||||||
|
ResourceFileBlock& Dirty(bool is) { return SetFlag(is, ResourceFileFlag::File_Dirty); }
|
||||||
|
ResourceFileBlock& MetaDirty(bool is) { return SetFlag(is, ResourceFileFlag::File_Meta_Dirty); }
|
||||||
|
bool IsLoaded() { return flag & ResourceFileFlag::File_Loaded; }
|
||||||
|
bool IsDirty() { return flag & ResourceFileFlag::File_Dirty; }
|
||||||
|
bool IsMetaDirty() { return flag & ResourceFileFlag::File_Meta_Dirty; }
|
||||||
};
|
};
|
||||||
template<typename R>
|
template<typename R>
|
||||||
struct ResourceManager::ResourceBlock
|
struct ResourceManager::ResourceBlock
|
||||||
{
|
{
|
||||||
R* resource;
|
R* resource{nullptr};
|
||||||
ResourceFileBlock* file;
|
ResourceFileBlock* file{ nullptr };
|
||||||
bool valid() const { return resource; }
|
bool valid() const { return resource; }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -55,6 +55,7 @@ namespace engineapi {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
control_block.resource = res;
|
control_block.resource = res;
|
||||||
|
res->mHandle.guid = guid;
|
||||||
}
|
}
|
||||||
res->Name(meta.name);
|
res->Name(meta.name);
|
||||||
return RscHandle<Res>{guid, res};
|
return RscHandle<Res>{guid, res};
|
||||||
@ -66,6 +67,7 @@ namespace engineapi {
|
|||||||
auto& control_block = table[guid]; // don't care just replace
|
auto& control_block = table[guid]; // don't care just replace
|
||||||
// attempt to put on other thread
|
// attempt to put on other thread
|
||||||
Res* res = new Res(std::forward<Args>(args)...);
|
Res* res = new Res(std::forward<Args>(args)...);
|
||||||
|
res->mHandle.guid = guid;
|
||||||
control_block.resource = res;
|
control_block.resource = res;
|
||||||
return RscHandle<Res>{guid, res};
|
return RscHandle<Res>{guid, res};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -131,7 +131,7 @@ namespace engineapi {
|
|||||||
RscHandle<Mesh> asset = m ? ResourceManager::GetSingleton().LoadEmplaceResource<Mesh>(m->guid, vertices, indices)
|
RscHandle<Mesh> asset = m ? ResourceManager::GetSingleton().LoadEmplaceResource<Mesh>(m->guid, vertices, indices)
|
||||||
: ResourceManager::GetSingleton().LoadEmplaceResource<Mesh>(vertices, indices);
|
: ResourceManager::GetSingleton().LoadEmplaceResource<Mesh>(vertices, indices);
|
||||||
if (m && m->meta) {
|
if (m && m->meta) {
|
||||||
void* ptr = &*asset;
|
Mesh* ptr = &*asset;
|
||||||
m->meta.MoveTo(ptr);
|
m->meta.MoveTo(ptr);
|
||||||
}
|
}
|
||||||
asset->Name(mesh->mName.C_Str());
|
asset->Name(mesh->mName.C_Str());
|
||||||
|
|||||||
@ -11,6 +11,9 @@ namespace engineapi {
|
|||||||
public:
|
public:
|
||||||
Material();
|
Material();
|
||||||
~Material();
|
~Material();
|
||||||
|
void BeginLoad() {
|
||||||
|
mShader->BeginLoad();
|
||||||
|
}
|
||||||
RscHandle<Shader> GetShader() {
|
RscHandle<Shader> GetShader() {
|
||||||
return mShader;
|
return mShader;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,6 +6,7 @@ namespace engineapi {
|
|||||||
}
|
}
|
||||||
void Mesh::BeginLoad()
|
void Mesh::BeginLoad()
|
||||||
{
|
{
|
||||||
|
mMaterial->BeginLoad();
|
||||||
RenderAPI::GetSingletonPtr()->SetStaticMesh(*this);
|
RenderAPI::GetSingletonPtr()->SetStaticMesh(*this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
#include "shader.h"
|
#include "shader.h"
|
||||||
|
#include "render/renderapi.h"
|
||||||
namespace engineapi {
|
namespace engineapi {
|
||||||
Shader::Shader() : Asset(&refl::TypeInfo<Shader>::StaticClass)
|
Shader::Shader() : Asset(&refl::TypeInfo<Shader>::StaticClass)
|
||||||
{
|
{
|
||||||
@ -7,4 +8,8 @@ namespace engineapi {
|
|||||||
Shader::~Shader()
|
Shader::~Shader()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
void Shader::BeginLoad()
|
||||||
|
{
|
||||||
|
RenderAPI::GetSingletonPtr()->LoadShader(*this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,7 @@ namespace engineapi {
|
|||||||
class Shader : public Asset {
|
class Shader : public Asset {
|
||||||
private:
|
private:
|
||||||
REFL_FRIEND(Shader)
|
REFL_FRIEND(Shader)
|
||||||
uint32_t mId;
|
uint32_t mId{0};
|
||||||
ShaderInfo mInfo;
|
ShaderInfo mInfo;
|
||||||
UPROPERTY()
|
UPROPERTY()
|
||||||
RscHandle<ShaderProgram> mVert;
|
RscHandle<ShaderProgram> mVert;
|
||||||
@ -15,6 +15,7 @@ namespace engineapi {
|
|||||||
public:
|
public:
|
||||||
Shader();
|
Shader();
|
||||||
~Shader();
|
~Shader();
|
||||||
|
void BeginLoad();
|
||||||
uint32_t& GetID() {
|
uint32_t& GetID() {
|
||||||
return mId;
|
return mId;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user