// Copyright Epic Games, Inc. All Rights Reserved. #include "Channels/MovieSceneChannelHandle.h" #include "Channels/MovieSceneChannelProxy.h" namespace UE::MovieScene { #if DO_CHECK TMap> GChannelTypeNamesToClassTypes; #endif // DO_CHECK } // namespace UE::MovieScene FMovieSceneChannelHandle::FMovieSceneChannelHandle() : ChannelTypeName(NAME_None) , ChannelIndex(INDEX_NONE) {} FMovieSceneChannelHandle::FMovieSceneChannelHandle(TWeakPtr InWeakChannelProxy, FName InChannelTypeName, int32 InChannelIndex) : WeakChannelProxy(InWeakChannelProxy) , ChannelTypeName(InChannelTypeName) , ChannelIndex(InChannelIndex) {} FMovieSceneChannel* FMovieSceneChannelHandle::Get() const { TSharedPtr PinnedProxy = WeakChannelProxy.Pin(); if (PinnedProxy.IsValid()) { const FMovieSceneChannelEntry* Entry = PinnedProxy->FindEntry(ChannelTypeName); if (Entry) { TArrayView Channels = Entry->GetChannels(); if (ensureMsgf(Channels.IsValidIndex(ChannelIndex), TEXT("Channel handle created with an invalid index."))) { return Channels[ChannelIndex]; } } } return nullptr; } FName FMovieSceneChannelHandle::GetChannelTypeName() const { return ChannelTypeName; } int32 FMovieSceneChannelHandle::GetChannelIndex() const { return ChannelIndex; } #if WITH_EDITOR const FMovieSceneChannelMetaData* FMovieSceneChannelHandle::GetMetaData() const { TSharedPtr PinnedProxy = WeakChannelProxy.Pin(); if (PinnedProxy.IsValid()) { const FMovieSceneChannelEntry* Entry = PinnedProxy->FindEntry(ChannelTypeName); if (Entry) { TArrayView MetaData = Entry->GetMetaData(); if (ensureMsgf(MetaData.IsValidIndex(ChannelIndex), TEXT("Channel handle created with an invalid index."))) { return &MetaData[ChannelIndex]; } } } return nullptr; } const void* FMovieSceneChannelHandle::GetExtendedEditorData() const { TSharedPtr PinnedProxy = WeakChannelProxy.Pin(); if (PinnedProxy.IsValid()) { const FMovieSceneChannelEntry* Entry = PinnedProxy->FindEntry(ChannelTypeName); if (Entry) { return Entry->GetExtendedEditorData(ChannelIndex); } } return nullptr; } #endif // WITH_EDITOR #if DO_CHECK void FMovieSceneChannelHandle::TrackChannelTypeNameInternal(UStruct* ChannelType) { FName ChannelName = ChannelType->GetFName(); if (!UE::MovieScene::GChannelTypeNamesToClassTypes.Contains(ChannelName)) { UE::MovieScene::GChannelTypeNamesToClassTypes.Add(ChannelName, ChannelType); } } UStruct* FMovieSceneChannelHandle::GetChannelTypeByName(FName ChannelName) { return UE::MovieScene::GChannelTypeNamesToClassTypes.FindRef(ChannelName).Get(); } bool FMovieSceneChannelHandle::IsCastValidInternal(UStruct* OtherType) const { if (OtherType->GetFName() != ChannelTypeName) { UStruct* ThisType = GetChannelTypeByName(ChannelTypeName); if (!ThisType || !(ThisType->IsChildOf(OtherType) || OtherType->IsChildOf(ThisType))) { return false; } } return true; } #endif // DO_CHECK