FCT
载入中...
搜索中...
未找到
ResourceLayout.h
浏览该文件的文档.
1//
2// Created by Administrator on 2025/4/16.
3//
4#include "../ThirdParty.h"
5#include "DataTypes.h"
6#include "../Base/Flags.h"
7#include "../Base/string.h"
8#include "Uniform.h"
9#ifndef RESOURCELAYOUT_H
10#define RESOURCELAYOUT_H
11
12namespace FCT
13{
21
22 inline constexpr const char* GetTextureDefaultName(TextureType type)
23 {
24 switch (type)
25 {
27 return "u_Texture2D";
29 return "u_Texture3D";
31 return "u_TextureCube";
33 return "u_Texture2DArray";
35 return "u_DepthTexture";
36 default:
37 return "u_Texture";
38 }
39 }
40
42 public:
46
47 constexpr TextureElement(const TextureElement& other) noexcept
48 : m_type(other.m_type), m_name(other.m_name),
49 m_stages(other.m_stages), m_updateFrequency(other.m_updateFrequency) {}
50
54
58
59 constexpr TextureElement(TextureType type, const char* name) noexcept
60 : m_type(type), m_name(name),
62
63 constexpr TextureElement(TextureType type, const char* name, UpdateFrequency updateFreq) noexcept
64 : m_type(type), m_name(name),
66
67 constexpr TextureElement(TextureType type, const char* name, ShaderStages stages,
68 UpdateFrequency updateFreq = UpdateFrequency::PerFrame) noexcept
69 : m_type(type), m_name(name),
70 m_stages(stages), m_updateFrequency(updateFreq) {}
71
72 constexpr TextureType getType() const noexcept { return m_type; }
73 constexpr const char* getName() const noexcept { return m_name; }
74 constexpr ShaderStages getShaderStages() const noexcept { return m_stages; }
75 constexpr UpdateFrequency getUpdateFrequency() const noexcept { return m_updateFrequency; }
76
77 bool operator==(const TextureElement& other) const noexcept {
78 return m_type == other.m_type &&
79 StringEquals(m_name, other.m_name) &&
80 m_stages == other.m_stages &&
81 m_updateFrequency == other.m_updateFrequency;
82 }
83
84 bool operator!=(const TextureElement& other) const noexcept {
85 return !(*this == other);
86 }
87
88 constexpr explicit operator bool() const noexcept {
89 return m_name != nullptr && m_name[0] != '\0';
90 }
91 private:
93 const char* m_name;
94 ShaderStages m_stages;
96 };
97
99 public:
103
104 constexpr SamplerElement(const char* name) noexcept
107
108 constexpr SamplerElement(const char* name, ShaderStages stages) noexcept
109 : m_name(name), m_stages(stages),
111
112 constexpr SamplerElement(const char* name, UpdateFrequency updateFreq) noexcept
114 m_updateFrequency(updateFreq) {}
115
116 constexpr SamplerElement(const char* name, ShaderStages stages,
117 UpdateFrequency updateFreq) noexcept
118 : m_name(name), m_stages(stages),
119 m_updateFrequency(updateFreq) {}
120
121 constexpr const char* getName() const noexcept { return m_name; }
122 constexpr ShaderStages getShaderStages() const noexcept { return m_stages; }
123 constexpr UpdateFrequency getUpdateFrequency() const noexcept { return m_updateFrequency; }
124
125 bool operator==(const SamplerElement& other) const noexcept {
126 return StringEquals(m_name, other.m_name) &&
127 m_stages == other.m_stages &&
128 m_updateFrequency == other.m_updateFrequency;
129 }
130
131 bool operator!=(const SamplerElement& other) const noexcept {
132 return !(*this == other);
133 }
134
135 private:
136 const char* m_name;
137 ShaderStages m_stages;
139 };
140
142 public:
143 static constexpr size_t MaxElements = 64;
144
145 constexpr ResourceLayout() noexcept
147
148 template<typename... Args>
149 constexpr ResourceLayout(Args&&... args) noexcept
151 processArgs(std::forward<Args>(args)...);
152 }
153
154 constexpr void addTexture(const TextureElement& element) noexcept {
156 m_textures[m_textureCount++] = element;
157 }
158 }
159
160 constexpr void addSampler(const SamplerElement& element) noexcept {
162 m_samplers[m_samplerCount++] = element;
163 }
164 }
165 constexpr bool removeTexture(const char* name) noexcept {
166 int index = findTextureIndex(name);
167 if (index < 0) {
168 return false;
169 }
170
171 for (size_t i = static_cast<size_t>(index); i < m_textureCount - 1; ++i) {
172 m_textures[i] = m_textures[i + 1];
173 }
174
176 return true;
177 }
178
179 constexpr size_t getTextureCount() const noexcept { return m_textureCount; }
180 constexpr size_t getSamplerCount() const noexcept { return m_samplerCount; }
181
182 constexpr const TextureElement& getTexture(size_t index) const noexcept {
183 return (index < m_textureCount) ? m_textures[index] : m_textures[0];
184 }
185
186 constexpr const SamplerElement& getSampler(size_t index) const noexcept {
187 return (index < m_samplerCount) ? m_samplers[index] : m_samplers[0];
188 }
189
190 constexpr int findTextureIndex(const char* name) const noexcept {
191 for (size_t i = 0; i < m_textureCount; ++i) {
192 if (StringEquals(m_textures[i].getName(), name)) {
193 return static_cast<int>(i);
194 }
195 }
196 return -1;
197 }
198
199 constexpr int findSamplerIndex(const char* name) const noexcept {
200 for (size_t i = 0; i < m_samplerCount; ++i) {
201 if (StringEquals(m_samplers[i].getName(), name)) {
202 return static_cast<int>(i);
203 }
204 }
205 return -1;
206 }
207
208 constexpr TextureElement findTexture(const char* name) const noexcept {
209 int index = findTextureIndex(name);
210 return (index >= 0) ? m_textures[index] : TextureElement();
211 }
212
213 constexpr SamplerElement findSampler(const char* name) const noexcept {
214 int index = findSamplerIndex(name);
215 return (index >= 0) ? m_samplers[index] : SamplerElement();
216 }
217
218 private:
219 constexpr void processArgs() noexcept {
220
221 }
222 template<typename... Rest>
223 constexpr void processArgs(const ResourceLayout& other, Rest&&... rest) noexcept {
224 for (size_t i = 0; i < other.m_textureCount; ++i) {
225 addTexture(other.m_textures[i]);
226 }
227
228 for (size_t i = 0; i < other.m_samplerCount; ++i) {
229 addSampler(other.m_samplers[i]);
230 }
231
232 processArgs(std::forward<Rest>(rest)...);
233 }
234 template<typename... Rest>
235 constexpr void processArgs(const TextureElement& element, Rest&&... rest) noexcept {
236 addTexture(element);
237 processArgs(std::forward<Rest>(rest)...);
238 }
239
240 template<typename... Rest>
241 constexpr void processArgs(const SamplerElement& element, Rest&&... rest) noexcept {
242 addSampler(element);
243 processArgs(std::forward<Rest>(rest)...);
244 }
245
250 };
251}
252namespace std
253{
254 template<>
255 struct hash<FCT::TextureElement>
256 {
257 std::size_t operator()(const FCT::TextureElement& element) const noexcept {
258 std::size_t seed = 0;
259
260 if (element.getName() != nullptr) {
261 boost::hash_combine(seed, std::string(element.getName()));
262 }
263
264 boost::hash_combine(seed, static_cast<std::size_t>(element.getType()));
265 boost::hash_combine(seed, static_cast<uint32_t>(element.getShaderStages()));
266 boost::hash_combine(seed, static_cast<std::size_t>(element.getUpdateFrequency()));
267
268 return seed;
269 }
270 };
271}
272#endif //RESOURCELAYOUT_H
constexpr void processArgs(const ResourceLayout &other, Rest &&... rest) noexcept
constexpr ResourceLayout(Args &&... args) noexcept
constexpr size_t getSamplerCount() const noexcept
constexpr const TextureElement & getTexture(size_t index) const noexcept
constexpr size_t getTextureCount() const noexcept
constexpr bool removeTexture(const char *name) noexcept
static constexpr size_t MaxElements
constexpr void processArgs() noexcept
constexpr const SamplerElement & getSampler(size_t index) const noexcept
constexpr void processArgs(const SamplerElement &element, Rest &&... rest) noexcept
constexpr int findSamplerIndex(const char *name) const noexcept
constexpr TextureElement findTexture(const char *name) const noexcept
TextureElement m_textures[MaxElements]
constexpr void addSampler(const SamplerElement &element) noexcept
constexpr SamplerElement findSampler(const char *name) const noexcept
constexpr void processArgs(const TextureElement &element, Rest &&... rest) noexcept
constexpr void addTexture(const TextureElement &element) noexcept
constexpr ResourceLayout() noexcept
SamplerElement m_samplers[MaxElements]
constexpr int findTextureIndex(const char *name) const noexcept
UpdateFrequency m_updateFrequency
constexpr SamplerElement(const char *name, UpdateFrequency updateFreq) noexcept
constexpr ShaderStages getShaderStages() const noexcept
constexpr SamplerElement(const char *name, ShaderStages stages) noexcept
constexpr SamplerElement(const char *name) noexcept
constexpr UpdateFrequency getUpdateFrequency() const noexcept
bool operator==(const SamplerElement &other) const noexcept
constexpr SamplerElement() noexcept
constexpr const char * getName() const noexcept
bool operator!=(const SamplerElement &other) const noexcept
constexpr SamplerElement(const char *name, ShaderStages stages, UpdateFrequency updateFreq) noexcept
constexpr ShaderStages getShaderStages() const noexcept
constexpr const char * getName() const noexcept
bool operator==(const TextureElement &other) const noexcept
constexpr TextureElement(TextureType type) noexcept
UpdateFrequency m_updateFrequency
bool operator!=(const TextureElement &other) const noexcept
constexpr TextureType getType() const noexcept
constexpr UpdateFrequency getUpdateFrequency() const noexcept
constexpr TextureElement(const TextureElement &other) noexcept
constexpr TextureElement(TextureType type, const char *name, ShaderStages stages, UpdateFrequency updateFreq=UpdateFrequency::PerFrame) noexcept
constexpr TextureElement(TextureType type, const char *name) noexcept
constexpr TextureElement(const char *name) noexcept
constexpr TextureElement() noexcept
constexpr TextureElement(TextureType type, const char *name, UpdateFrequency updateFreq) noexcept
UpdateFrequency
constexpr bool StringEquals(const char *a, const char *b) noexcept
定义 string.h:8
constexpr const char * GetTextureDefaultName(TextureType type)
std::size_t operator()(const FCT::TextureElement &element) const noexcept