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
166 constexpr size_t getTextureCount() const noexcept { return m_textureCount; }
167 constexpr size_t getSamplerCount() const noexcept { return m_samplerCount; }
168
169 constexpr const TextureElement& getTexture(size_t index) const noexcept {
170 return (index < m_textureCount) ? m_textures[index] : m_textures[0];
171 }
172
173 constexpr const SamplerElement& getSampler(size_t index) const noexcept {
174 return (index < m_samplerCount) ? m_samplers[index] : m_samplers[0];
175 }
176
177 constexpr int findTextureIndex(const char* name) const noexcept {
178 for (size_t i = 0; i < m_textureCount; ++i) {
179 if (StringEquals(m_textures[i].getName(), name)) {
180 return static_cast<int>(i);
181 }
182 }
183 return -1;
184 }
185
186 constexpr int findSamplerIndex(const char* name) const noexcept {
187 for (size_t i = 0; i < m_samplerCount; ++i) {
188 if (StringEquals(m_samplers[i].getName(), name)) {
189 return static_cast<int>(i);
190 }
191 }
192 return -1;
193 }
194
195 constexpr TextureElement findTexture(const char* name) const noexcept {
196 int index = findTextureIndex(name);
197 return (index >= 0) ? m_textures[index] : TextureElement();
198 }
199
200 constexpr SamplerElement findSampler(const char* name) const noexcept {
201 int index = findSamplerIndex(name);
202 return (index >= 0) ? m_samplers[index] : SamplerElement();
203 }
204
205 private:
206 constexpr void processArgs() noexcept {
207
208 }
209 template<typename... Rest>
210 constexpr void processArgs(const ResourceLayout& other, Rest&&... rest) noexcept {
211 for (size_t i = 0; i < other.m_textureCount; ++i) {
212 addTexture(other.m_textures[i]);
213 }
214
215 for (size_t i = 0; i < other.m_samplerCount; ++i) {
216 addSampler(other.m_samplers[i]);
217 }
218
219 processArgs(std::forward<Rest>(rest)...);
220 }
221 template<typename... Rest>
222 constexpr void processArgs(const TextureElement& element, Rest&&... rest) noexcept {
223 addTexture(element);
224 processArgs(std::forward<Rest>(rest)...);
225 }
226
227 template<typename... Rest>
228 constexpr void processArgs(const SamplerElement& element, Rest&&... rest) noexcept {
229 addSampler(element);
230 processArgs(std::forward<Rest>(rest)...);
231 }
232
237 };
238}
239namespace std
240{
241 template<>
242 struct hash<FCT::TextureElement>
243 {
244 std::size_t operator()(const FCT::TextureElement& element) const noexcept {
245 std::size_t seed = 0;
246
247 if (element.getName() != nullptr) {
248 boost::hash_combine(seed, std::string(element.getName()));
249 }
250
251 boost::hash_combine(seed, static_cast<std::size_t>(element.getType()));
252 boost::hash_combine(seed, static_cast<uint32_t>(element.getShaderStages()));
253 boost::hash_combine(seed, static_cast<std::size_t>(element.getUpdateFrequency()));
254
255 return seed;
256 }
257 };
258}
259#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
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