UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MovieSceneChannelProxy.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Algo/BinarySearch.h"
8#include "Containers/Array.h"
11#include "CoreTypes.h"
12#include "Delegates/Delegate.h"
14#include "Misc/InlineValue.h"
18#include "UObject/NameTypes.h"
19
24
29{
34 {
35 return ChannelTypeName;
36 }
37
42 {
43 return Channels;
44 }
45
46#if WITH_EDITOR
47
51 template<typename ChannelType>
53 {
54 check(ChannelType::StaticStruct()->GetFName() == ChannelTypeName);
55 return FMovieSceneChannelEditorDataEntry::GetAllExtendedEditorData<ChannelType>();
56 }
57
58#endif
59
60private:
61
62 // only FMovieSceneChannelProxyData and FMovieSceneChannelProxy can create entries
65
67 template<typename ChannelType>
68 explicit FMovieSceneChannelEntry(FName InChannelTypeName, const ChannelType& Channel)
70 , ChannelTypeName(InChannelTypeName)
71 {}
72
74 FName ChannelTypeName;
75
78};
79
80
81
82
87{
88#if WITH_EDITOR
89
96 template<typename ChannelType>
97 void Add(ChannelType& InChannel, const FMovieSceneChannelMetaData& InMetaData)
98 {
99 static_assert(std::is_same_v<typename TMovieSceneChannelTraits<ChannelType>::ExtendedEditorDataType, void>, "Must supply extended editor data according to the channel's traits.");
100 static_assert(!std::is_same_v<ChannelType, FMovieSceneChannel>, "Cannot add channels by their base FMovieSceneChannel type.");
101
102 // Add the channel
103 const int32 ChannelTypeIndex = AddInternal(InChannel);
104 // Add the editor data at the same index
105 Entries[ChannelTypeIndex].AddMetaData<ChannelType>(InMetaData);
106 }
107
114 template<typename ChannelType>
116 {
117 static_assert(!std::is_same_v<typename TMovieSceneChannelTraits<ChannelType>::ExtendedEditorDataType, void>, "This method is for channels with typed editor data. You *must* call SetExtendedEditorData afterwards.");
118 static_assert(!std::is_same_v<ChannelType, FMovieSceneChannel>, "Cannot add channels by their base FMovieSceneChannel type.");
119
120 // Add the channel
121 const int32 ChannelTypeIndex = AddInternal(InChannel);
122 // Add a default editor data at the same index, hopefully the caller will set it afterwards
124 // Return index usable for SetExtendedEditorData
125 const FName ChannelTypeName = ChannelType::StaticStruct()->GetFName();
126 return FMovieSceneChannelHandle(nullptr, ChannelTypeName, Entries[ChannelTypeIndex].GetChannels().Num() - 1);
127 }
128
136 template<typename ChannelType, typename ExtendedEditorDataType>
138 {
139 static_assert(!std::is_same_v<typename TMovieSceneChannelTraits<ChannelType>::ExtendedEditorDataType, void>, "Must supply typed editor data according to the channel's traits. Define TMovieSceneChannelTraits<ChannelType>::ExtendedEditorDataType to use this function.");
140 static_assert(!std::is_same_v<ChannelType, FMovieSceneChannel>, "Cannot add channels by their base FMovieSceneChannel type.");
141
142 // Add the channel
143 const int32 ChannelTypeIndex = AddInternal(InChannel);
144 // Add the editor data at the same index
146 }
147
148 template<typename ChannelType, typename ExtendedEditorDataType>
150 {
151 // Find the entry
152 // TODO: we rely on ChannelType's extended editor data to be the same as the overriden extended editor data!
153 const FName ChannelTypeName = ChannelHandle.GetChannelTypeName();
154 FMovieSceneChannelEntry* Entry = Entries.FindByPredicate([=](const FMovieSceneChannelEntry& CurEntry)
155 { return CurEntry.ChannelTypeName == ChannelTypeName; });
156 if (ensure(Entry))
157 {
158 Entry->SetExtendedEditorData<ChannelType>(ChannelHandle.GetChannelIndex(), InExtendedEditorData);
159 }
160 }
161
162#else
163
169 template<typename ChannelType>
170 void Add(ChannelType& InChannel)
171 {
172 AddInternal(InChannel);
173 }
174
175#endif
176
177private:
178
184 template<typename ChannelType>
185 int32 AddInternal(ChannelType& InChannel);
186
190};
191
192
197struct FMovieSceneChannelProxy : TSharedFromThis<FMovieSceneChannelProxy>
198{
199public:
200
202
205
207 {
208 OnDestroy.Broadcast();
209 }
210
217
221
224
225public:
226
233 {
234 return Entries;
235 }
236
242 MOVIESCENE_API const FMovieSceneChannelEntry* FindEntry(FName ChannelTypeName) const;
243
251 MOVIESCENE_API int32 FindIndex(FName ChannelTypeName, const FMovieSceneChannel* ChannelPtr) const;
252
258 template<typename ChannelType>
260
266 template<typename ChannelType>
267 ChannelType* GetChannel(int32 ChannelIndex) const;
268
274 MOVIESCENE_API FMovieSceneChannel* GetChannel(FName ChannelTypeName, int32 ChannelIndex) const;
275
281
288
294 template<typename ChannelType>
296 {
297 FName ChannelTypeName = ChannelType::StaticStruct()->GetFName();
298 return MakeHandle(ChannelTypeName, Index).template Cast<ChannelType>();
299 }
300
306 template<typename ChannelType>
311
312#if !WITH_EDITOR
313
318 template<typename ChannelType>
320
321#else
322
327 template<typename ChannelType>
329
334 template<typename ChannelType, typename ExtendedEditorDataType>
336
337
343 template<typename ChannelType>
345
351 template<typename ChannelType>
353
360
366 template<typename ChannelType>
368
369#endif // !WITH_EDITOR
370
371private:
372
375
378
379#if WITH_EDITOR
380
383
387 mutable bool bHandlesByNamePopulated = false;
388
389#endif // WITH_EDITOR
390};
391
392
398template<typename ChannelType>
399int32 FMovieSceneChannelProxyData::AddInternal(ChannelType& InChannel)
400{
401 FMovieSceneChannelHandle::TrackChannelTypeName<ChannelType>();
402
403 // Find the entry for this channel's type
404 FName ChannelTypeName = ChannelType::StaticStruct()->GetFName();
405
406 // Find the first entry that has a >= channel ID
408
409 // If the index we found isn't valid, or it's not the channel we want, we need to add a new entry there
410 if (ChannelTypeIndex >= Entries.Num() || Entries[ChannelTypeIndex].GetChannelTypeName() != ChannelTypeName)
411 {
412 Entries.Insert(FMovieSceneChannelEntry(ChannelTypeName, InChannel), ChannelTypeIndex);
413 }
414
415 check(Entries.IsValidIndex(ChannelTypeIndex));
416
417 // Add the channel to the channels array
418 Entries[ChannelTypeIndex].Channels.Add(&InChannel);
419 return ChannelTypeIndex;
420}
421
422
428template<typename ChannelType>
430{
431 FName ChannelTypeName = ChannelType::StaticStruct()->GetFName();
432 const FMovieSceneChannelEntry* FoundEntry = FindEntry(ChannelTypeName);
433
434 if (FoundEntry)
435 {
436 return TArrayView<ChannelType*>((ChannelType**)(FoundEntry->Channels.GetData()), FoundEntry->Channels.Num());
437 }
439}
440
441
447template<typename ChannelType>
448ChannelType* FMovieSceneChannelProxy::GetChannel(int32 ChannelIndex) const
449{
451 return Channels.IsValidIndex(ChannelIndex) ? Channels[ChannelIndex] : nullptr;
452}
453
454#if !WITH_EDITOR
455
456
461template<typename ChannelType>
463{
464 static_assert(!std::is_same_v<ChannelType, FMovieSceneChannel>, "Cannot add channels by their base FMovieSceneChannel type..");
465
466 const FName ChannelTypeName = ChannelType::StaticStruct()->GetFName();
467 Entries.Add(FMovieSceneChannelEntry(ChannelTypeName, InChannel));
468 Entries[0].Channels.Add(&InChannel);
469}
470
471
472#else // !WITH_EDITOR
473
474
479template<typename ChannelType>
481{
482 static_assert(!std::is_same_v<ChannelType, FMovieSceneChannel>, "Cannot add channels by their base FMovieSceneChannel type..");
483 static_assert(std::is_same_v<typename TMovieSceneChannelTraits<ChannelType>::ExtendedEditorDataType, void>, "Must supply typed editor data according to the channel's traits.");
484
485 const FName ChannelTypeName = ChannelType::StaticStruct()->GetFName();
486 Entries.Add(FMovieSceneChannelEntry(ChannelTypeName, InChannel));
487 Entries[0].Channels.Add(&InChannel);
488 Entries[0].AddMetaData<ChannelType>(InMetaData);
489}
490
491
496template<typename ChannelType, typename ExtendedEditorDataType>
498{
499 static_assert(!std::is_same_v<ChannelType, FMovieSceneChannel>, "Cannot add channels by their base FMovieSceneChannel type..");
500 static_assert(!std::is_same_v<typename TMovieSceneChannelTraits<ChannelType>::ExtendedEditorDataType, void>, "Must supply typed editor data according to the channel's traits. Define TMovieSceneChannelTraits<ChannelType>::ExtendedEditorDataType to use this function.");
501
502 const FName ChannelTypeName = ChannelType::StaticStruct()->GetFName();
503 Entries.Add(FMovieSceneChannelEntry(ChannelTypeName, InChannel));
504 Entries[0].Channels.Add(&InChannel);
505 Entries[0].AddMetaData<ChannelType>(InMetaData, Forward<ExtendedEditorDataType>(InExtendedEditorDataType));
506}
507
508
514template<typename ChannelType>
515TArrayView<const typename TMovieSceneChannelTraits<ChannelType>::ExtendedEditorDataType> FMovieSceneChannelProxy::GetAllExtendedEditorData() const
516{
517 FName ChannelTypeName = ChannelType::StaticStruct()->GetFName();
518 const FMovieSceneChannelEntry* FoundEntry = FindEntry(ChannelTypeName);
519
520 if (FoundEntry)
521 {
522 return FoundEntry->GetAllExtendedEditorData<ChannelType>();
523 }
525}
526
527
533template<typename ChannelType>
534TArrayView<const FMovieSceneChannelMetaData> FMovieSceneChannelProxy::GetMetaData() const
535{
536 FName ChannelTypeName = ChannelType::StaticStruct()->GetFName();
537 const FMovieSceneChannelEntry* FoundEntry = FindEntry(ChannelTypeName);
538
539 if (FoundEntry)
540 {
541 return FoundEntry->GetMetaData();
542 }
544}
545
546
552template<typename ChannelType>
553TMovieSceneChannelHandle<ChannelType> FMovieSceneChannelProxy::GetChannelByName(FName ChannelName) const
554{
556 const FName ChannelTypeName = ChannelType::StaticStruct()->GetFName();
557 // Invalid handles will have a type name of 'None', so we will always fail this test and retrun a null typed handle
558 if (UntypedHandle.GetChannelTypeName() == ChannelTypeName)
559 {
560 return UntypedHandle.Cast<ChannelType>();
561 }
563}
564
565
566#endif // !WITH_EDITOR
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ Num
Definition MetalRHIPrivate.h:234
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition NameTypes.h:617
Definition ArrayView.h:139
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition SharedPointer.h:1640
TSharedRef< ObjectType, Mode > AsShared()
Definition SharedPointer.h:1650
UE_REWRITE auto LowerBoundBy(const RangeType &Range, const ValueType &Value, ProjectionType Projection, SortPredicateType SortPredicate) -> decltype(GetNum(Range))
Definition BinarySearch.h:113
U16 Index
Definition radfft.cpp:71
Definition MovieSceneChannelEditorDataEntry.h:151
Definition MovieSceneChannelProxy.h:29
FName GetChannelTypeName() const
Definition MovieSceneChannelProxy.h:33
TArrayView< FMovieSceneChannel *const > GetChannels() const
Definition MovieSceneChannelProxy.h:41
Definition MovieSceneChannelHandle.h:20
MOVIESCENE_API int32 GetChannelIndex() const
Definition MovieSceneChannelHandle.cpp:51
MOVIESCENE_API FName GetChannelTypeName() const
Definition MovieSceneChannelHandle.cpp:46
Definition MovieSceneChannelProxy.h:87
void Add(ChannelType &InChannel)
Definition MovieSceneChannelProxy.h:170
Definition MovieSceneChannelProxy.h:198
TMovieSceneChannelHandle< ChannelType > MakeHandle(int32 Index)
Definition MovieSceneChannelProxy.h:295
MOVIESCENE_API int32 FindIndex(FName ChannelTypeName, const FMovieSceneChannel *ChannelPtr) const
Definition MovieSceneChannelProxy.cpp:35
FMovieSceneChannelProxy & operator=(FMovieSceneChannelProxy &&)=delete
FMovieSceneChannelProxy(FMovieSceneChannelProxyData &&InChannels)
Definition MovieSceneChannelProxy.h:214
MOVIESCENE_API int32 NumChannels() const
Definition MovieSceneChannelProxy.cpp:7
FMovieSceneChannelProxy & operator=(const FMovieSceneChannelProxy &)=delete
MOVIESCENE_API const FMovieSceneChannelEntry * FindEntry(FName ChannelTypeName) const
Definition MovieSceneChannelProxy.cpp:23
TMovieSceneChannelHandle< ChannelType > CopyHandle(TMovieSceneChannelHandle< ChannelType > InOtherHandle)
Definition MovieSceneChannelProxy.h:307
~FMovieSceneChannelProxy()
Definition MovieSceneChannelProxy.h:206
ChannelType * GetChannel(int32 ChannelIndex) const
Definition MovieSceneChannelProxy.h:448
TArrayView< ChannelType * > GetChannels() const
Definition MovieSceneChannelProxy.h:429
FMovieSceneChannelProxy(FMovieSceneChannelProxy &&)=delete
TArrayView< const FMovieSceneChannelEntry > GetAllEntries() const
Definition MovieSceneChannelProxy.h:232
FMovieSceneChannelProxy(const FMovieSceneChannelProxy &)=delete
FMovieSceneChannelProxy()
Definition MovieSceneChannelProxy.h:204
MOVIESCENE_API FMovieSceneChannelHandle MakeHandle(FName ChannelTypeName, int32 Index)
Definition MovieSceneChannelProxy.cpp:17
FSimpleMulticastDelegate OnDestroy
Definition MovieSceneChannelProxy.h:201
Definition MovieSceneChannel.h:112
Definition NameTypes.h:1653
Definition MovieSceneChannelHandle.h:167
Definition MovieSceneChannelTraits.h:63