void UMovieScene2DTransformSection::AddKeyToNamedCurve(float Time, const F2DTransformKey& TransformKey)
{
	static FName TranslationName("Translation");
	static FName ScaleName("Scale");
	static FName ShearName("Shear");
	static FName AngleName("Angle");

	FName CurveName = TransformKey.CurveName;

	if(CurveName == TranslationName)
	{
		AddKeyToCurve(Translation[0], Time, TransformKey.Value.Translation.X);
		AddKeyToCurve(Translation[1], Time, TransformKey.Value.Translation.Y);
	}
	else if(CurveName == ScaleName)
	{
		AddKeyToCurve(Scale[0], Time, TransformKey.Value.Scale.X);
		AddKeyToCurve(Scale[1], Time, TransformKey.Value.Scale.Y);
	}
	else if(CurveName == ShearName)
	{
		AddKeyToCurve(Shear[0], Time, TransformKey.Value.Shear.X);
		AddKeyToCurve(Shear[1], Time, TransformKey.Value.Shear.Y);
	}
	else if(CurveName == AngleName)
	{
		AddKeyToCurve(Rotation, Time, TransformKey.Value.Angle);
	}
}
void UMovieScene3DTransformSection::AddScaleKeys( const FTransformKey& TransformKey )
{
	const float Time = TransformKey.GetKeyTime();

	if( TransformKey.KeyParams.bAddKeyEvenIfUnchanged || TransformKey.ShouldKeyScale( EAxis::X ) || Scale[0].GetNumKeys() == 0 )
	{
		AddKeyToCurve( Scale[0], Time, TransformKey.GetScaleValue().X, TransformKey.KeyParams );
	}

	if( TransformKey.KeyParams.bAddKeyEvenIfUnchanged || TransformKey.ShouldKeyScale( EAxis::Y ) || Scale[1].GetNumKeys() == 0 )
	{ 
		AddKeyToCurve( Scale[1], Time, TransformKey.GetScaleValue().Y, TransformKey.KeyParams );
	}

	if( TransformKey.KeyParams.bAddKeyEvenIfUnchanged || TransformKey.ShouldKeyScale( EAxis::Z ) || Scale[2].GetNumKeys() == 0 )
	{ 
		AddKeyToCurve( Scale[2], Time, TransformKey.GetScaleValue().Z, TransformKey.KeyParams );
	}
}
void UMovieScene3DTransformSection::AddRotationKeys( const FTransformKey& TransformKey, const bool bUnwindRotation )
{
	const float Time = TransformKey.GetKeyTime();

	if( TransformKey.KeyParams.bAddKeyEvenIfUnchanged || TransformKey.ShouldKeyRotation( EAxis::X ) || Rotation[0].GetNumKeys() == 0 )
	{
		AddKeyToCurve( Rotation[0], Time, TransformKey.GetRotationValue().Roll, TransformKey.KeyParams, bUnwindRotation );
	}

	if( TransformKey.KeyParams.bAddKeyEvenIfUnchanged || TransformKey.ShouldKeyRotation( EAxis::Y ) || Rotation[1].GetNumKeys() == 0 )
	{ 
		AddKeyToCurve( Rotation[1], Time, TransformKey.GetRotationValue().Pitch, TransformKey.KeyParams, bUnwindRotation );
	}

	if( TransformKey.KeyParams.bAddKeyEvenIfUnchanged || TransformKey.ShouldKeyRotation( EAxis::Z ) || Rotation[2].GetNumKeys() == 0 )
	{ 
		AddKeyToCurve( Rotation[2], Time, TransformKey.GetRotationValue().Yaw, TransformKey.KeyParams, bUnwindRotation );
	}
}
void UMovieScene2DTransformSection::AddKey( float Time, const struct F2DTransformKey& TransformKey )
{
	Modify();

	if(TransformKey.CurveName == NAME_None)
	{
		AddKeyToCurve(Translation[0], Time, TransformKey.Value.Translation.X);
		AddKeyToCurve(Translation[1], Time, TransformKey.Value.Translation.Y);
		AddKeyToCurve(Scale[0], Time, TransformKey.Value.Scale.X);
		AddKeyToCurve(Scale[1], Time, TransformKey.Value.Scale.Y);
		AddKeyToCurve(Shear[0], Time, TransformKey.Value.Shear.X);
		AddKeyToCurve(Shear[1], Time, TransformKey.Value.Shear.Y);
		AddKeyToCurve(Rotation, Time, TransformKey.Value.Angle);
	}
	else
	{
		AddKeyToNamedCurve(Time, TransformKey);
	}
}
void UMovieScene2DTransformSection::AddKey( float Time, const struct F2DTransformKey& TransformKey, FKeyParams KeyParams )
{
	Modify();

	static FName TranslationName("Translation");
	static FName ScaleName("Scale");
	static FName ShearName("Shear");
	static FName AngleName("Angle");

	FName CurveName = TransformKey.CurveName;

	bool bTxKeyExists = Translation[0].IsKeyHandleValid(Translation[0].FindKey(Time));
	bool bTyKeyExists = Translation[1].IsKeyHandleValid(Translation[1].FindKey(Time));

	bool bRKeyExists = Rotation.IsKeyHandleValid(Rotation.FindKey(Time));

	bool bHxKeyExists = Shear[0].IsKeyHandleValid(Shear[0].FindKey(Time));
	bool bHyKeyExists = Shear[1].IsKeyHandleValid(Shear[1].FindKey(Time));

	bool bSxKeyExists = Scale[0].IsKeyHandleValid(Scale[0].FindKey(Time));
	bool bSyKeyExists = Scale[1].IsKeyHandleValid(Scale[1].FindKey(Time));

	if ( (CurveName == NAME_None || CurveName == TranslationName) &&
			(KeyParams.bAddKeyEvenIfUnchanged || !(!bTxKeyExists && !KeyParams.bAutoKeying && Translation[0].GetNumKeys() > 0) ) )
	{
		AddKeyToCurve(Translation[0], Time, TransformKey.Value.Translation.X, KeyParams);
	}

	if ( (CurveName == NAME_None || CurveName == TranslationName) &&
			(KeyParams.bAddKeyEvenIfUnchanged || !(!bTyKeyExists && !KeyParams.bAutoKeying && Translation[1].GetNumKeys() > 0) ) )
	{
		AddKeyToCurve(Translation[1], Time, TransformKey.Value.Translation.Y, KeyParams);
	}

	if ( (CurveName == NAME_None || CurveName == ScaleName) &&
			(KeyParams.bAddKeyEvenIfUnchanged || !(!bSxKeyExists && !KeyParams.bAutoKeying && Scale[0].GetNumKeys() > 0) ) )
	{
		AddKeyToCurve(Scale[0], Time, TransformKey.Value.Scale.X, KeyParams);
	}

	if ( (CurveName == NAME_None || CurveName == ScaleName) &&
			(KeyParams.bAddKeyEvenIfUnchanged || !(!bSyKeyExists && !KeyParams.bAutoKeying && Scale[1].GetNumKeys() > 0) ) )
	{
		AddKeyToCurve(Scale[1], Time, TransformKey.Value.Scale.Y, KeyParams);
	}
		
	if ( (CurveName == NAME_None || CurveName == ShearName) &&
			(KeyParams.bAddKeyEvenIfUnchanged || !(!bHxKeyExists && !KeyParams.bAutoKeying && Shear[0].GetNumKeys() > 0) ) )
	{
		AddKeyToCurve(Shear[0], Time, TransformKey.Value.Shear.X, KeyParams);
	}

	if ( (CurveName == NAME_None || CurveName == ShearName) &&
			(KeyParams.bAddKeyEvenIfUnchanged || !(!bHyKeyExists && !KeyParams.bAutoKeying && Shear[1].GetNumKeys() > 0) ) )
	{
		AddKeyToCurve(Shear[1], Time, TransformKey.Value.Shear.Y, KeyParams);
	}

	if ( (CurveName == NAME_None || CurveName == AngleName) &&
			(KeyParams.bAddKeyEvenIfUnchanged || !(!bRKeyExists && !KeyParams.bAutoKeying && Rotation.GetNumKeys() > 0) ) )
	{
		AddKeyToCurve(Rotation, Time, TransformKey.Value.Angle, KeyParams);
	}
}
void UMovieSceneComposurePostMoveSettingsSection::AddKey(float Time, const struct FComposurePostMoveSettingsKey& Key, EMovieSceneKeyInterpolation KeyInterpolation)
{
	FRichCurve& Curve = GetCurve(Key.Channel, Key.Axis);
	AddKeyToCurve(Curve, Time, Key.Value, KeyInterpolation);
}