UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MaterialKeyGeneratorContext.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#if WITH_EDITOR
10#include "Misc/StringBuilder.h"
11#include "RHIShaderPlatform.h"
15#include "Templates/Function.h"
16#include "UObject/NameTypes.h"
17
35{
36public:
38 enum class EMode : uint8
39 {
41 Saving,
42 Loading,
43 };
44
45public:
50 ENGINE_API FMaterialKeyGeneratorContext(TUniqueFunction<void(const void* Data, uint64 Size)>&& HashFunction,
59
61 inline void AddFlags(EMaterialKeyInclude Flags);
63 inline void RemoveFlags(EMaterialKeyInclude Flags);
67 inline bool HasAllFlags(EMaterialKeyInclude Flags) const;
69 inline EMaterialKeyInclude GetFlags() const;
70
72 inline EMode GetMode() const;
74 inline bool IsEmitting() const;
76 inline bool IsRecording() const;
78 inline bool IsSaving() const;
80 inline bool IsLoading() const;
82 inline EShaderPlatform GetShaderPlatform() const;
84 inline FName GetShaderFormat() const;
85
91 template <typename T>
92 inline void RecordAndEmit(FUtf8StringView Name, T&& Data);
93
98 template <typename T>
99 inline void Record(FUtf8StringView Name, T&& Data);
111 inline void PostLoad(TFunctionRef<void()> Action);
112
117 template <typename T>
118 inline void Emit(T&& Data);
120 inline void EmitFunc(TFunctionRef<void(FShaderKeyGenerator&)> Callback);
122 inline void EmitDebugText(FStringView Data);
124 inline void EmitSeparator();
126 inline void EmitBoolInt(bool Data);
131
133 inline bool HasLoadError() const;
134
135private:
136 FCbObjectView GetCurrentObject();
137
138private:
139 union
140 {
141 FShaderKeyGenerator KeyGen;
143 FCbWriter* Writer;
144 };
145 FName ShaderFormat;
147 EMode Mode = EMode::Emitting;
149 bool bHasLoadError = false;
150};
151
153
155// Inline implementations
157
158inline void FMaterialKeyGeneratorContext::AddFlags(EMaterialKeyInclude Flags)
159{
160 EnumAddFlags(IncludeFlags, Flags);
161}
162
163inline void FMaterialKeyGeneratorContext::RemoveFlags(EMaterialKeyInclude Flags)
164{
165 EnumRemoveFlags(IncludeFlags, Flags);
166}
167
168inline void FMaterialKeyGeneratorContext::SetFlags(EMaterialKeyInclude Flags, bool bIncluded)
169{
170 if (bIncluded)
171 {
172 AddFlags(Flags);
173 }
174 else
175 {
176 RemoveFlags(Flags);
177 }
178}
179
180inline bool FMaterialKeyGeneratorContext::HasAllFlags(EMaterialKeyInclude Flags) const
181{
182 return EnumHasAllFlags(IncludeFlags, Flags);
183}
184
185inline EMaterialKeyInclude FMaterialKeyGeneratorContext::GetFlags() const
186{
187 return IncludeFlags;
188}
189
190FMaterialKeyGeneratorContext::EMode FMaterialKeyGeneratorContext::GetMode() const
191{
192 return Mode;
193}
194
195inline bool FMaterialKeyGeneratorContext::IsEmitting() const
196{
197 return Mode == EMode::Emitting;
198}
199
200inline bool FMaterialKeyGeneratorContext::IsRecording() const
201{
202 return (Mode == EMode::Saving) | (Mode == EMode::Loading);
203}
204
205inline bool FMaterialKeyGeneratorContext::IsSaving() const
206{
207 return Mode == EMode::Saving;
208}
209
210inline bool FMaterialKeyGeneratorContext::IsLoading() const
211{
212 return Mode == EMode::Loading;
213}
214
215inline EShaderPlatform FMaterialKeyGeneratorContext::GetShaderPlatform() const
216{
217 return ShaderPlatform;
218}
219
220inline FName FMaterialKeyGeneratorContext::GetShaderFormat() const
221{
222 return ShaderFormat;
223}
224
225template <typename T>
226inline void FMaterialKeyGeneratorContext::RecordAndEmit(FUtf8StringView Name, T&& Data)
227{
228 Record(Name, Data);
229 Emit(Data);
230}
231
232template <typename T>
233inline void FMaterialKeyGeneratorContext::Record(FUtf8StringView Name, T&& Data)
234{
235 switch (Mode)
236 {
237 case EMode::Emitting:
238 break;
239 case EMode::Saving:
240 *Writer << Name << Data;
241 break;
242 case EMode::Loading:
243 if (!LoadFromCompactBinary(GetCurrentObject()[Name], Data))
244 {
245 bHasLoadError = true;
246 }
247 break;
248 default:
249 checkNoEntry();
250 break;
251 }
252}
253
254inline void FMaterialKeyGeneratorContext::PostLoad(TFunctionRef<void()> Action)
255{
256 if (Mode == EMode::Loading)
257 {
258 Action();
259 }
260}
261
262template <typename T>
263inline void FMaterialKeyGeneratorContext::Emit(T&& Data)
264{
265 if (Mode == EMode::Emitting)
266 {
267 KeyGen << Data;
268 }
269}
270
271inline void FMaterialKeyGeneratorContext::EmitFunc(TFunctionRef<void(FShaderKeyGenerator&)> Callback)
272{
273 if (Mode == EMode::Emitting)
274 {
275 Callback(KeyGen);
276 }
277}
278
279inline void FMaterialKeyGeneratorContext::EmitDebugText(FStringView Data)
280{
281 if (Mode == EMode::Emitting)
282 {
283 KeyGen.AppendDebugText(Data);
284 }
285}
286
287inline void FMaterialKeyGeneratorContext::EmitSeparator()
288{
289 if (Mode == EMode::Emitting)
290 {
291 KeyGen.AppendSeparator();
292 }
293}
294
295inline void FMaterialKeyGeneratorContext::EmitBoolInt(bool Data)
296{
297 if (Mode == EMode::Emitting)
298 {
299 KeyGen.AppendBoolInt(Data);
300 }
301}
302
303inline FShaderKeyGenerator* FMaterialKeyGeneratorContext::GetKeyGenIfEmitting()
304{
305 if (Mode == EMode::Emitting)
306 {
307 return &KeyGen;
308 }
309 return nullptr;
310}
311
312inline FShaderKeyGenerator& FMaterialKeyGeneratorContext::GetKeyGenIfEmittingChecked()
313{
314 check(Mode == EMode::Emitting);
315 return KeyGen;
316}
317
318inline bool FMaterialKeyGeneratorContext::HasLoadError() const
319{
320 return Mode != EMode::Loading || bHasLoadError;
321}
322
323#endif
#define check(expr)
Definition AssertionMacros.h:314
#define checkNoEntry()
Definition AssertionMacros.h:316
bool LoadFromCompactBinary(FCbFieldView Field, FAssetDependency &Dependency)
Definition AssetRegistry.cpp:10420
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
constexpr bool EnumHasAllFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:28
constexpr void EnumRemoveFlags(Enum &Flags, Enum FlagsToRemove)
Definition EnumClassFlags.h:98
constexpr void EnumAddFlags(Enum &Flags, Enum FlagsToAdd)
Definition EnumClassFlags.h:91
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
EMaterialKeyInclude
Definition MaterialKeyIncludeEnum.h:14
EShaderPlatform
Definition RHIShaderPlatform.h:11
@ SP_NumPlatforms
Definition RHIShaderPlatform.h:55
bool IsLoading()
Definition UObjectGlobals.cpp:2087
uint32 Size
Definition VulkanMemory.cpp:4034
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition CompactBinary.h:1025
Definition CompactBinaryWriter.h:68
Definition NameTypes.h:617
Definition ShaderKeyGenerator.h:29
Definition Array.h:670
Definition AssetRegistryState.h:50
Definition FunctionFwd.h:19
uint32 GetFlags(uint32 Word3)
Definition CollisionFilterData.cpp:21
void SetFlags(uint32 &Word3, uint32 Flags)
Definition CollisionFilterData.cpp:27
GeometryCollection::Facades::FMuscleActivationData Data
Definition MuscleActivationConstraints.h:15
Mode
Definition AnimNode_TransitionPoseEvaluator.h:28
@ Action
Definition TokenizedMessage.h:37