UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MovieSceneMaterialSystem.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
8
11
20
21#include "MovieSceneMaterialSystem.generated.h"
22
23
25
26USTRUCT()
28{
30
31 MOVIESCENETRACKS_API UMaterialInterface* GetMaterial() const;
32
34
35private:
36
38 UPROPERTY()
39 TObjectPtr<UMaterialInterface> PreviousMaterial;
40
42 UPROPERTY()
43 TSoftObjectPtr<UMaterialInterface> SoftPreviousMaterial;
44};
45
46namespace UE::MovieScene
47{
48
49template<typename AccessorType, typename... RequiredComponents>
50struct TPreAnimatedMaterialTraits : FBoundObjectPreAnimatedStateTraits
51{
52 using KeyType = typename AccessorType::KeyType;
54
55 static_assert(THasAddReferencedObjectForComponent<StorageType>::Value, "StorageType is not correctly exposed to the reference graph!");
56
58 {
60
62
63 if (Accessor)
64 {
65 Parameters.SetMaterial(Accessor.GetMaterial());
66 }
67
68 return Parameters;
69 }
70
71 static void RestorePreAnimatedValue(const KeyType& InKey, const FMovieScenePreAnimatedMaterialParameters& PreAnimatedValue, const FRestoreStateParams& Params)
72 {
73 AccessorType Accessor{ InKey };
74 if (Accessor)
75 {
76 if (UMaterialInterface* PreviousMaterial = PreAnimatedValue.GetMaterial())
77 {
78 Accessor.SetMaterial(PreAnimatedValue.GetMaterial());
79 }
80 }
81 }
82};
83
84template<typename AccessorType, typename... RequiredComponents>
85using TPreAnimatedMaterialParameterTraits = TPreAnimatedMaterialTraits<AccessorType, RequiredComponents...>;
86
87template<typename AccessorType, typename... RequiredComponents>
88class TMovieSceneMaterialSystem
89{
90public:
91
92 using MaterialSwitcherStorageType = TPreAnimatedStateStorage<TPreAnimatedMaterialTraits<AccessorType, RequiredComponents...>>;
93 using MaterialParameterStorageType = TPreAnimatedStateStorage<TPreAnimatedMaterialParameterTraits<AccessorType, RequiredComponents...>>;
94
95 TSharedPtr<MaterialSwitcherStorageType> MaterialSwitcherStorage;
96 TSharedPtr<MaterialParameterStorageType> MaterialParameterStorage;
97
100 void OnRun(UMovieSceneEntitySystemLinker* Linker, TComponentTypeID<RequiredComponents>... InRequiredComponents, FSystemTaskPrerequisites& InPrerequisites, FSystemSubsequentTasks& Subsequents);
101
103
105
106protected:
107
109 {
111
114 FEntityGroupBuilder* Builder,
116 FReadEntityIDs EntityIDs,
118 TRead<RequiredComponents>... Components)
119 {
120 const FComponentMask& AllocationType = Item.GetAllocationType();
121
123
124 TComponentTypeID<FName> ParameterName;
125 if (AllocationType.Contains(TracksComponents->ScalarParameterName))
126 {
127 ParameterName = TracksComponents->ScalarParameterName;
128 }
129 else if (AllocationType.Contains(TracksComponents->VectorParameterName))
130 {
131 ParameterName = TracksComponents->VectorParameterName;
132 }
133 else if (AllocationType.Contains(TracksComponents->ColorParameterName))
134 {
135 ParameterName = TracksComponents->ColorParameterName;
136 }
137
139 if (AllocationType.Contains(TracksComponents->ScalarMaterialParameterInfo))
140 {
141 ParameterInfo = TracksComponents->ScalarMaterialParameterInfo;
142 }
143 else if (AllocationType.Contains(TracksComponents->VectorMaterialParameterInfo))
144 {
145 ParameterInfo = TracksComponents->VectorMaterialParameterInfo;
146 }
147 else if (AllocationType.Contains(TracksComponents->ColorMaterialParameterInfo))
148 {
149 ParameterInfo = TracksComponents->ColorMaterialParameterInfo;
150 }
151
152
153 const FEntityAllocation* Allocation = Item.GetAllocation();
154 const int32 Num = Allocation->Num();
155
156 TReadOptional<FName> ParameterNames = ParameterName ? Allocation->TryReadComponents(ParameterName) : TReadOptional<FName>();
158
159 for (int32 Index = 0; Index < Num; ++Index)
160 {
162 ? MakeTuple(Components[Index]..., ParameterInfos[Index])
165 : MakeTuple(Components[Index]..., FMaterialParameterInfo());
166
167 const int32 NewGroupIndex = Handler.GetOrAllocateGroupIndex(Key, Builder);
169
170 Builder->AddEntityToGroup(EntityIDs[Index], NewGroupID);
171 // Write out the group ID component
173 }
174 }
175
176 #if WITH_EDITOR
177 bool OnObjectsReplaced(GroupKeyType& InOutKey, const TMap<UObject*, UObject*>& ReplacementMap)
178 {
179 return false;
180 }
181 #endif
182 };
183
185
186 FEntityComponentFilter MaterialSwitcherFilter;
187 FEntityComponentFilter MaterialParameterFilter;
188
189 FCachedEntityFilterResult_Allocations ReinitializeBoundMaterials;
190};
191
192template<typename AccessorType, typename... RequiredComponents>
193struct TApplyMaterialSwitchers
194{
195 static void ForEachEntity(typename TCallTraits<RequiredComponents>::ParamType... Inputs, const FObjectComponent& ObjectResult)
196 {
197 // ObjectResult must be a material
198 UMaterialInterface* NewMaterial = Cast<UMaterialInterface>(ObjectResult.GetObject());
199
200 AccessorType Accessor(Inputs...);
201 if (!Accessor)
202 {
203 return;
204 }
205
208
209 if (ExistingMID && ExistingMID->Parent && ExistingMID->Parent == NewMaterial)
210 {
211 // Do not re-assign materials when a dynamic instance is already assigned with the same parent (since that's basically the same material, just with animated parameters)
212 // This is required for supporting material switchers alongside parameter tracks
213 return;
214 }
215
216 Accessor.SetMaterial(NewMaterial);
217 }
218};
219
220template<typename AccessorType, typename... RequiredComponents>
221struct TInitializeBoundMaterials
222{
223 static bool InitializeBoundMaterial(typename TCallTraits<RequiredComponents>::ParamType... Inputs, FObjectComponent& OutDynamicMaterial)
224 {
225 AccessorType Accessor(Inputs...);
226 if (!Accessor)
227 {
229 return false;
230 }
231
233
234 if (!ExistingMaterial)
235 {
236 // If the object was not previously explicitly null, make it so
238 {
240 return true;
241 }
242 return false;
243 }
244
246 {
247 if (OutDynamicMaterial != MID)
248 {
250 return true;
251 }
252 return false;
253 }
254
256 if (CurrentMID && CurrentMID->Parent == ExistingMaterial)
257 {
258 Accessor.SetMaterial(CurrentMID);
259 return false;
260 }
261
262 UMaterialInstanceDynamic* NewMaterial = Accessor.CreateDynamicMaterial(ExistingMaterial);
264 Accessor.SetMaterial(NewMaterial);
265 return true;
266 }
267
268 static void ForEachEntity(typename TCallTraits<RequiredComponents>::ParamType... Inputs, FObjectComponent& OutDynamicMaterial)
269 {
270 InitializeBoundMaterial(Inputs..., OutDynamicMaterial);
271 }
272};
273
274
275template<typename AccessorType, typename... RequiredComponents>
276struct TReinitializeBoundMaterials
277{
279 TArray<FMovieSceneEntityID> ReboundMaterials;
280
281 TReinitializeBoundMaterials(UMovieSceneEntitySystemLinker* InLinker)
283 {}
284
285 void ForEachAllocation(int32 Num, const FMovieSceneEntityID* EntityIDs, const RequiredComponents*... Inputs, FObjectComponent* Objects)
286 {
287 for (int32 Index = 0; Index < Num; ++Index)
288 {
289 ForEachEntity(EntityIDs[Index], Inputs[Index]..., Objects[Index]);
290 }
291 }
292
293 void ForEachEntity(FMovieSceneEntityID EntityID, typename TCallTraits<RequiredComponents>::ParamType... Inputs, FObjectComponent& OutDynamicMaterial)
294 {
295 if (TInitializeBoundMaterials<AccessorType, RequiredComponents...>::InitializeBoundMaterial(Inputs..., OutDynamicMaterial))
296 {
297 ReboundMaterials.Add(EntityID);
298 }
299 }
300
301 void PostTask()
302 {
303 FMovieSceneTracksComponentTypes* TracksComponents = FMovieSceneTracksComponentTypes::Get();
304 for (FMovieSceneEntityID EntityID : ReboundMaterials)
305 {
306 Linker->EntityManager.AddComponent(EntityID, TracksComponents->Tags.BoundMaterialChanged);
307 }
308 }
309};
310
311template<typename...>
312struct TAddBoundMaterialMutationImpl;
313
314template<typename AccessorType, typename... RequiredComponents, int... Indices>
315struct TAddBoundMaterialMutationImpl<AccessorType, TIntegerSequence<int, Indices...>, RequiredComponents...> : IMovieSceneEntityMutation
316{
317 TAddBoundMaterialMutationImpl(TComponentTypeID<RequiredComponents>... InRequiredComponents)
318 : ComponentTypes(InRequiredComponents...)
319 {
320 BuiltInComponents = FBuiltInComponentTypes::Get();
321 TracksComponents = FMovieSceneTracksComponentTypes::Get();
322 }
323 virtual void CreateMutation(FEntityManager* EntityManager, FComponentMask* InOutEntityComponentTypes) const override
324 {
325 InOutEntityComponentTypes->Set(TracksComponents->BoundMaterial);
326 }
327 virtual void InitializeAllocation(FEntityAllocation* Allocation, const FComponentMask& AllocationType) const
328 {
329 TComponentWriter<FObjectComponent> BoundMaterials = Allocation->WriteComponents(TracksComponents->BoundMaterial, FEntityAllocationWriteContext::NewAllocation());
330 InitializeAllocation(Allocation, BoundMaterials, Allocation->ReadComponents(ComponentTypes.template Get<Indices>())...);
331 }
332
333 void InitializeAllocation(FEntityAllocation* Allocation, FObjectComponent* OutBoundMaterials, const RequiredComponents*... InRequiredComponents) const
334 {
335 const int32 Num = Allocation->Num();
336 for (int32 Index = 0; Index < Num; ++Index)
337 {
339 }
340 }
341private:
342
343 FBuiltInComponentTypes* BuiltInComponents;
344 FMovieSceneTracksComponentTypes* TracksComponents;
345
347};
348
349
350template<typename AccessorType, typename... RequiredComponents>
351void TMovieSceneMaterialSystem<AccessorType, RequiredComponents...>::OnLink(UMovieSceneEntitySystemLinker* Linker, TComponentTypeID<RequiredComponents>... InRequiredComponents)
352{
353 using namespace UE::MovieScene;
354
357
358 // Define a grouping for these materials. This will make hierarchical bias work.
360 GroupingKey = GroupingSystem->AddGrouping(FMaterialGroupingPolicy(), InRequiredComponents...);
361
362 MaterialSwitcherFilter.Reset();
363 MaterialSwitcherFilter.All({ InRequiredComponents..., BuiltInComponents->ObjectResult });
364
365 // Currently the only supported entities that we initialize are ones that contain Scalar, Vector or Color parameters
366 // Imported entities are implicitly excluded by way of filtering by BoundObject, which do not exist on imported entities
367 MaterialParameterFilter.Reset();
368 MaterialParameterFilter.All({ InRequiredComponents... });
369 MaterialParameterFilter.Any({ TracksComponents->ScalarParameterName, TracksComponents->ColorParameterName, TracksComponents->VectorParameterName, // Old style parameter types for deprecated UMovieSceneParameterSections
370 TracksComponents->ScalarMaterialParameterInfo, TracksComponents->ColorMaterialParameterInfo, TracksComponents->VectorMaterialParameterInfo }); // New style parameter types
371
372 Linker->Events.PostSpawnEvent.AddRaw(this, &TMovieSceneMaterialSystem<AccessorType, RequiredComponents...>::OnPostSpawn, InRequiredComponents...);
373
374 ReinitializeBoundMaterials.Filter.All({ TracksComponents->BoundMaterial, InRequiredComponents... });
375 ReinitializeBoundMaterials.Filter.None({ BuiltInComponents->Tags.NeedsUnlink });
376}
377
378template<typename AccessorType, typename... RequiredComponents>
379void TMovieSceneMaterialSystem<AccessorType, RequiredComponents...>::OnUnlink(UMovieSceneEntitySystemLinker* Linker)
380{
382 if (ensure(GroupingSystem))
383 {
384 GroupingSystem->RemoveGrouping(GroupingKey);
385 }
386 GroupingKey = FEntityGroupingPolicyKey();
387
388 Linker->Events.PostSpawnEvent.RemoveAll(this);
389}
390
391template<typename AccessorType, typename... RequiredComponents>
392void TMovieSceneMaterialSystem<AccessorType, RequiredComponents...>::OnPostSpawn(UMovieSceneEntitySystemLinker* InLinker, TComponentTypeID<RequiredComponents>... InRequiredComponents)
393{
394 using namespace UE::MovieScene;
395
397
399
400 FEntityAllocationWriteContext WriteContext(InLinker->EntityManager);
402
403 // Reinitialize bound dynamic materials, adding NeedsLink during PostTask to any that changed
404 // This will cause the instantiation phase to be re-run for these entities (and any other new or expired ones)
405 for (FEntityAllocation* Allocation : ReinitializeBoundMaterials.GetMatchingAllocations(InLinker->EntityManager))
406 {
408
409 const int32 Num = Allocation->Num();
410 ReinitializeBoundMaterialsTask.ForEachAllocation(Num, Allocation->GetRawEntityIDs(), Allocation->ReadComponents(InRequiredComponents)..., Allocation->WriteComponents(TracksComponents->BoundMaterial, WriteContext));
411 }
412
414}
415
416template<typename AccessorType, typename... RequiredComponents>
417void TMovieSceneMaterialSystem<AccessorType, RequiredComponents...>::OnRun(UMovieSceneEntitySystemLinker* Linker, TComponentTypeID<RequiredComponents>... InRequiredComponents, FSystemTaskPrerequisites& InPrerequisites, FSystemSubsequentTasks& Subsequents)
418{
419 using namespace UE::MovieScene;
420
423
425
426 ESystemPhase CurrentPhase = Runner->GetCurrentPhase();
427 if (CurrentPhase == ESystemPhase::Instantiation)
428 {
429 // --------------------------------------------------------------------------------------
430 // Apply material switchers
431 TApplyMaterialSwitchers<AccessorType, RequiredComponents...> ApplyMaterialSwitchers;
432
434 .ReadAllOf(InRequiredComponents...)
435 .Read(BuiltInComponents->ObjectResult)
436 .FilterAll({ BuiltInComponents->Tags.NeedsLink })
437 .FilterNone({ BuiltInComponents->Tags.Ignored })
438 .RunInline_PerEntity(&Linker->EntityManager, ApplyMaterialSwitchers);
439
440 // --------------------------------------------------------------------------------------
441 // Add bound materials for any NeedsLink entities that have material parameters
442 FEntityComponentFilter Filter(MaterialParameterFilter);
443 Filter.All({ BuiltInComponents->Tags.NeedsLink });
444 Filter.None({ BuiltInComponents->Tags.ImportedEntity });
445
446 using MutationType = TAddBoundMaterialMutationImpl<AccessorType, TMakeIntegerSequence<int, sizeof...(RequiredComponents)>, RequiredComponents...>;
447 Linker->EntityManager.MutateAll(Filter, MutationType(InRequiredComponents...));
448
449 // --------------------------------------------------------------------------------------
450 // (Re)initialize bound materials for any NeedsLink materials
452
454 .ReadEntityIDs()
455 .ReadAllOf(InRequiredComponents...)
456 .Write(TracksComponents->BoundMaterial)
457 .FilterAll({ BuiltInComponents->Tags.NeedsLink })
458 .FilterNone({ BuiltInComponents->Tags.Ignored, BuiltInComponents->Tags.NeedsUnlink })
459 .RunInline_PerEntity(&Linker->EntityManager, ReinitializeBoundMaterialsTask);
460 }
461}
462
463template<typename AccessorType, typename... RequiredComponents>
465{
466 using namespace UE::MovieScene;
467
468 // If we have material results to apply save those as well
469 if (Linker->EntityManager.Contains(MaterialSwitcherFilter))
470 {
472 Params.AdditionalFilter = MaterialSwitcherFilter;
473
474 MaterialSwitcherStorage->BeginTrackingAndCachePreAnimatedValuesTask(Linker, Params, InRequiredComponents...);
475 }
476
477 // If we have bound materials to resolve save the current material
478 if (Linker->EntityManager.Contains(MaterialParameterFilter))
479 {
481 Params.AdditionalFilter = MaterialParameterFilter;
482
483 MaterialParameterStorage->BeginTrackingAndCachePreAnimatedValuesTask(Linker, Params, InRequiredComponents...);
484 }
485}
486
487} // namespace UE::MovieScene
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define DECLARE_CYCLE_STAT_EXTERN(CounterName, StatId, GroupId, API)
Definition Stats.h:679
#define SCOPE_CYCLE_COUNTER(Stat)
Definition Stats.h:650
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
typename UE4IntegerSequence_Private::TMakeIntegerSequenceImpl< T, N >::Type TMakeIntegerSequence
Definition IntegerSequence.h:31
@ Num
Definition MetalRHIPrivate.h:234
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define USTRUCT(...)
Definition ObjectMacros.h:746
constexpr TTuple< std::decay_t< Types >... > MakeTuple(Types &&... Args)
Definition Tuple.h:794
Definition Array.h:670
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
Definition UnrealString.h.inl:34
Definition SharedPointer.h:692
Definition SharedPointer.h:153
Definition MaterialInstanceDynamic.h:15
Definition MaterialInterface.h:296
virtual class UMaterial * GetMaterial() PURE_VIRTUAL(UMaterialInterface
Definition MaterialInterface.h:482
Definition MovieSceneEntityGroupingSystem.h:319
UE_API void RemoveGrouping(FEntityGroupingPolicyKey InPolicyKey)
Definition MovieSceneEntityGroupingSystem.cpp:366
FEntityGroupingPolicyKey AddGrouping(GroupingPolicy &&InPolicy, TComponentTypeID< ComponentTypes >... InComponents)
Definition MovieSceneEntityGroupingSystem.h:360
Definition MovieSceneEntitySystemLinker.h:113
@ EntityManager
Definition MovieSceneEvaluationCustomVersion.h:21
Definition Linker.cpp:38
FUniformParams Params
Definition MeshPaintVirtualTexture.cpp:162
int
Definition TestServer.py:515
Definition ConstraintsManager.h:14
ESystemPhase
Definition MovieSceneEntitySystemTypes.h:45
U16 Index
Definition radfft.cpp:71
Definition MaterialParameters.h:33
Definition MovieSceneMaterialSystem.h:28
MOVIESCENETRACKS_API void SetMaterial(UMaterialInterface *InMaterial)
Definition MovieSceneMaterialSystem.cpp:38
Definition MovieScenePreAnimatedStateSystem.h:40
TCallTraitsParamTypeHelper< T, PassByValue >::ParamType ParamType
Definition UnrealTypeTraits.h:275
Definition IntegerSequence.h:9
Definition ObjectPtr.h:488
Definition SoftObjectPtr.h:174
Definition Tuple.h:652
Definition BuiltInComponentTypes.h:578
struct UE::MovieScene::FBuiltInComponentTypes::@1489 Tags
FComponentTypeID NeedsLink
Definition BuiltInComponentTypes.h:789
FComponentTypeID ImportedEntity
Definition BuiltInComponentTypes.h:797
FComponentTypeID Ignored
Definition BuiltInComponentTypes.h:810
static MOVIESCENE_API FBuiltInComponentTypes * Get()
Definition BuiltInComponentTypes.cpp:667
FComponentTypeID NeedsUnlink
Definition BuiltInComponentTypes.h:790
TComponentTypeID< FObjectComponent > ObjectResult
Definition BuiltInComponentTypes.h:713
Definition MovieSceneEntityIDs.h:40
bool Contains(FComponentTypeID InComponentType) const
Definition MovieSceneEntityIDs.h:429
Definition MovieSceneEntitySystemTypes.h:957
Definition MovieSceneEntitySystemTypes.h:977
MOVIESCENE_API const FComponentMask & GetAllocationType() const
Definition MovieSceneEntitySystemTypes.cpp:154
MOVIESCENE_API const FEntityAllocation * GetAllocation() const
Definition MovieSceneEntitySystemTypes.cpp:144
Definition MovieSceneEntitySystemTypes.h:425
static FEntityAllocationWriteContext NewAllocation()
Definition MovieSceneEntitySystemTypes.h:428
Definition MovieSceneEntitySystemTypes.h:624
TComponentLock< TReadOptional< T > > TryReadComponents(TComponentTypeID< T > ComponentType) const
Definition MovieSceneEntitySystemTypes.h:887
int32 Num() const
Definition MovieSceneEntitySystemTypes.h:813
Definition MovieSceneEntitySystemTypes.h:295
Definition MovieSceneEntityGroupingSystem.h:41
UE_API void AddEntityToGroup(const FMovieSceneEntityID &InEntity, const FEntityGroupID &InNewGroupID)
Definition MovieSceneEntityGroupingSystem.cpp:25
FEntityGroupID MakeGroupID(int32 GroupIndex) const
Definition MovieSceneEntityGroupingSystem.h:45
Definition BuiltInComponentTypes.h:534
Definition BuiltInComponentTypes.h:495
Definition MovieSceneEntitySystemTask.h:1045
Definition MovieSceneTracksComponentTypes.h:522
TComponentTypeID< FName > VectorParameterName
Definition MovieSceneTracksComponentTypes.h:563
TComponentTypeID< FName > ColorParameterName
Definition MovieSceneTracksComponentTypes.h:564
TComponentTypeID< FMaterialParameterInfo > ColorMaterialParameterInfo
Definition MovieSceneTracksComponentTypes.h:582
TComponentTypeID< FMaterialParameterInfo > ScalarMaterialParameterInfo
Definition MovieSceneTracksComponentTypes.h:581
TComponentTypeID< FName > ScalarParameterName
Definition MovieSceneTracksComponentTypes.h:561
TComponentTypeID< FObjectComponent > BoundMaterial
Definition MovieSceneTracksComponentTypes.h:585
TComponentTypeID< FMaterialParameterInfo > VectorMaterialParameterInfo
Definition MovieSceneTracksComponentTypes.h:583
static MOVIESCENETRACKS_API FMovieSceneTracksComponentTypes * Get()
Definition MovieSceneTracksComponentTypes.cpp:893
static FObjectComponent Weak(UObject *InObject)
Definition BuiltInComponentTypes.h:274
static FObjectComponent Null()
Definition BuiltInComponentTypes.h:262
Definition MovieSceneSystemTaskDependencies.h:98
Definition MovieSceneSystemTaskDependencies.h:29
Definition MovieSceneEntityIDs.h:283
Definition MovieSceneEntityGroupingSystem.h:98
int32 GetOrAllocateGroupIndex(typename TCallTraits< GroupKeyType >::ParamType InGroupKey, FEntityGroupBuilder *Builder)
Definition MovieSceneEntityGroupingSystem.h:101
TFilteredEntityTask< T... > FilterAll(const FComponentMask &InComponentMask)
Definition MovieSceneEntitySystemTask.h:188
static constexpr bool Value
Definition MovieSceneComponentTypeInfo.h:68
void InitializeGroupKeys(TEntityGroupingHandlerBase< FMaterialGroupingPolicy > &Handler, FEntityGroupBuilder *Builder, FEntityAllocationIteratorItem Item, FReadEntityIDs EntityIDs, TWrite< FEntityGroupID > GroupIDs, TRead< RequiredComponents >... Components)
Definition MovieSceneMaterialSystem.h:112
TTuple< RequiredComponents..., FMaterialParameterInfo > GroupKeyType
Definition MovieSceneMaterialSystem.h:110
Definition MovieScenePreAnimatedStateStorage.h:59
Definition MovieSceneComponentPtr.h:208
Definition MovieSceneComponentPtr.h:195
Definition MovieSceneComponentPtr.h:288