From b67411cb43a5d00de23c374af6679400f0df54fe Mon Sep 17 00:00:00 2001 From: ouczbs Date: Sun, 30 Jun 2024 21:46:26 +0800 Subject: [PATCH] rebuild asset --- engine/3rdparty/zlib/include/meta/pad.h | 12 +++++ .../zlib/include/refl/detail/uclass.h | 1 + engine/assets/shader/simple.vert | 27 ++++++++++ engine/src/engine/app.cpp | 2 - engine/src/engine/asset/asset.cpp | 9 ---- engine/src/engine/asset/asset.h | 51 +++---------------- engine/src/engine/asset/asset_manager.cpp | 25 --------- engine/src/engine/asset/asset_manager.h | 50 ------------------ engine/src/engine/asset/file_manager.cpp | 2 +- engine/src/engine/asset/file_manager.h | 18 +++++-- engine/src/engine/asset/render/asset_struct.h | 4 +- engine/src/engine/asset/res/package_path.cpp | 9 +++- engine/src/engine/asset/res/package_path.h | 6 ++- engine/src/engine/asset/res/resource_bundle.h | 2 +- .../src/engine/asset/res/resource_bundle.inl | 7 +++ engine/src/engine/asset/res/resource_config.h | 7 ++- .../src/engine/asset/res/resource_handle.cpp | 1 - engine/src/engine/asset/res/resource_handle.h | 14 ++++- engine/src/engine/asset/resource_manager.cpp | 3 +- engine/src/engine/asset/resource_manager.h | 5 +- engine/src/engine/asset/resource_manager.inl | 33 ++++++++---- engine/src/engine/object/game_object.h | 4 +- engine/src/engine/object/mesh/actor.cpp | 6 +-- engine/src/engine/object/scene/scene.cpp | 12 ++++- .../src/engine/object/scene/scene_manager.h | 1 - engine/src/engine/render/asset/asset_render.h | 3 -- engine/src/engine/render/asset/material.cpp | 2 - engine/src/engine/render/asset/material.h | 2 +- engine/src/engine/render/asset/mesh.cpp | 1 - engine/src/engine/render/asset/mesh.h | 9 ++-- engine/src/engine/render/asset/model.cpp | 5 +- engine/src/engine/render/asset/model.h | 4 +- engine/src/engine/render/asset/shader.cpp | 8 --- engine/src/engine/render/asset/shader.h | 23 +++++++-- engine/src/engine/render/asset/texture.h | 2 +- .../engine/render/node/rendernode_forward.cpp | 3 +- engine/src/engine/render/render_context.h | 2 +- .../vulkanapi/loader/vulkan_glsl_loader.cpp | 42 +++++++++++---- .../vulkanapi/loader/vulkan_glsl_loader.h | 20 ++++++-- .../engine/vulkanapi/tool/glsl_to_spirv.cpp | 21 ++------ engine/src/engine/vulkanapi/vulkan_struct.h | 2 +- engine/src/engine/vulkanapi/vulkanapi.cpp | 20 +++++--- engine/src/engine/vulkanapi/vulkanapi.h | 2 + .../src/engine/vulkanapi/wrapper/device.cpp | 12 +++++ engine/src/engine/vulkanapi/wrapper/device.h | 1 + engine/src/main.cpp | 20 ++------ 46 files changed, 258 insertions(+), 257 deletions(-) create mode 100644 engine/3rdparty/zlib/include/meta/pad.h create mode 100644 engine/assets/shader/simple.vert delete mode 100644 engine/src/engine/asset/asset.cpp delete mode 100644 engine/src/engine/asset/asset_manager.cpp delete mode 100644 engine/src/engine/asset/asset_manager.h delete mode 100644 engine/src/engine/render/asset/asset_render.h diff --git a/engine/3rdparty/zlib/include/meta/pad.h b/engine/3rdparty/zlib/include/meta/pad.h new file mode 100644 index 0000000..dc217e0 --- /dev/null +++ b/engine/3rdparty/zlib/include/meta/pad.h @@ -0,0 +1,12 @@ +#include +namespace meta { + template + void padding_vector(std::vector& vec, size_t multiple, const T& paddingValue = T()) { + if (multiple == 0) return; // 避免除以零 + size_t remainder = vec.size() % multiple; + if (remainder != 0) { + size_t padding = multiple - remainder; + vec.insert(vec.end(), padding, paddingValue); + } + } +} \ No newline at end of file diff --git a/engine/3rdparty/zlib/include/refl/detail/uclass.h b/engine/3rdparty/zlib/include/refl/detail/uclass.h index 88b728c..570514a 100644 --- a/engine/3rdparty/zlib/include/refl/detail/uclass.h +++ b/engine/3rdparty/zlib/include/refl/detail/uclass.h @@ -45,6 +45,7 @@ namespace refl { uint32_t flag{0}; const UClass* parent; vtable_uclass vtable{}; + inline static std::unordered_map MetaTable; public: constexpr UClass(std::string_view name, uint32_t size, const UClass* parent = nullptr) :name(name), size(size), parent(parent){} diff --git a/engine/assets/shader/simple.vert b/engine/assets/shader/simple.vert new file mode 100644 index 0000000..06ed755 --- /dev/null +++ b/engine/assets/shader/simple.vert @@ -0,0 +1,27 @@ +#version 450 +#extension GL_GOOGLE_include_directive : enable + +// 顶点位置输入变量 +layout (location = 0) in vec3 position; +layout (location = 1) in vec2 texture; +layout (location = 2) in vec3 normal; +layout (location = 3) in vec3 tangent; +layout (location = 4) in vec4 weights; +layout (location = 5) in uvec4 bones; + + +// 顶点位置输出变量 +//out vec4 outPosition; +out gl_PerVertex { + vec4 gl_Position; +}; + +vec2 positions[3] = vec2[]( + vec2(0.0, -0.5), + vec2(0.5, 0.5), + vec2(-0.5, 0.5) +); + +void main() { + gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0); +} \ No newline at end of file diff --git a/engine/src/engine/app.cpp b/engine/src/engine/app.cpp index faa548c..a8cb0ef 100644 --- a/engine/src/engine/app.cpp +++ b/engine/src/engine/app.cpp @@ -4,7 +4,6 @@ #include "object/mesh/actor.h" #include "data/property/actor_property.h" #include "asset/file_manager.h" -#include "asset/asset_manager.h" #include "asset/resource_manager.h" #include "object/scene/scene_manager.h" namespace engineapi { @@ -12,7 +11,6 @@ namespace engineapi { { const char* name = "zengine"; SystemList.push_back(new FileManager()); - SystemList.push_back(new AssetManager()); SystemList.push_back(new ResourceManager()); SystemList.push_back(RenderAPI::MakeInstance()); SystemList.push_back(Window::MakeInstance(3, 640, 720, name)); diff --git a/engine/src/engine/asset/asset.cpp b/engine/src/engine/asset/asset.cpp deleted file mode 100644 index bda6962..0000000 --- a/engine/src/engine/asset/asset.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "asset/asset.h" -#include "asset_manager.h" -namespace engineapi -{ - Asset::~Asset() - { - - } -} \ No newline at end of file diff --git a/engine/src/engine/asset/asset.h b/engine/src/engine/asset/asset.h index 79578ec..d5211ff 100644 --- a/engine/src/engine/asset/asset.h +++ b/engine/src/engine/asset/asset.h @@ -1,50 +1,11 @@ #pragma once -#include "res/guid.h" +#include "render/asset_struct.h" +#include "res/resource_handle.h" #include "res/package_path.h" -#include -#include -#include -namespace engineapi -{ - using std::vector; - using std::map; - class Asset { +namespace engineapi { + class Asset : public Resource { public: - friend class AssetManager; - enum :uint32_t { - ASSET_NONE_FLAG = 0, - ASSET_SHARED_FLAG = 1 << 0, - ASSET_COPY_FLAG = 1 << 1, - ASSET_ASYNC_FLAG = 1 << 2, - ASSET_LOADING_FLAG = 1 << 3, - ASSET_LOADED_FLAG = 1 << 4, - ASSET_ANIM_FLAG = 1 << 5, - }; - protected: - uint32_t mFlags; - string_view mName; - public: - Asset(string_view name, uint32_t flags):mName(name),mFlags(flags) {}; - ~Asset(); - virtual void BeginLoad() { - mFlags |= ASSET_LOADING_FLAG; - }; - virtual void EndLoad() { - mFlags &= ~ASSET_LOADING_FLAG; - mFlags |= ASSET_LOADED_FLAG; - }; - string_view& GetName() { - return mName; - } - public: - inline bool IsShared() { - return mFlags & ASSET_SHARED_FLAG; - } - inline bool IsCopyed() { - return mFlags & ASSET_COPY_FLAG; - } - inline bool IsAsync() { - return mFlags & ASSET_ASYNC_FLAG; - } + using Base = Resource; + using Base::Base; }; } \ No newline at end of file diff --git a/engine/src/engine/asset/asset_manager.cpp b/engine/src/engine/asset/asset_manager.cpp deleted file mode 100644 index 12ef016..0000000 --- a/engine/src/engine/asset/asset_manager.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "asset_manager.h" -#include "zlog.h" -using namespace std; -namespace engineapi { - void AssetManager::Init() - { - } - void AssetManager::Shutdown() - { - } - void AssetManager::ClearAsset(Asset* asset) - { - auto it = AssetMap.find(asset->mName); - if (!asset->IsShared()) { - delete asset; - } - if (it != AssetMap.end()) { - it->second.count--; - if (it->second.count < 1) { - delete it->second.asset; - AssetMap.erase(it); - } - } - } -} diff --git a/engine/src/engine/asset/asset_manager.h b/engine/src/engine/asset/asset_manager.h deleted file mode 100644 index 562c725..0000000 --- a/engine/src/engine/asset/asset_manager.h +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once -#include "asset.h" -#include "singleton.h" -namespace engineapi -{ - class AssetManager : public ISingleton - { - public: - struct AssetWrap { - Asset* asset; - uint32_t count; - AssetWrap(Asset* asset): asset(asset),count(1) { - - } - }; - public: - void Init() override; - void Shutdown() override; - public: - void ClearAsset(Asset* asset); - template - TAsset* LoadAsset(const string& name, uint32_t flags) - { - string_view view = PackagePath::StringView(name); - auto it = AssetMap.find(view); - bool isFind = it != AssetMap.end(); - if (isFind) { - it->second.count++; - if (it->second.asset->IsShared()) { - return (TAsset*)(it->second.asset); - } - if (it->second.asset->IsCopyed()) { - TAsset* asset = new TAsset(name, flags); - *asset = *(TAsset*)(it->second.asset); - return asset; - } - } - TAsset* asset = new TAsset(name, flags); - if (!isFind && (asset->IsShared() || asset->IsCopyed())) { - AssetMap.emplace(name, asset); - } - asset->BeginLoad(); - return asset; - } - - AssetManager() = default; - private: - inline static table AssetMap; - }; -} diff --git a/engine/src/engine/asset/file_manager.cpp b/engine/src/engine/asset/file_manager.cpp index b1bc82c..24e4c39 100644 --- a/engine/src/engine/asset/file_manager.cpp +++ b/engine/src/engine/asset/file_manager.cpp @@ -6,7 +6,7 @@ namespace engineapi { void FileManager::Init() { std::filesystem::path path = std::filesystem::current_path(); - Mount(string_view("engine"), path.string()); + Mount("engine", path.string()); } void FileManager::Shutdown() { diff --git a/engine/src/engine/asset/file_manager.h b/engine/src/engine/asset/file_manager.h index 11a99ca..98909e0 100644 --- a/engine/src/engine/asset/file_manager.h +++ b/engine/src/engine/asset/file_manager.h @@ -11,17 +11,25 @@ namespace engineapi void Init() override; void Shutdown() override; public: - static void Mount(NameID id, const string& path) { - MountMap.emplace(id, path); + static void Mount(const string& name, const string& path) { + MountMap.emplace(NameID(name), std::make_pair(name,path)); } - static string FindMount(NameID id) { + static std::pair FindMount(NameID id) { auto it = MountMap.find(id); if (it != MountMap.end()) { return it->second; } - return ""; + return {}; } - inline static table MountMap; + static string FindMountName(NameID id) { + auto pair = FindMount(id); + return pair.first; + } + static string FindMountPath(NameID id) { + auto pair = FindMount(id); + return pair.second; + } + inline static table> MountMap; public: static string LoadTextFile(const string& path); static vector LoadBinaryFile(const string& path); diff --git a/engine/src/engine/asset/render/asset_struct.h b/engine/src/engine/asset/render/asset_struct.h index 938a822..cc9e251 100644 --- a/engine/src/engine/asset/render/asset_struct.h +++ b/engine/src/engine/asset/render/asset_struct.h @@ -1,8 +1,8 @@ #pragma once -#include "../asset.h" #include "math/math.h" #include "asset_enum.h" - +#include +#include using std::string; using std::vector; diff --git a/engine/src/engine/asset/res/package_path.cpp b/engine/src/engine/asset/res/package_path.cpp index eae96f0..937bc55 100644 --- a/engine/src/engine/asset/res/package_path.cpp +++ b/engine/src/engine/asset/res/package_path.cpp @@ -1,10 +1,17 @@ #include "package_path.h" #include "asset/file_manager.h" namespace engineapi { + PackagePath PackagePath::ToSuffixPath(const string_view& suffix) + { + if (CheckPackage()) { + return { FileManager::FindMountName(name) + string(suffix) , path}; + } + return *this; + } string PackagePath::AbsolutePath() { if (CheckPackage()) { - return FileManager::FindMount(name) + string(path); + return FileManager::FindMountPath(name) + string(path); } return string(path); } diff --git a/engine/src/engine/asset/res/package_path.h b/engine/src/engine/asset/res/package_path.h index 41a16f0..cebf910 100644 --- a/engine/src/engine/asset/res/package_path.h +++ b/engine/src/engine/asset/res/package_path.h @@ -11,14 +11,15 @@ namespace engineapi using Ubpa::Name; using Ubpa::NameID; struct PackagePath { - string_view name; + NameID name; string_view path; + PackagePath(const string& name,const string_view& path) : name(name), path(path) {} PackagePath(const char* path) : path(path) {} PackagePath(const string_view& path) : path(path) {} PackagePath(const string& path) : path(StringView(path)) {}; PackagePath(const string&& path) : path(path) {} bool CheckPackage() { - if (!name.empty()) { + if (name.Valid()) { return true; } if (path[0] == '/') { @@ -37,6 +38,7 @@ namespace engineapi return path.substr(pos); return ""; } + PackagePath ToSuffixPath(const string_view& suffix); string AbsolutePath(); static string AbsolutePath(string_view path) { return PackagePath(path).AbsolutePath(); diff --git a/engine/src/engine/asset/res/resource_bundle.h b/engine/src/engine/asset/res/resource_bundle.h index bd87e16..960bd8f 100644 --- a/engine/src/engine/asset/res/resource_bundle.h +++ b/engine/src/engine/asset/res/resource_bundle.h @@ -11,7 +11,7 @@ namespace engineapi ResourceBundle(const RscHandle& handle); // will reshuffle vector and invalidate span, but you shouldn't be accessing vector directly anyway so this is ok template void Add(RscHandle handle); - + template RscHandle Get() const; // get a resource from the bundle private: struct sub_array { short index = 0, count = 0; }; diff --git a/engine/src/engine/asset/res/resource_bundle.inl b/engine/src/engine/asset/res/resource_bundle.inl index 875a8e9..93786d6 100644 --- a/engine/src/engine/asset/res/resource_bundle.inl +++ b/engine/src/engine/asset/res/resource_bundle.inl @@ -1,3 +1,4 @@ +#include "resource_bundle.h" #pragma once namespace engineapi { @@ -24,4 +25,10 @@ namespace engineapi for (auto& elem : span{ &sub_arr + 1, subarrays.data() + subarrays.size() }) ++elem.index; } + template + inline RscHandle engineapi::ResourceBundle::Get() const + { + auto& subarray = subarrays[ResourceID]; + return subarray.count > 0 ? handles[subarray.index].template AsHandle() : RscHandle(); + } } \ No newline at end of file diff --git a/engine/src/engine/asset/res/resource_config.h b/engine/src/engine/asset/res/resource_config.h index a64f767..68e15eb 100644 --- a/engine/src/engine/asset/res/resource_config.h +++ b/engine/src/engine/asset/res/resource_config.h @@ -13,12 +13,11 @@ namespace engineapi { Resource() = default; private: RscHandle mHandle; - - friend class ResourceManager; + friend class RscHandle; }; using Resources = std::tuple< - class Scene - , class Shader + class ShaderProgram + , class Asset >; template concept is_resource_v = requires { typename Resource::BaseResource; }; diff --git a/engine/src/engine/asset/res/resource_handle.cpp b/engine/src/engine/asset/res/resource_handle.cpp index e3a98f8..3347fb6 100644 --- a/engine/src/engine/asset/res/resource_handle.cpp +++ b/engine/src/engine/asset/res/resource_handle.cpp @@ -1,7 +1,6 @@ #include "resource_handle.h" namespace engineapi { - GenericResourceHandle::GenericResourceHandle(string_view type_name, Guid guid) { diff --git a/engine/src/engine/asset/res/resource_handle.h b/engine/src/engine/asset/res/resource_handle.h index 4cd8f8f..89f4ce8 100644 --- a/engine/src/engine/asset/res/resource_handle.h +++ b/engine/src/engine/asset/res/resource_handle.h @@ -8,9 +8,15 @@ namespace engineapi struct RscHandle { Guid guid{}; + void* res{}; constexpr size_t RscID()const { return ResourceID; } constexpr RscHandle() noexcept = default; - constexpr RscHandle(const Guid& guid) noexcept : guid{ guid } {} + template + constexpr RscHandle(const RscHandle& other) noexcept : guid{ other.guid }, res(other.res) {}; + constexpr RscHandle(const Guid& guid, Res* res) noexcept : guid{ guid }, res(res) { ((Resource*)res)->mHandle = *this; } + void init(); + Res* operator->() { if (!res && guid) init(); return (Res*)res; } + Res& operator*() { if (!res && guid) init(); return *(Res*)res; } }; struct GenericResourceHandle @@ -21,8 +27,12 @@ namespace engineapi public: using Base::Base; using Base::operator=; + template + GenericResourceHandle(RscHandle handle) : Base(RscHandle{handle}) {} GenericResourceHandle(string_view type_name, Guid guid); - + template RscHandle AsHandle() const { + return std::get>(*this); + } Guid guid() const; size_t resource_id() const; }; diff --git a/engine/src/engine/asset/resource_manager.cpp b/engine/src/engine/asset/resource_manager.cpp index f6414bb..48ebdff 100644 --- a/engine/src/engine/asset/resource_manager.cpp +++ b/engine/src/engine/asset/resource_manager.cpp @@ -24,8 +24,7 @@ namespace engineapi { auto ext = path.GetExtension(); auto* loader = GetLoader(ext); MetaBundle meta = GetMeta(path); - auto res = loader->LoadFile(path, meta); - return res; + return loader->LoadFile(path, meta); } MetaBundle ResourceManager::GetMeta(PackagePath path) diff --git a/engine/src/engine/asset/resource_manager.h b/engine/src/engine/asset/resource_manager.h index cec3beb..111969c 100644 --- a/engine/src/engine/asset/resource_manager.h +++ b/engine/src/engine/asset/resource_manager.h @@ -35,6 +35,9 @@ namespace engineapi { void Shutdown() override; public: + template + Res* Get(const RscHandle&); + template auto& GetTable() { return *reinterpret_cast*> (mResourceTable[ResourceID].get()); @@ -51,7 +54,7 @@ namespace engineapi { FLoader& RegisterLoader(Name ext, Args&& ... args); template - LoadResult Load(PackagePath path, bool reload_resource = true); + RscHandle Load(PackagePath path, bool reload_resource = true); LoadResult Load(PackagePath path, bool reload_resource = true); MetaBundle GetMeta(PackagePath path); }; diff --git a/engine/src/engine/asset/resource_manager.inl b/engine/src/engine/asset/resource_manager.inl index 2cfef3d..f6bd4ec 100644 --- a/engine/src/engine/asset/resource_manager.inl +++ b/engine/src/engine/asset/resource_manager.inl @@ -1,3 +1,4 @@ +#include "resource_manager.h" #pragma once namespace engineapi { class IFileLoader @@ -34,31 +35,43 @@ namespace engineapi { using ResourceHelper = ResourceManager_detail; } template - inline RscHandle ResourceManager::LoaderEmplaceResource(Guid guid, Args && ...args) + inline RscHandle ResourceManager::LoaderEmplaceResource(Guid guid, Args&& ...args) { auto& table = GetTable(); auto& control_block = table[guid]; // don't care just replace // attempt to put on other thread - { - control_block.resource = new Res(std::forward(args)...); - control_block.resource->mHandle = RscHandle{ guid }; - } - return RscHandle{guid}; + Res* res = new Res(std::forward(args)...); + control_block.resource = res; + return RscHandle{guid, res}; } template - inline FLoader& ResourceManager::RegisterLoader(Name ext, Args && ...args) + inline FLoader& ResourceManager::RegisterLoader(Name ext, Args&& ...args) { FLoader* ptr = new FLoader(std::forward(args)...); mFileLoader[ext] = ptr; return *ptr; } template - inline LoadResult ResourceManager::Load(PackagePath path, bool reload_resource) + inline RscHandle ResourceManager::Load(PackagePath path, bool reload_resource) { auto res = Load(path, reload_resource); if (!res) - return nullptr; + return {}; - return nullptr; + return res.value().Get(); + } + template + inline Res* ResourceManager::Get(const RscHandle& handle) + { + auto& table = GetTable(); + auto itr = table.find(handle.guid); + if (itr == table.end()) + return nullptr; + return itr->second.resource; + } + template + inline void RscHandle::init() + { + res = ResourceManager::GetSingleton().Get(*this); } } \ No newline at end of file diff --git a/engine/src/engine/object/game_object.h b/engine/src/engine/object/game_object.h index 6688d4e..16dda50 100644 --- a/engine/src/engine/object/game_object.h +++ b/engine/src/engine/object/game_object.h @@ -1,7 +1,7 @@ #pragma once -#include -#include "component.h" #include "asset/asset.h" +#include "component.h" +#include namespace engineapi { class GameObject { protected: diff --git a/engine/src/engine/object/mesh/actor.cpp b/engine/src/engine/object/mesh/actor.cpp index 2cbae35..c7a445b 100644 --- a/engine/src/engine/object/mesh/actor.cpp +++ b/engine/src/engine/object/mesh/actor.cpp @@ -1,5 +1,4 @@ #include "actor.h" -#include "asset/asset_manager.h" #include "data/property/actor_property.h" namespace engineapi { ActorMesh::ActorMesh(Model& model, ActorProperty& property) @@ -10,8 +9,9 @@ namespace engineapi { } ActorMesh* ActorMesh::New(ActorProperty& property) { - Model* model = AssetManager::GetSingletonPtr()->LoadAsset(property.path, property.flags); - return new ActorMesh(*model, property); + //Model* model = AssetManager::GetSingletonPtr()->LoadAsset(property.path, property.flags); + //return new ActorMesh(*model, property); + return nullptr; } ActorMesh* ActorMesh::New(uint32_t id) { diff --git a/engine/src/engine/object/scene/scene.cpp b/engine/src/engine/object/scene/scene.cpp index bc03cac..95e959e 100644 --- a/engine/src/engine/object/scene/scene.cpp +++ b/engine/src/engine/object/scene/scene.cpp @@ -2,13 +2,21 @@ #include "object/camera/camera.h" #include "render/renderapi.h" #include "object/mesh/actor.h" +#include "render/asset/shader.h" #include "data/property/actor_property.h" +#include "asset/resource_manager.h" +#include "asset/file_manager.h" namespace engineapi { Scene::Scene() { mCamera = new Camera(); - auto flags = Asset::ASSET_SHARED_FLAG | Asset::ASSET_ASYNC_FLAG; - Material* material = new Material("/engine/assets/shader/simple", flags); + int flags = 1; + auto shader = ResourceManager::GetSingleton().LoaderEmplaceResource(); + shader->mVertexName = type_name().View(); + //shader->mVert = ResourceManager::GetSingleton().Load("/engine/assets/shader/simple.vert"); + shader->mFrag = ResourceManager::GetSingleton().Load("/engine/assets/shader/simple.frag"); + RenderAPI::GetSingleton().LoadShader(&*shader); + Material* material = new Material("/engine/assets/shader/simple.shader", flags); { ActorProperty property; property.id = 1; diff --git a/engine/src/engine/object/scene/scene_manager.h b/engine/src/engine/object/scene/scene_manager.h index a993fa7..f647c78 100644 --- a/engine/src/engine/object/scene/scene_manager.h +++ b/engine/src/engine/object/scene/scene_manager.h @@ -1,5 +1,4 @@ #pragma once -#include "asset/asset.h" #include "scene.h" #include "singleton.h" namespace engineapi { diff --git a/engine/src/engine/render/asset/asset_render.h b/engine/src/engine/render/asset/asset_render.h deleted file mode 100644 index abe4956..0000000 --- a/engine/src/engine/render/asset/asset_render.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once -#include "asset/render/asset_struct.h" -#include "asset/res/resource_handle.h" \ No newline at end of file diff --git a/engine/src/engine/render/asset/material.cpp b/engine/src/engine/render/asset/material.cpp index 1eddf10..ea1bcb6 100644 --- a/engine/src/engine/render/asset/material.cpp +++ b/engine/src/engine/render/asset/material.cpp @@ -1,10 +1,8 @@ #include "material.h" #include "shader.h" -#include "asset/asset_manager.h" #include "../renderapi.h" namespace engineapi { Material::Material(string_view name, uint32_t flags) - :Asset(name, flags) { //mShader = new Shader(name, flags); } diff --git a/engine/src/engine/render/asset/material.h b/engine/src/engine/render/asset/material.h index 56ddeec..5cd432f 100644 --- a/engine/src/engine/render/asset/material.h +++ b/engine/src/engine/render/asset/material.h @@ -1,5 +1,5 @@ #pragma once -#include "asset_render.h" +#include "asset/asset.h" namespace engineapi { class Shader; diff --git a/engine/src/engine/render/asset/mesh.cpp b/engine/src/engine/render/asset/mesh.cpp index 30f6090..82f2110 100644 --- a/engine/src/engine/render/asset/mesh.cpp +++ b/engine/src/engine/render/asset/mesh.cpp @@ -3,7 +3,6 @@ namespace engineapi { void Mesh::BeginLoad() { - Asset::BeginLoad(); RenderAPI::GetSingletonPtr()->SetStaticMesh(this); } } diff --git a/engine/src/engine/render/asset/mesh.h b/engine/src/engine/render/asset/mesh.h index 42feadb..64a066c 100644 --- a/engine/src/engine/render/asset/mesh.h +++ b/engine/src/engine/render/asset/mesh.h @@ -1,6 +1,6 @@ #pragma once #include "refl/std/parray.h" -#include "asset_render.h" +#include "asset/asset.h" #include "../meta/vertex.h" namespace engineapi { using refl::parray; @@ -14,14 +14,13 @@ namespace engineapi { public: template requires std::is_base_of_v - Mesh(string_view name, uint32_t flags,vector& vertices, vector& indices) - :Asset(name, flags) - , mVertices(vertices) + Mesh(vector& vertices, vector& indices) + : mVertices(vertices) , mIndices(indices) { BeginLoad(); } - void BeginLoad()override; + void BeginLoad(); public: uint32_t& GetVAO() { diff --git a/engine/src/engine/render/asset/model.cpp b/engine/src/engine/render/asset/model.cpp index 84a0e21..1049f59 100644 --- a/engine/src/engine/render/asset/model.cpp +++ b/engine/src/engine/render/asset/model.cpp @@ -3,11 +3,10 @@ #include "assimp/Importer.hpp" #include "assimp/scene.h" #include "assimp/postprocess.h" -#include "asset/asset_manager.h" namespace engineapi { void Model::BeginLoad() { - Asset::BeginLoad(); + string mName = ""; // 用ASSIMP加载模型文件 Assimp::Importer importer; const aiScene* scene = importer.ReadFile(PackagePath::AbsolutePath(mName), aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace @@ -104,7 +103,7 @@ namespace engineapi { indices.push_back(face.mIndices[j]); } } - return new Mesh(mesh->mName.C_Str(), mFlags, vertices, indices); + return new Mesh(vertices, indices); } void Model::Use() { diff --git a/engine/src/engine/render/asset/model.h b/engine/src/engine/render/asset/model.h index 3d43fbc..19de237 100644 --- a/engine/src/engine/render/asset/model.h +++ b/engine/src/engine/render/asset/model.h @@ -1,5 +1,5 @@ #pragma once -#include "asset_render.h" +#include "asset/asset.h" #include "mesh.h" #include "material.h" class aiNode; @@ -12,7 +12,7 @@ namespace engineapi { Material* mMaterial; public: using Asset::Asset; - void BeginLoad()override; + void BeginLoad(); void ProcessNode(const aiNode* pNode, const aiScene* pScene); Mesh* ProcessMesh(const aiMesh* mesh); vector& GetMeshs() { diff --git a/engine/src/engine/render/asset/shader.cpp b/engine/src/engine/render/asset/shader.cpp index b4a5ebb..5d18283 100644 --- a/engine/src/engine/render/asset/shader.cpp +++ b/engine/src/engine/render/asset/shader.cpp @@ -9,12 +9,4 @@ namespace engineapi { Shader::~Shader() { } - vector Shader::GetVertData() - { - return FileManager::LoadBinaryFile(PackagePath::AbsolutePath("") + ".vert.spv"); - } - vector Shader::GetFragData() - { - return FileManager::LoadBinaryFile(PackagePath::AbsolutePath("") + ".frag.spv"); - } } diff --git a/engine/src/engine/render/asset/shader.h b/engine/src/engine/render/asset/shader.h index 183d4d8..ef38acc 100644 --- a/engine/src/engine/render/asset/shader.h +++ b/engine/src/engine/render/asset/shader.h @@ -1,10 +1,16 @@ #pragma once -#include "asset_render.h" +#include "asset/asset.h" namespace engineapi { - class Shader : public Resource { + class ShaderProgram : public Resource {}; + class Shader : public Asset { + private: uint32_t mId; ShaderInfo mInfo; + string mVertexName; + RscHandle mVert; + RscHandle mFrag; + friend class Scene; public: Shader(); ~Shader(); @@ -14,7 +20,16 @@ namespace engineapi { ShaderInfo& GetInfo() { return mInfo; } - vector GetVertData(); - vector GetFragData(); + string_view GetVertexName() { + return mVertexName; + } + template + RscHandle GetVertHandle() { + return mVert; + } + template + RscHandle GetFragHandle() { + return mFrag; + } }; }; \ No newline at end of file diff --git a/engine/src/engine/render/asset/texture.h b/engine/src/engine/render/asset/texture.h index 1b28cc7..afe1af7 100644 --- a/engine/src/engine/render/asset/texture.h +++ b/engine/src/engine/render/asset/texture.h @@ -1,5 +1,5 @@ #pragma once -#include "asset_render.h" +#include "asset/asset.h" namespace engineapi { class Texture : public Asset { diff --git a/engine/src/engine/render/node/rendernode_forward.cpp b/engine/src/engine/render/node/rendernode_forward.cpp index 867aa3e..af2c5fa 100644 --- a/engine/src/engine/render/node/rendernode_forward.cpp +++ b/engine/src/engine/render/node/rendernode_forward.cpp @@ -3,12 +3,11 @@ #include "../window.h" #include "object/camera/camera.h" #include "../asset/model.h" -#include "asset/asset_manager.h" namespace engineapi { RenderNodeForwardRendering::RenderNodeForwardRendering() :RenderNode(RENDER_FORWARD_RENDERING) { - mSky = AssetManager::GetSingletonPtr()->LoadAsset("assets/models/SkyBoxMesh.ply", Asset::ASSET_SHARED_FLAG | Asset::ASSET_ASYNC_FLAG); + //mSky = AssetManager::GetSingletonPtr()->LoadAsset("assets/models/SkyBoxMesh.ply", Asset::ASSET_SHARED_FLAG | Asset::ASSET_ASYNC_FLAG); //skyBoxMaterial = new Material(new Shader(Resources::GetAssetFullPath("Shaders/SkyBox.zxshader", true), FrameBufferType::Normal)); diff --git a/engine/src/engine/render/render_context.h b/engine/src/engine/render/render_context.h index c370b00..5dff1e0 100644 --- a/engine/src/engine/render/render_context.h +++ b/engine/src/engine/render/render_context.h @@ -1,6 +1,6 @@ #pragma once -#include "asset/asset_render.h" +#include "asset/asset.h" namespace engineapi { class RenderContext { diff --git a/engine/src/engine/vulkanapi/loader/vulkan_glsl_loader.cpp b/engine/src/engine/vulkanapi/loader/vulkan_glsl_loader.cpp index 90300d6..1edf3a5 100644 --- a/engine/src/engine/vulkanapi/loader/vulkan_glsl_loader.cpp +++ b/engine/src/engine/vulkanapi/loader/vulkan_glsl_loader.cpp @@ -1,8 +1,11 @@ #include "vulkan_glsl_loader.h" #include "vulkanapi/tool/glsl_to_spirv.h" +#include "vulkanapi/vulkanapi.h" #include "asset/file_manager.h" -#include "render/asset/shader.h" -namespace engineapi { +#include "render/meta/vertex.h" +#include "vkmeta_vertex_gen.inl" +using namespace engineapi; +namespace vulkanapi { vk::ShaderStageFlagBits GetShaderType(string_view ext) { switch (string_hash(ext)) @@ -13,22 +16,41 @@ namespace engineapi { case string_hash(".tesc"): return vk::ShaderStageFlagBits::eTessellationControl; case string_hash(".frag"): return vk::ShaderStageFlagBits::eFragment; case string_hash(".comp"): return vk::ShaderStageFlagBits::eCompute; - default: return vk::ShaderStageFlagBits::eAll; + default: return vk::ShaderStageFlagBits::eAll; } } + void VulkanGlslLoader::Init() + { + ResourceManager::GetSingleton().RegisterLoader(".geom"); + ResourceManager::GetSingleton().RegisterLoader(".frag"); + ResourceManager::GetSingleton().RegisterLoader(".vert"); + } + void VulkanGlslLoader::LoadShaderInfo(const std::string_view& name) + { + auto it = refl::UClass::MetaTable.find(Name(name)); + auto meta = it->second->vtable.GetMeta("vkMeta"); + int x = 1; + int y = 2; + } //string PreprocessGlsl(string glsl); ResourceBundle VulkanGlslLoader::LoadFile(PackagePath handle, const MetaBundle& meta) { - auto m = meta.FetchMeta(); - auto program = m ? ResourceManager::GetSingleton().LoaderEmplaceResource(m->guid) - : ResourceManager::GetSingleton().LoaderEmplaceResource(); + auto m = meta.FetchMeta(); + auto program = m ? ResourceManager::GetSingleton().LoaderEmplaceResource(m->guid) + : ResourceManager::GetSingleton().LoaderEmplaceResource(); string glsl = FileManager::LoadTextFile(handle.AbsolutePath()); auto shader_enum = GetShaderType(handle.GetExtension()); - glsl = vulkanapi::GlslToSpirv::PreprocessGlsl(glsl); - auto spirv = vulkanapi::GlslToSpirv::spirv(glsl, shader_enum); - //if (spirv) - //program->Load(shader_enum, {}, string_view{ r_cast(spirv->data()),hlp::buffer_size(*spirv) }, glsl); + glsl = GlslToSpirv::PreprocessGlsl(glsl); + auto spirv = GlslToSpirv::spirv(glsl, shader_enum); + if (spirv) { + program->Load(*spirv); + } return program; } + void vkShaderProgram::Load(const std::vector& spirv) + { + RenderVulkanAPI* renderApi = RenderVulkanAPI::GetSingletonPtr(); + mPtr = renderApi->backend.GetDevice().CreateShaderModule(spirv); + } } diff --git a/engine/src/engine/vulkanapi/loader/vulkan_glsl_loader.h b/engine/src/engine/vulkanapi/loader/vulkan_glsl_loader.h index 2a29f85..b246197 100644 --- a/engine/src/engine/vulkanapi/loader/vulkan_glsl_loader.h +++ b/engine/src/engine/vulkanapi/loader/vulkan_glsl_loader.h @@ -1,8 +1,22 @@ #pragma once +#include "render/asset/shader.h" #include "asset/resource_manager.h" -namespace engineapi { - class VulkanGlslLoader : public IFileLoader +#include "vulkanapi/vulkan.h" +namespace vulkanapi { + class vkShaderProgram : public engineapi::ShaderProgram { + private: + VkShaderModule mPtr; + public: + VkShaderModule Ptr() { + return mPtr; + } + void Load(const std::vector& spirv); + }; + class VulkanGlslLoader : public engineapi::IFileLoader { - ResourceBundle LoadFile(PackagePath handle, const MetaBundle& meta) override; + public: + static void Init(); + static void LoadShaderInfo(const std::string_view& name); + engineapi::ResourceBundle LoadFile(engineapi::PackagePath handle, const engineapi::MetaBundle& meta) override; }; } \ No newline at end of file diff --git a/engine/src/engine/vulkanapi/tool/glsl_to_spirv.cpp b/engine/src/engine/vulkanapi/tool/glsl_to_spirv.cpp index 475eb0c..d74df9d 100644 --- a/engine/src/engine/vulkanapi/tool/glsl_to_spirv.cpp +++ b/engine/src/engine/vulkanapi/tool/glsl_to_spirv.cpp @@ -1,5 +1,6 @@ #include "glsl_to_spirv.h" #include "zstd/table.h" +#include "meta/pad.h" #include "meta/hash.h" #include "yaml/yaml.h" #include @@ -53,22 +54,10 @@ namespace vulkanapi shaderc::CompileOptions opt; opt.SetTargetEnvironment(shaderc_target_env::shaderc_target_env_vulkan, 0); auto result = compiler.CompileGlslToSpv(val, ConvertStageSC(v_stage), code_id.data(), opt); - if (result.GetCompilationStatus() == shaderc_compilation_status::shaderc_compilation_status_success) - spirv_out = vector{ result.begin(),result.end() }; - else - { - string filename = "/" + string{ code_id } + YAML::Text_Serialize(meta::string_hash(glsl)); - auto err_m = result.GetErrorMessage(); - auto err_msg = err_m.c_str(); - //LOG_TO(LogPool::GFX, "%s", err_msg); - try - { - } - catch (...) - { - //LOG_TO(LogPool::GFX, "Failed to output glsl [%s] that generated the above error.", filename.c_str()); - } - } + if (result.GetCompilationStatus() != shaderc_compilation_status::shaderc_compilation_status_success) + return spirv_out; + spirv_out = vector{ result.begin(),result.end() }; + //meta::padding_vector(*spirv_out, (unsigned int)4, (unsigned int)0); } return spirv_out; } diff --git a/engine/src/engine/vulkanapi/vulkan_struct.h b/engine/src/engine/vulkanapi/vulkan_struct.h index a14d8ea..fc55d1f 100644 --- a/engine/src/engine/vulkanapi/vulkan_struct.h +++ b/engine/src/engine/vulkanapi/vulkan_struct.h @@ -3,7 +3,7 @@ // AMD写的Vulkan内存分配器 #include "vk_mem_alloc.h" #include "math/matrix4.h" -#include "render/asset/asset_render.h" +#include "asset/asset.h" using engineapi::Matrix4; using engineapi::FrameBufferType; using engineapi::ClearInfo; diff --git a/engine/src/engine/vulkanapi/vulkanapi.cpp b/engine/src/engine/vulkanapi/vulkanapi.cpp index 690ecbe..eecd567 100644 --- a/engine/src/engine/vulkanapi/vulkanapi.cpp +++ b/engine/src/engine/vulkanapi/vulkanapi.cpp @@ -12,7 +12,7 @@ #include "wrapper/descriptorpool.h" #include "window.h" #include "zlog.h" -#include "vkmeta_vertex_gen.inl" +#include "loader/vulkan_glsl_loader.h" namespace vulkanapi { RenderVulkanAPI::RenderVulkanAPI() :backend("vulkan") @@ -27,6 +27,11 @@ namespace vulkanapi { void RenderVulkanAPI::SwitchContext() { + } + void RenderVulkanAPI::Init() + { + VulkanGlslLoader::Init(); + RenderAPI::Init(); } void RenderVulkanAPI::InitRenderPass() { @@ -101,9 +106,9 @@ namespace vulkanapi { // 销毁StagingBuffer Buffer::DestroyBuffer(vertexStagingBuffer, vertexVmaStagingAlloc); Buffer::DestroyBuffer(indexStagingBuffer, indexVmaStagingAlloc); - mesh->EndLoad(); + //mesh->EndLoad(); }; - if (mesh->IsAsync()) { + if (true) { Backend::TransferWorker->InvokeBuffer(fn, callback); } else { @@ -146,14 +151,13 @@ namespace vulkanapi { } void RenderVulkanAPI::LoadShader(Shader* shader) { + VulkanGlslLoader::LoadShaderInfo(shader->GetVertexName()); vector shaderStages; - map shaderModules; + std::map shaderModules; auto device = backend.GetDevice(); - auto vertData = shader->GetVertData(); - auto vertModule = device.CreateShaderModule(vertData); + auto vertModule = shader->GetVertHandle()->Ptr(); shaderModules.insert(make_pair(VK_SHADER_STAGE_VERTEX_BIT, vertModule)); - auto fragData = shader->GetFragData(); - auto fragModule = device.CreateShaderModule(fragData); + auto fragModule = shader->GetVertHandle()->Ptr(); shaderModules.insert(make_pair(VK_SHADER_STAGE_FRAGMENT_BIT, fragModule)); for (auto& shaderModule : shaderModules) { diff --git a/engine/src/engine/vulkanapi/vulkanapi.h b/engine/src/engine/vulkanapi/vulkanapi.h index 1d4e921..4f6928f 100644 --- a/engine/src/engine/vulkanapi/vulkanapi.h +++ b/engine/src/engine/vulkanapi/vulkanapi.h @@ -18,6 +18,7 @@ namespace vulkanapi vector VAOList; vector PassList; vector PiPelineList; + hash_table ShaderInfoList; public: RenderVulkanAPI(); ~RenderVulkanAPI()override; @@ -28,6 +29,7 @@ namespace vulkanapi public: void SwitchContext()override; public: + void Init() override; void InitRenderPass()override; public: void SetViewPort(uint32_t width, uint32_t height, uint32_t xOffset = 0, uint32_t yOffset = 0)override; diff --git a/engine/src/engine/vulkanapi/wrapper/device.cpp b/engine/src/engine/vulkanapi/wrapper/device.cpp index 8fd0bf8..c448221 100644 --- a/engine/src/engine/vulkanapi/wrapper/device.cpp +++ b/engine/src/engine/vulkanapi/wrapper/device.cpp @@ -91,5 +91,17 @@ namespace vulkanapi { VkResult result = vkCreateShaderModule(mPtr, &createInfo, nullptr, &module); return module; } + VkShaderModule Device::CreateShaderModule(vector code) + { + VkShaderModuleCreateInfo createInfo = {}; + createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + // 这里需要确保数据满足uint32_t的对齐要求,存储在vector中,默认分配器已经确保数据满足最差情况下的对齐要求 + createInfo.codeSize = code.size(); + // 转换为Vulkan要求的uint32_t指针 + createInfo.pCode = reinterpret_cast(code.data()); + VkShaderModule module; + VkResult result = vkCreateShaderModule(mPtr, &createInfo, nullptr, &module); + return module; + } } diff --git a/engine/src/engine/vulkanapi/wrapper/device.h b/engine/src/engine/vulkanapi/wrapper/device.h index 68dc0bb..1b68550 100644 --- a/engine/src/engine/vulkanapi/wrapper/device.h +++ b/engine/src/engine/vulkanapi/wrapper/device.h @@ -25,5 +25,6 @@ namespace vulkanapi { VkFence CreateFence(); VkSemaphore CreateSemaphore(); VkShaderModule CreateShaderModule(vector code); + VkShaderModule CreateShaderModule(vector code); }; }; \ No newline at end of file diff --git a/engine/src/main.cpp b/engine/src/main.cpp index 3ca56b1..77ccd0f 100644 --- a/engine/src/main.cpp +++ b/engine/src/main.cpp @@ -1,22 +1,12 @@ #include #include -#include "asset/file_manager.h" -#include "asset/resource_manager.h" -#include "vulkanapi/loader/vulkan_glsl_loader.h" - +#include "app.h" +#include "zlog.h" using namespace engineapi; int main(int argc, char** argv) { - vector SystemList; - SystemList.push_back(new FileManager()); - SystemList.push_back(new ResourceManager()); - for (auto system : SystemList) { - system->Init(); - } - for (auto system : SystemList) { - system->LateInit(); - } - ResourceManager::GetSingleton().RegisterLoader(FName(".frag")); - ResourceManager::GetSingleton().Load("/engine/assets/shader/simple.frag", true); + const char* name = "zengine"; + App game(name); + game.Launch(); return 0; }