slot 0.0.1
A real time UI render framework
载入中...
搜索中...
未找到
ResourceManager.h
浏览该文件的文档.
1#pragma once
2
4#include "Mesh/BaseMesh.h"
5#include "ResourcePool.h"
6#include "Shader/BaseShader.h"
9
10#include <memory>
11#include <string>
12#include <type_traits>
13#include <utility>
14
15namespace z8 {
16
18template <typename T>
19using StoredResourceTy = std::conditional_t<
20 std::is_base_of_v<BaseMesh, T>, BaseMesh,
21 std::conditional_t<
22 std::is_base_of_v<BaseMaterial, T>, BaseMaterial,
23 std::conditional_t<
24 std::is_base_of_v<BaseShaderComponent, T>, BaseShaderComponent,
25 std::conditional_t<
26 std::is_base_of_v<BaseShader, T>, BaseShader,
27 std::conditional_t<std::is_base_of_v<BaseTexture, T>,
28 BaseTexture, void>>>>>;
29
35public:
41
43
44 template <typename T>
45 ResourceRef<StoredResourceTy<T>> Add(std::unique_ptr<T> resource);
46
51 template <typename T>
53 std::unique_ptr<T> resource);
54
56 template <typename ResourceTy>
58 Resolve(const ResourceRef<ResourceTy> &reference) const;
59
61 template <typename ResourceTy>
63
65 template <typename ResourceTy>
66 const ResourceTy *TryGet(ResourceRef<ResourceTy> reference) const;
67
68private:
70 template <typename T> static bool MatchesType(ResourceTy type);
71
73 template <typename T> ResourcePool<T> &Pool();
74
76 template <typename T> const ResourcePool<T> &Pool() const;
77
79};
80
81template <typename T>
82ResourceRef<StoredResourceTy<T>>
83ResourceManager::Add(std::unique_ptr<T> resource) {
85 static_assert(!std::is_void_v<StoredTy>,
86 "ResourceManager::Add received an unsupported resource type.");
87
88 if (!resource)
89 return {};
90
91 // 先读取名称再转移所有权;具体派生类是资源描述的唯一来源,
92 // 注册路径不再临时改写 ID 或类别。
93 const std::string assetId = resource->Id;
94 const auto type = resource->Type;
96 return {};
97 return Add(std::move(assetId), std::move(resource));
98}
99
100template <typename T>
102ResourceManager::Add(std::string assetId, std::unique_ptr<T> resource) {
104 static_assert(!std::is_void_v<StoredTy>,
105 "ResourceManager::Add received an unsupported resource type.");
106
107 // 所有 Mesh 无论来自内建构造还是文件导入,都在进入池前执行相同安全检查;
108 // PreserveAuthored 用于阻止分裂法线或解析曲面法线被错误地再次平均。
109 if constexpr (std::is_same_v<StoredTy, BaseMesh>) {
110 if (!resource || !resource->Validate())
111 return {};
112 if (resource->NormalMode == NormalTy::Generate)
113 resource->ComputeNormals();
114 } else if constexpr (std::is_same_v<StoredTy, BaseTexture>) {
115 if (!resource || !resource->Validate())
116 return {};
117 }
118 return Pool<StoredTy>().Add(std::move(assetId), std::move(resource));
119}
120
121template <typename T> bool ResourceManager::MatchesType(ResourceTy type) {
122 if constexpr (std::is_same_v<T, BaseMesh>)
123 return type == ResourceTy::Mesh;
124 if constexpr (std::is_same_v<T, BaseMaterial>)
125 return type == ResourceTy::Material;
126 if constexpr (std::is_same_v<T, BaseShaderComponent>)
128 if constexpr (std::is_same_v<T, BaseShader>)
129 return type == ResourceTy::Shader;
130 if constexpr (std::is_same_v<T, BaseTexture>)
131 return type == ResourceTy::Texture;
132 return false;
133}
134
135template <typename T> ResourcePool<T> &ResourceManager::Pool() {
136 // 类型到成员池的分派只在 const 版本维护一份;这里的 this 本身可写,因此恢复
137 // 可写引用不会突破调用者的 const 边界。
138 return const_cast<ResourcePool<T> &>(std::as_const(*this).Pool<T>());
139}
140
141template <typename T> const ResourcePool<T> &ResourceManager::Pool() const {
142 if constexpr (std::is_same_v<T, BaseMesh>) {
143 return Meshes;
144 } else if constexpr (std::is_same_v<T, BaseMaterial>) {
145 return Materials;
146 } else if constexpr (std::is_same_v<T, BaseShaderComponent>) {
147 return Shaders;
148 } else if constexpr (std::is_same_v<T, BaseShader>) {
149 return ShaderPrograms;
150 } else if constexpr (std::is_same_v<T, BaseTexture>) {
151 return Textures;
152 } else {
153 static_assert(
154 !sizeof(T),
155 "ResourceManager::Pool received an unsupported resource type.");
156 }
157}
158
159template <typename ResourceTy>
162 // 合并后的引用允许调用方安全地重复解析;热路径已持有 Index 时不再查询字符串表。
163 if (reference.IsResolved())
164 return reference;
165 return Pool<ResourceTy>().Find(reference.GetId());
166}
167
168template <typename ResourceTy>
170 return Pool<ResourceTy>().TryGet(reference);
171}
172
173template <typename ResourceTy>
174const ResourceTy *
176 return Pool<ResourceTy>().TryGet(reference);
177}
178
179} // namespace z8
Definition BaseMesh.h:23
与图形后端无关的 RGBA8 纹理资源。
Definition BaseTexture.h:19
应用级资源所有者和类型安全查询入口。 Manager 本身不是单例:Application 显式拥有它
Definition ResourceManager.h:34
ResourcePool< BaseShader > ShaderPrograms
Definition ResourceManager.h:39
ResourceTy * TryGet(ResourceRef< ResourceTy > reference)
Definition ResourceManager.h:169
ResourceManager()
Definition ResourceManager.h:42
static bool MatchesType(ResourceTy type)
Definition ResourceManager.h:121
ResourcePool< T > & Pool()
Definition ResourceManager.h:135
ResourcePool< BaseShaderComponent > Shaders
Definition ResourceManager.h:38
ResourcePool< BaseMaterial > Materials
Definition ResourceManager.h:37
ResourceRef< ResourceTy > Resolve(const ResourceRef< ResourceTy > &reference) const
Definition ResourceManager.h:161
ResourcePool< BaseTexture > Textures
Definition ResourceManager.h:40
ResourceRef< StoredResourceTy< T > > Add(std::unique_ptr< T > resource)
Definition ResourceManager.h:83
ResourcePool< BaseMesh > Meshes
Definition ResourceManager.h:36
void RegisterBuiltinResources()
Definition ResourceManager.cpp:10
资源的强类型引用,同时覆盖持久化 ID 与运行时索引两种边界。
Definition ResourceRef.h:36
std::string Id
Definition ResourceRef.h:39
const std::string & GetId() const
Definition ResourceRef.h:52
bool IsResolved() const
Definition ResourceRef.h:54
世界矩阵 描述坐标系,左手坐标系 使用 DirectX12 坐标系的描述
Definition Application.h:15
ResourceTy
Definition ResourceRef.h:10
std::conditional_t< std::is_base_of_v< BaseMesh, T >, BaseMesh, std::conditional_t< std::is_base_of_v< BaseMaterial, T >, BaseMaterial, std::conditional_t< std::is_base_of_v< BaseShaderComponent, T >, BaseShaderComponent, std::conditional_t< std::is_base_of_v< BaseShader, T >, BaseShader, std::conditional_t< std::is_base_of_v< BaseTexture, T >, BaseTexture, void > > > > > StoredResourceTy
Definition ResourceManager.h:19
材质 基于 Cook‑Torrance BRDF
Definition BaseMaterial.h:20
Shader 派生类共享的后端无关编译描述。
Definition BaseShaderComponent.h:28
一次图形绘制使用的完整 Shader 与固定管线状态描述。
Definition BaseShader.h:17