// Copyright Epic Games, Inc. All Rights Reserved. #include "Sections/MovieSceneParameterSection.h" #include "UObject/SequencerObjectVersion.h" #include "Channels/MovieSceneChannelProxy.h" #include "Evaluation/MovieSceneEvaluationField.h" #include "EntitySystem/BuiltInComponentTypes.h" #include "MovieSceneTracksComponentTypes.h" #include UE_INLINE_GENERATED_CPP_BY_NAME(MovieSceneParameterSection) namespace UE::MovieScene { /* Entity IDs are an encoded type and index, with the upper 8 bits being the type, and the lower 24 bits as the index */ uint32 EncodeEntityID(int32 InIndex, uint8 InType) { check(InIndex >= 0 && InIndex < int32(0x00FFFFFF)); return static_cast(InIndex) | (uint32(InType) << 24); } void DecodeEntityID(uint32 InEntityID, int32& OutIndex, uint8& OutType) { // Mask out the type to get the index OutIndex = static_cast(InEntityID & 0x00FFFFFF); OutType = InEntityID >> 24; } }// namespace UE::MovieScene void IMovieSceneParameterSectionExtender::ExtendEntity(UMovieSceneParameterSection* Section, UMovieSceneEntitySystemLinker* EntityLinker, const UE::MovieScene::FEntityImportParams& Params, UE::MovieScene::FImportedEntity* OutImportedEntity) { ExtendEntityImpl(Section, EntityLinker, Params, OutImportedEntity); } UMovieSceneParameterSection::UMovieSceneParameterSection( const FObjectInitializer& ObjectInitializer ) : Super( ObjectInitializer ) { bSupportsInfiniteRange = true; EvalOptions.EnableAndSetCompletionMode (GetLinkerCustomVersion(FSequencerObjectVersion::GUID) < FSequencerObjectVersion::WhenFinishedDefaultsToRestoreState ? EMovieSceneCompletionMode::KeepState : GetLinkerCustomVersion(FSequencerObjectVersion::GUID) < FSequencerObjectVersion::WhenFinishedDefaultsToProjectDefault ? EMovieSceneCompletionMode::RestoreState : EMovieSceneCompletionMode::ProjectDefault); } void UMovieSceneParameterSection::Serialize(FArchive& Ar) { Super::Serialize(Ar); if (Ar.IsLoading()) { ReconstructChannelProxy(); } } void UMovieSceneParameterSection::PostEditImport() { Super::PostEditImport(); ReconstructChannelProxy(); } void UMovieSceneParameterSection::ReconstructChannelProxy() { FMovieSceneChannelProxyData Channels; #if WITH_EDITOR int32 SortOrder = 0; for (FScalarParameterNameAndCurve& Scalar : GetScalarParameterNamesAndCurves()) { FMovieSceneChannelMetaData MetaData(Scalar.ParameterName, FText::FromName(Scalar.ParameterName)); // Prevent single channels from collapsing to the track node MetaData.bCanCollapseToTrack = false; MetaData.SortOrder = SortOrder++; Channels.Add(Scalar.ParameterCurve, MetaData, TMovieSceneExternalValue()); } for (FBoolParameterNameAndCurve& Bool : GetBoolParameterNamesAndCurves()) { FMovieSceneChannelMetaData MetaData(Bool.ParameterName, FText::FromName(Bool.ParameterName)); // Prevent single channels from collapsing to the track node MetaData.bCanCollapseToTrack = false; MetaData.SortOrder = SortOrder++; Channels.Add(Bool.ParameterCurve, MetaData, TMovieSceneExternalValue()); } for (FVector2DParameterNameAndCurves& Vector2D : GetVector2DParameterNamesAndCurves()) { FString ParameterString = Vector2D.ParameterName.ToString(); FText Group = FText::FromString(ParameterString); FMovieSceneChannelMetaData MetaData_X = FMovieSceneChannelMetaData(*(ParameterString + TEXT(".X")), FCommonChannelData::ChannelX, Group); MetaData_X.SortOrder = SortOrder++; FMovieSceneChannelMetaData MetaData_Y = FMovieSceneChannelMetaData(*(ParameterString + TEXT(".Y")), FCommonChannelData::ChannelY, Group); MetaData_Y.SortOrder = SortOrder++; Channels.Add(Vector2D.XCurve, MetaData_X, TMovieSceneExternalValue()); Channels.Add(Vector2D.YCurve, MetaData_Y, TMovieSceneExternalValue()); } for (FVectorParameterNameAndCurves& Vector : GetVectorParameterNamesAndCurves()) { FString ParameterString = Vector.ParameterName.ToString(); FText Group = FText::FromString(ParameterString); FMovieSceneChannelMetaData MetaData_X = FMovieSceneChannelMetaData(*(ParameterString + TEXT(".X")), FCommonChannelData::ChannelX, Group); MetaData_X.SortOrder = SortOrder++; FMovieSceneChannelMetaData MetaData_Y = FMovieSceneChannelMetaData(*(ParameterString + TEXT(".Y")), FCommonChannelData::ChannelY, Group); MetaData_Y.SortOrder = SortOrder++; FMovieSceneChannelMetaData MetaData_Z = FMovieSceneChannelMetaData(*(ParameterString + TEXT(".Z")), FCommonChannelData::ChannelZ, Group); MetaData_Z.SortOrder = SortOrder++; Channels.Add(Vector.XCurve, MetaData_X, TMovieSceneExternalValue()); Channels.Add(Vector.YCurve, MetaData_Y, TMovieSceneExternalValue()); Channels.Add(Vector.ZCurve, MetaData_Z, TMovieSceneExternalValue()); } for (FColorParameterNameAndCurves& Color : GetColorParameterNamesAndCurves()) { FString ParameterString = Color.ParameterName.ToString(); FText Group = FText::FromString(ParameterString); FMovieSceneChannelMetaData MetaData_R(*(ParameterString + TEXT("R")), FCommonChannelData::ChannelR, Group); MetaData_R.SortOrder = SortOrder++; MetaData_R.Color = FCommonChannelData::RedChannelColor; FMovieSceneChannelMetaData MetaData_G(*(ParameterString + TEXT("G")), FCommonChannelData::ChannelG, Group); MetaData_G.SortOrder = SortOrder++; MetaData_G.Color = FCommonChannelData::GreenChannelColor; FMovieSceneChannelMetaData MetaData_B(*(ParameterString + TEXT("B")), FCommonChannelData::ChannelB, Group); MetaData_B.SortOrder = SortOrder++; MetaData_B.Color = FCommonChannelData::BlueChannelColor; FMovieSceneChannelMetaData MetaData_A(*(ParameterString + TEXT("A")), FCommonChannelData::ChannelA, Group); MetaData_A.SortOrder = SortOrder++; Channels.Add(Color.RedCurve, MetaData_R, TMovieSceneExternalValue()); Channels.Add(Color.GreenCurve, MetaData_G, TMovieSceneExternalValue()); Channels.Add(Color.BlueCurve, MetaData_B, TMovieSceneExternalValue()); Channels.Add(Color.AlphaCurve, MetaData_A, TMovieSceneExternalValue()); } for (FTransformParameterNameAndCurves& Transform : GetTransformParameterNamesAndCurves()) { FString ParameterString = Transform.ParameterName.ToString(); FText Group = FText::FromString(ParameterString); FMovieSceneChannelMetaData MetaData_Tx = FMovieSceneChannelMetaData(*(ParameterString + TEXT(".Translation.X")), FCommonChannelData::ChannelX, Group); MetaData_Tx.SortOrder = SortOrder++; FMovieSceneChannelMetaData MetaData_Ty = FMovieSceneChannelMetaData(*(ParameterString + TEXT(".Translation.Y")), FCommonChannelData::ChannelY, Group); MetaData_Ty.SortOrder = SortOrder++; FMovieSceneChannelMetaData MetaData_Tz = FMovieSceneChannelMetaData(*(ParameterString + TEXT(".Translation.Z")), FCommonChannelData::ChannelZ, Group); MetaData_Tz.SortOrder = SortOrder++; Channels.Add(Transform.Translation[0], MetaData_Tx, TMovieSceneExternalValue()); Channels.Add(Transform.Translation[1], MetaData_Ty, TMovieSceneExternalValue()); Channels.Add(Transform.Translation[2], MetaData_Tz, TMovieSceneExternalValue()); FMovieSceneChannelMetaData MetaData_Rx = FMovieSceneChannelMetaData(*(ParameterString + TEXT(".Rotation.X")), FCommonChannelData::ChannelX, Group); MetaData_Rx.SortOrder = SortOrder++; FMovieSceneChannelMetaData MetaData_Ry = FMovieSceneChannelMetaData(*(ParameterString + TEXT(".Rotation.Y")), FCommonChannelData::ChannelY, Group); MetaData_Ry.SortOrder = SortOrder++; FMovieSceneChannelMetaData MetaData_Rz = FMovieSceneChannelMetaData(*(ParameterString + TEXT(".Rotation.Z")), FCommonChannelData::ChannelZ, Group); MetaData_Rz.SortOrder = SortOrder++; Channels.Add(Transform.Rotation[0], MetaData_Rx, TMovieSceneExternalValue()); Channels.Add(Transform.Rotation[1], MetaData_Ry, TMovieSceneExternalValue()); Channels.Add(Transform.Rotation[2], MetaData_Rz, TMovieSceneExternalValue()); FMovieSceneChannelMetaData MetaData_Sx = FMovieSceneChannelMetaData(*(ParameterString + TEXT(".Scale.X")), FCommonChannelData::ChannelX, Group); MetaData_Sx.SortOrder = SortOrder++; FMovieSceneChannelMetaData MetaData_Sy = FMovieSceneChannelMetaData(*(ParameterString + TEXT(".Scale.Y")), FCommonChannelData::ChannelY, Group); MetaData_Sy.SortOrder = SortOrder++; FMovieSceneChannelMetaData MetaData_Sz = FMovieSceneChannelMetaData(*(ParameterString + TEXT(".Scale.Z")), FCommonChannelData::ChannelZ, Group); MetaData_Sz.SortOrder = SortOrder++; Channels.Add(Transform.Scale[0], MetaData_Sx, TMovieSceneExternalValue()); Channels.Add(Transform.Scale[1], MetaData_Sy, TMovieSceneExternalValue()); Channels.Add(Transform.Scale[2], MetaData_Sz, TMovieSceneExternalValue()); } #else for (FScalarParameterNameAndCurve& Scalar : GetScalarParameterNamesAndCurves()) { Channels.Add(Scalar.ParameterCurve); } for (FBoolParameterNameAndCurve& Bool : GetBoolParameterNamesAndCurves()) { Channels.Add(Bool.ParameterCurve); } for (FVector2DParameterNameAndCurves& Vector2D : GetVector2DParameterNamesAndCurves()) { Channels.Add(Vector2D.XCurve); Channels.Add(Vector2D.YCurve); } for (FColorParameterNameAndCurves& Color : GetColorParameterNamesAndCurves()) { Channels.Add(Color.RedCurve); Channels.Add(Color.GreenCurve); Channels.Add(Color.BlueCurve); Channels.Add(Color.AlphaCurve); } for (FTransformParameterNameAndCurves& Transform : GetTransformParameterNamesAndCurves()) { Channels.Add(Transform.Translation[0]); Channels.Add(Transform.Translation[1]); Channels.Add(Transform.Translation[2]); Channels.Add(Transform.Rotation[0]); Channels.Add(Transform.Rotation[1]); Channels.Add(Transform.Rotation[2]); Channels.Add(Transform.Scale[0]); Channels.Add(Transform.Scale[1]); Channels.Add(Transform.Scale[2]); } #endif ChannelProxy = MakeShared(MoveTemp(Channels)); } void UMovieSceneParameterSection::AddScalarParameterKey( FName InParameterName, FFrameNumber InTime, float InValue ) { FMovieSceneFloatChannel* ExistingChannel = nullptr; for ( FScalarParameterNameAndCurve& ScalarParameterNameAndCurve : ScalarParameterNamesAndCurves ) { if ( ScalarParameterNameAndCurve.ParameterName == InParameterName ) { ExistingChannel = &ScalarParameterNameAndCurve.ParameterCurve; break; } } if ( ExistingChannel == nullptr ) { const int32 NewIndex = ScalarParameterNamesAndCurves.Add( FScalarParameterNameAndCurve( InParameterName ) ); ExistingChannel = &ScalarParameterNamesAndCurves[NewIndex].ParameterCurve; ReconstructChannelProxy(); } ExistingChannel->GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(InValue)); if (TryModify()) { SetRange(TRange::Hull(TRange(InTime), GetRange())); } } void UMovieSceneParameterSection::AddBoolParameterKey(FName InParameterName, FFrameNumber InTime, bool InValue) { FMovieSceneBoolChannel* ExistingChannel = nullptr; for (FBoolParameterNameAndCurve& BoolParameterNameAndCurve : BoolParameterNamesAndCurves) { if (BoolParameterNameAndCurve.ParameterName == InParameterName) { ExistingChannel = &BoolParameterNameAndCurve.ParameterCurve; break; } } if (ExistingChannel == nullptr) { const int32 NewIndex = BoolParameterNamesAndCurves.Add(FBoolParameterNameAndCurve(InParameterName)); ExistingChannel = &BoolParameterNamesAndCurves[NewIndex].ParameterCurve; ReconstructChannelProxy(); } ExistingChannel->GetData().UpdateOrAddKey(InTime, InValue); if (TryModify()) { SetRange(TRange::Hull(TRange(InTime), GetRange())); } } void UMovieSceneParameterSection::AddVector2DParameterKey(FName InParameterName, FFrameNumber InTime, FVector2D InValue) { FVector2DParameterNameAndCurves* ExistingCurves = nullptr; for (FVector2DParameterNameAndCurves& VectorParameterNameAndCurve : Vector2DParameterNamesAndCurves) { if (VectorParameterNameAndCurve.ParameterName == InParameterName) { ExistingCurves = &VectorParameterNameAndCurve; break; } } if (ExistingCurves == nullptr) { int32 NewIndex = Vector2DParameterNamesAndCurves.Add(FVector2DParameterNameAndCurves(InParameterName)); ExistingCurves = &Vector2DParameterNamesAndCurves[NewIndex]; ReconstructChannelProxy(); } ExistingCurves->XCurve.GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(InValue.X)); ExistingCurves->YCurve.GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(InValue.Y)); if (TryModify()) { SetRange(TRange::Hull(TRange(InTime), GetRange())); } } void UMovieSceneParameterSection::AddVectorParameterKey( FName InParameterName, FFrameNumber InTime, FVector InValue ) { FVectorParameterNameAndCurves* ExistingCurves = nullptr; for ( FVectorParameterNameAndCurves& VectorParameterNameAndCurve : VectorParameterNamesAndCurves ) { if ( VectorParameterNameAndCurve.ParameterName == InParameterName ) { ExistingCurves = &VectorParameterNameAndCurve; break; } } if ( ExistingCurves == nullptr ) { int32 NewIndex = VectorParameterNamesAndCurves.Add( FVectorParameterNameAndCurves( InParameterName ) ); ExistingCurves = &VectorParameterNamesAndCurves[NewIndex]; ReconstructChannelProxy(); } ExistingCurves->XCurve.GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(InValue.X)); ExistingCurves->YCurve.GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(InValue.Y)); ExistingCurves->ZCurve.GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(InValue.Z)); if (TryModify()) { SetRange(TRange::Hull(TRange(InTime), GetRange())); } } void UMovieSceneParameterSection::AddColorParameterKey( FName InParameterName, FFrameNumber InTime, FLinearColor InValue ) { FColorParameterNameAndCurves* ExistingCurves = nullptr; for ( FColorParameterNameAndCurves& ColorParameterNameAndCurve : ColorParameterNamesAndCurves ) { if ( ColorParameterNameAndCurve.ParameterName == InParameterName ) { ExistingCurves = &ColorParameterNameAndCurve; break; } } if ( ExistingCurves == nullptr ) { int32 NewIndex = ColorParameterNamesAndCurves.Add( FColorParameterNameAndCurves( InParameterName ) ); ExistingCurves = &ColorParameterNamesAndCurves[NewIndex]; ReconstructChannelProxy(); } ExistingCurves->RedCurve.GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(InValue.R)); ExistingCurves->GreenCurve.GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(InValue.G)); ExistingCurves->BlueCurve.GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(InValue.B)); ExistingCurves->AlphaCurve.GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(InValue.A)); if (TryModify()) { SetRange(TRange::Hull(TRange(InTime), GetRange())); } } void UMovieSceneParameterSection::AddTransformParameterKey(FName InParameterName, FFrameNumber InTime, const FTransform& InValue) { FTransformParameterNameAndCurves* ExistingCurves = nullptr; for (FTransformParameterNameAndCurves& TransformParameterNamesAndCurve : TransformParameterNamesAndCurves) { if (TransformParameterNamesAndCurve.ParameterName == InParameterName) { ExistingCurves = &TransformParameterNamesAndCurve; break; } } if (ExistingCurves == nullptr) { int32 NewIndex = TransformParameterNamesAndCurves.Add(FTransformParameterNameAndCurves(InParameterName)); ExistingCurves = &TransformParameterNamesAndCurves[NewIndex]; ReconstructChannelProxy(); } FVector Translation = InValue.GetTranslation(); FRotator Rotator = InValue.GetRotation().Rotator(); FVector Scale = InValue.GetScale3D(); ExistingCurves->Translation[0].GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(Translation[0])); ExistingCurves->Translation[1].GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(Translation[1])); ExistingCurves->Translation[2].GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(Translation[2])); ExistingCurves->Rotation[0].GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(Rotator.Roll)); ExistingCurves->Rotation[1].GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(Rotator.Pitch)); ExistingCurves->Rotation[2].GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(Rotator.Yaw)); ExistingCurves->Scale[0].GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(Scale[0])); ExistingCurves->Scale[1].GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(Scale[1])); ExistingCurves->Scale[2].GetData().UpdateOrAddKey(InTime, FMovieSceneFloatValue(Scale[2])); if (TryModify()) { SetRange(TRange::Hull(TRange(InTime), GetRange())); } } bool UMovieSceneParameterSection::RemoveScalarParameter( FName InParameterName ) { for ( int32 i = 0; i < ScalarParameterNamesAndCurves.Num(); i++ ) { if ( ScalarParameterNamesAndCurves[i].ParameterName == InParameterName ) { ScalarParameterNamesAndCurves.RemoveAt(i); ReconstructChannelProxy(); return true; } } return false; } bool UMovieSceneParameterSection::RemoveBoolParameter(FName InParameterName) { for (int32 i = 0; i < BoolParameterNamesAndCurves.Num(); i++) { if (BoolParameterNamesAndCurves[i].ParameterName == InParameterName) { BoolParameterNamesAndCurves.RemoveAt(i); ReconstructChannelProxy(); return true; } } return false; } bool UMovieSceneParameterSection::RemoveVector2DParameter(FName InParameterName) { for (int32 i = 0; i < Vector2DParameterNamesAndCurves.Num(); i++) { if (Vector2DParameterNamesAndCurves[i].ParameterName == InParameterName) { Vector2DParameterNamesAndCurves.RemoveAt(i); ReconstructChannelProxy(); return true; } } return false; } bool UMovieSceneParameterSection::RemoveVectorParameter( FName InParameterName ) { for ( int32 i = 0; i < VectorParameterNamesAndCurves.Num(); i++ ) { if ( VectorParameterNamesAndCurves[i].ParameterName == InParameterName ) { VectorParameterNamesAndCurves.RemoveAt( i ); ReconstructChannelProxy(); return true; } } return false; } bool UMovieSceneParameterSection::RemoveColorParameter( FName InParameterName ) { for ( int32 i = 0; i < ColorParameterNamesAndCurves.Num(); i++ ) { if ( ColorParameterNamesAndCurves[i].ParameterName == InParameterName ) { ColorParameterNamesAndCurves.RemoveAt( i ); ReconstructChannelProxy(); return true; } } return false; } bool UMovieSceneParameterSection::RemoveTransformParameter(FName InParameterName) { for (int32 i = 0; i < TransformParameterNamesAndCurves.Num(); i++) { if (TransformParameterNamesAndCurves[i].ParameterName == InParameterName) { TransformParameterNamesAndCurves.RemoveAt(i); ReconstructChannelProxy(); return true; } } return false; } TArray& UMovieSceneParameterSection::GetScalarParameterNamesAndCurves() { return ScalarParameterNamesAndCurves; } const TArray& UMovieSceneParameterSection::GetScalarParameterNamesAndCurves() const { return ScalarParameterNamesAndCurves; } TArray& UMovieSceneParameterSection::GetBoolParameterNamesAndCurves() { return BoolParameterNamesAndCurves; } const TArray& UMovieSceneParameterSection::GetBoolParameterNamesAndCurves() const { return BoolParameterNamesAndCurves; } TArray& UMovieSceneParameterSection::GetVector2DParameterNamesAndCurves() { return Vector2DParameterNamesAndCurves; } const TArray& UMovieSceneParameterSection::GetVector2DParameterNamesAndCurves() const { return Vector2DParameterNamesAndCurves; } TArray& UMovieSceneParameterSection::GetVectorParameterNamesAndCurves() { return VectorParameterNamesAndCurves; } const TArray& UMovieSceneParameterSection::GetVectorParameterNamesAndCurves() const { return VectorParameterNamesAndCurves; } TArray& UMovieSceneParameterSection::GetColorParameterNamesAndCurves() { return ColorParameterNamesAndCurves; } const TArray& UMovieSceneParameterSection::GetColorParameterNamesAndCurves() const { return ColorParameterNamesAndCurves; } TArray& UMovieSceneParameterSection::GetTransformParameterNamesAndCurves() { return TransformParameterNamesAndCurves; } const TArray& UMovieSceneParameterSection::GetTransformParameterNamesAndCurves() const { return TransformParameterNamesAndCurves; } void UMovieSceneParameterSection::GetParameterNames( TSet& ParameterNames ) const { for ( const FScalarParameterNameAndCurve& ScalarParameterNameAndCurve : ScalarParameterNamesAndCurves ) { ParameterNames.Add( ScalarParameterNameAndCurve.ParameterName ); } for ( const FVectorParameterNameAndCurves& VectorParameterNameAndCurves : VectorParameterNamesAndCurves ) { ParameterNames.Add( VectorParameterNameAndCurves.ParameterName ); } for ( const FColorParameterNameAndCurves& ColorParameterNameAndCurves : ColorParameterNamesAndCurves ) { ParameterNames.Add( ColorParameterNameAndCurves.ParameterName ); } for (const FTransformParameterNameAndCurves& TransformParameterNamesAndCurve : TransformParameterNamesAndCurves) { ParameterNames.Add(TransformParameterNamesAndCurve.ParameterName); } } void UMovieSceneParameterSection::ImportEntityImpl(UMovieSceneEntitySystemLinker* EntityLinker, const FEntityImportParams& Params, FImportedEntity* OutImportedEntity) { using namespace UE::MovieScene; IMovieSceneParameterSectionExtender* Extender = GetImplementingOuter(); if (!ensureMsgf(Extender, TEXT("It is not valid for a UMovieSceneParameterSection to be used for importing entities outside of an outer chain that implements IMovieSceneParameterSectionExtender"))) { return; } uint8 ParameterType = 0; int32 EntityIndex = 0; DecodeEntityID(Params.EntityID, EntityIndex, ParameterType); FBuiltInComponentTypes* BuiltInComponentTypes = FBuiltInComponentTypes::Get(); FMovieSceneTracksComponentTypes* TracksComponentTypes = FMovieSceneTracksComponentTypes::Get(); FGuid ObjectBindingID = Params.GetObjectBindingID(); TEntityBuilder> BaseBuilder = FEntityBuilder() .AddConditional(BuiltInComponentTypes->GenericObjectBinding, ObjectBindingID, ObjectBindingID.IsValid()); switch (ParameterType) { case 0: { const FScalarParameterNameAndCurve& Scalar = ScalarParameterNamesAndCurves[EntityIndex]; if (Scalar.ParameterCurve.HasAnyData()) { OutImportedEntity->AddBuilder( BaseBuilder .Add(TracksComponentTypes->ScalarParameterName, Scalar.ParameterName) .Add(BuiltInComponentTypes->FloatChannel[0], &Scalar.ParameterCurve) ); } break; } case 1: { const FBoolParameterNameAndCurve& Bool = BoolParameterNamesAndCurves[EntityIndex]; if (Bool.ParameterCurve.HasAnyData()) { OutImportedEntity->AddBuilder( BaseBuilder .Add(TracksComponentTypes->BoolParameterName, Bool.ParameterName) .Add(BuiltInComponentTypes->BoolChannel, &Bool.ParameterCurve) ); } break; } case 2: { const FVector2DParameterNameAndCurves& Vector2D = Vector2DParameterNamesAndCurves[EntityIndex]; if (Vector2D.XCurve.HasAnyData() || Vector2D.YCurve.HasAnyData()) { OutImportedEntity->AddBuilder( BaseBuilder .Add(TracksComponentTypes->Vector2DParameterName, Vector2D.ParameterName) .AddConditional(BuiltInComponentTypes->FloatChannel[0], &Vector2D.XCurve, Vector2D.XCurve.HasAnyData()) .AddConditional(BuiltInComponentTypes->FloatChannel[1], &Vector2D.YCurve, Vector2D.YCurve.HasAnyData()) ); } break; } case 3: { const FVectorParameterNameAndCurves& Vector = VectorParameterNamesAndCurves[EntityIndex]; if (Vector.XCurve.HasAnyData() || Vector.YCurve.HasAnyData() || Vector.ZCurve.HasAnyData()) { OutImportedEntity->AddBuilder( BaseBuilder .Add(TracksComponentTypes->VectorParameterName, Vector.ParameterName) .AddConditional(BuiltInComponentTypes->FloatChannel[0], &Vector.XCurve, Vector.XCurve.HasAnyData()) .AddConditional(BuiltInComponentTypes->FloatChannel[1], &Vector.YCurve, Vector.YCurve.HasAnyData()) .AddConditional(BuiltInComponentTypes->FloatChannel[2], &Vector.ZCurve, Vector.ZCurve.HasAnyData()) ); } break; } case 4: { const FColorParameterNameAndCurves& Color = ColorParameterNamesAndCurves[EntityIndex]; if (Color.RedCurve.HasAnyData() || Color.GreenCurve.HasAnyData() || Color.BlueCurve.HasAnyData() || Color.AlphaCurve.HasAnyData()) { OutImportedEntity->AddBuilder( BaseBuilder .Add(TracksComponentTypes->ColorParameterName, Color.ParameterName) .AddConditional(BuiltInComponentTypes->FloatChannel[0], &Color.RedCurve, Color.RedCurve.HasAnyData()) .AddConditional(BuiltInComponentTypes->FloatChannel[1], &Color.GreenCurve, Color.GreenCurve.HasAnyData()) .AddConditional(BuiltInComponentTypes->FloatChannel[2], &Color.BlueCurve, Color.BlueCurve.HasAnyData()) .AddConditional(BuiltInComponentTypes->FloatChannel[3], &Color.AlphaCurve, Color.AlphaCurve.HasAnyData()) ); } break; } case 5: { const FTransformParameterNameAndCurves& Transform = TransformParameterNamesAndCurves[EntityIndex]; if (Transform.Translation[0].HasAnyData() || Transform.Translation[1].HasAnyData() || Transform.Translation[2].HasAnyData() || Transform.Rotation[0].HasAnyData() || Transform.Rotation[1].HasAnyData() || Transform.Rotation[2].HasAnyData() || Transform.Scale[0].HasAnyData() || Transform.Scale[1].HasAnyData() || Transform.Scale[2].HasAnyData()) { OutImportedEntity->AddBuilder( BaseBuilder .Add(TracksComponentTypes->TransformParameterName, Transform.ParameterName) .AddConditional(BuiltInComponentTypes->FloatChannel[0], &Transform.Translation[0], Transform.Translation[0].HasAnyData()) .AddConditional(BuiltInComponentTypes->FloatChannel[1], &Transform.Translation[1], Transform.Translation[1].HasAnyData()) .AddConditional(BuiltInComponentTypes->FloatChannel[2], &Transform.Translation[2], Transform.Translation[2].HasAnyData()) .AddConditional(BuiltInComponentTypes->FloatChannel[3], &Transform.Rotation[0], Transform.Rotation[0].HasAnyData()) .AddConditional(BuiltInComponentTypes->FloatChannel[4], &Transform.Rotation[1], Transform.Rotation[1].HasAnyData()) .AddConditional(BuiltInComponentTypes->FloatChannel[5], &Transform.Rotation[2], Transform.Rotation[2].HasAnyData()) .AddConditional(BuiltInComponentTypes->FloatChannel[6], &Transform.Scale[0], Transform.Scale[0].HasAnyData()) .AddConditional(BuiltInComponentTypes->FloatChannel[7], &Transform.Scale[1], Transform.Scale[1].HasAnyData()) .AddConditional(BuiltInComponentTypes->FloatChannel[8], &Transform.Scale[2], Transform.Scale[2].HasAnyData()) ); } break; } } Extender->ExtendEntity(this, EntityLinker, Params, OutImportedEntity); } bool UMovieSceneParameterSection::PopulateEvaluationFieldImpl(const TRange& EffectiveRange, const FMovieSceneEvaluationFieldEntityMetaData& InMetaData, FMovieSceneEntityComponentFieldBuilder* OutFieldBuilder) { // By default, parameter sections do not populate any evaluation field entries // that is the job of its outer UMovieSceneTrack through a call to ExternalPopulateEvaluationField return true; } void UMovieSceneParameterSection::ExternalPopulateEvaluationField(const TRange& EffectiveRange, const FMovieSceneEvaluationFieldEntityMetaData& InMetaData, FMovieSceneEntityComponentFieldBuilder* OutFieldBuilder) { using namespace UE::MovieScene; const int32 MetaDataIndex = OutFieldBuilder->AddMetaData(InMetaData); // We use the top 8 bits of EntityID to encode the type of parameter const int32 NumScalarID = ScalarParameterNamesAndCurves.Num(); const int32 NumBoolID = BoolParameterNamesAndCurves.Num(); const int32 NumVector2DID = Vector2DParameterNamesAndCurves.Num(); const int32 NumVectorID = VectorParameterNamesAndCurves.Num(); const int32 NumColorID = ColorParameterNamesAndCurves.Num(); const int32 NumTransformID = TransformParameterNamesAndCurves.Num(); for (int32 Index = 0; Index < NumScalarID; ++Index) { if (ScalarParameterNamesAndCurves[Index].ParameterCurve.HasAnyData()) { const int32 EntityIndex = OutFieldBuilder->FindOrAddEntity(this, EncodeEntityID(Index, 0)); OutFieldBuilder->AddPersistentEntity(EffectiveRange, EntityIndex, MetaDataIndex); } } for (int32 Index = 0; Index < NumBoolID; ++Index) { if (BoolParameterNamesAndCurves[Index].ParameterCurve.HasAnyData()) { const int32 EntityIndex = OutFieldBuilder->FindOrAddEntity(this, EncodeEntityID(Index, 1)); OutFieldBuilder->AddPersistentEntity(EffectiveRange, EntityIndex, MetaDataIndex); } } for (int32 Index = 0; Index < NumVector2DID; ++Index) { const FVector2DParameterNameAndCurves& Vector2D = Vector2DParameterNamesAndCurves[Index]; if (Vector2D.XCurve.HasAnyData() || Vector2D.YCurve.HasAnyData()) { const int32 EntityIndex = OutFieldBuilder->FindOrAddEntity(this, EncodeEntityID(Index, 2)); OutFieldBuilder->AddPersistentEntity(EffectiveRange, EntityIndex, MetaDataIndex); } } for (int32 Index = 0; Index < NumVectorID; ++Index) { const FVectorParameterNameAndCurves& Vector = VectorParameterNamesAndCurves[Index]; if (Vector.XCurve.HasAnyData() || Vector.YCurve.HasAnyData() || Vector.ZCurve.HasAnyData()) { const int32 EntityIndex = OutFieldBuilder->FindOrAddEntity(this, EncodeEntityID(Index, 3)); OutFieldBuilder->AddPersistentEntity(EffectiveRange, EntityIndex, MetaDataIndex); } } for (int32 Index = 0; Index < NumColorID; ++Index) { const FColorParameterNameAndCurves& Color = ColorParameterNamesAndCurves[Index]; if (Color.RedCurve.HasAnyData() || Color.GreenCurve.HasAnyData() || Color.BlueCurve.HasAnyData() || Color.AlphaCurve.HasAnyData()) { const int32 EntityIndex = OutFieldBuilder->FindOrAddEntity(this, EncodeEntityID(Index, 4)); OutFieldBuilder->AddPersistentEntity(EffectiveRange, EntityIndex, MetaDataIndex); } } for (int32 Index = 0; Index < NumTransformID; ++Index) { const FTransformParameterNameAndCurves& Transform = TransformParameterNamesAndCurves[Index]; if (Transform.Translation[0].HasAnyData() || Transform.Translation[1].HasAnyData() || Transform.Translation[2].HasAnyData() || Transform.Rotation[0].HasAnyData() || Transform.Rotation[1].HasAnyData() || Transform.Rotation[2].HasAnyData() || Transform.Scale[0].HasAnyData() || Transform.Scale[1].HasAnyData() || Transform.Scale[2].HasAnyData()) { const int32 EntityIndex = OutFieldBuilder->FindOrAddEntity(this, EncodeEntityID(Index, 5)); OutFieldBuilder->AddPersistentEntity(EffectiveRange, EntityIndex, MetaDataIndex); } } }