class InterpTrackMove extends InterpTrack native(Interpolation); /** * Copyright 1998-2013 Epic Games, Inc. All Rights Reserved. * * Track containing data for moving an actor around over time. * There is no UpdateTrack function. In the game, its the PHYS_Interpolating physics mode which * updates the position based on the interp track. */ cpptext { // UObject interface virtual void PostLoad(); virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent); virtual void PostEditImport(); // InterpTrack interface virtual INT GetNumKeyframes() const; virtual void GetTimeRange(FLOAT& StartTime, FLOAT& EndTime) const; virtual FLOAT GetTrackEndTime() const; virtual FLOAT GetKeyframeTime(INT KeyIndex) const; virtual INT AddKeyframe(FLOAT Time, UInterpTrackInst* TrInst, EInterpCurveMode InitInterpMode); /** * Adds a keyframe to a child track * * @param ChildTrack The child track where the keyframe should be added * @param Time What time the keyframe is located at * @param TrackInst The track instance of the parent track(this track) * @param InitInterpMode The initial interp mode for the keyframe? */ virtual INT AddChildKeyframe(class UInterpTrack* ChildTrack, FLOAT Time, UInterpTrackInst* TrackInst, EInterpCurveMode InitInterpMode); virtual void UpdateKeyframe(INT KeyIndex, UInterpTrackInst* TrInst); /** * Updates a child track keyframe * * @param ChildTrack The child track with keyframe to update * @param KeyIndex The index of the key to be updated * @param TrackInst The track instance of the parent track(this track) */ virtual void UpdateChildKeyframe( class UInterpTrack* ChildTrack, INT KeyIndex, UInterpTrackInst* TrackInst ); virtual INT SetKeyframeTime(INT KeyIndex, FLOAT NewKeyTime, UBOOL bUpdateOrder=true); virtual void RemoveKeyframe(INT KeyIndex); virtual INT DuplicateKeyframe(INT KeyIndex, FLOAT NewKeyTime); virtual UBOOL GetClosestSnapPosition(FLOAT InPosition, TArray &IgnoreKeys, FLOAT& OutPosition); virtual void ConditionalPreviewUpdateTrack(FLOAT NewPosition, class UInterpTrackInst* TrInst); virtual void PreviewUpdateTrack(FLOAT NewPosition, UInterpTrackInst* TrInst); virtual class UMaterial* GetTrackIcon() const; virtual FColor GetKeyframeColor(INT KeyIndex) const; virtual void DrawTrack( FCanvas* Canvas, UInterpGroup* Group, const FInterpTrackDrawParams& Params ); virtual void Render3DTrack(UInterpTrackInst* TrInst, const FSceneView* View, FPrimitiveDrawInterface* PDI, INT TrackIndex, const FColor& TrackColor, TArray& SelectedKeys); virtual void SetTrackToSensibleDefault(); // FCurveEdInterface interface virtual INT GetNumKeys(); virtual INT GetNumSubCurves() const; /** * Provides the color for the sub-curve button that is present on the curve tab. * * @param SubCurveIndex The index of the sub-curve. Cannot be negative nor greater or equal to the number of sub-curves. * @param bIsSubCurveHidden Is the curve hidden? * @return The color associated to the given sub-curve index. */ virtual FColor GetSubCurveButtonColor(INT SubCurveIndex, UBOOL bIsSubCurveHidden) const; virtual FLOAT GetKeyIn(INT KeyIndex); virtual FLOAT GetKeyOut(INT SubIndex, INT KeyIndex); virtual void GetInRange(FLOAT& MinIn, FLOAT& MaxIn); virtual void GetOutRange(FLOAT& MinOut, FLOAT& MaxOut); /** * Provides the color for the given key at the given sub-curve. * * @param SubIndex The index of the sub-curve * @param KeyIndex The index of the key in the sub-curve * @param[in] CurveColor The color of the curve * @return The color that is associated the given key at the given sub-curve */ virtual FColor GetKeyColor(INT SubIndex, INT KeyIndex, const FColor& CurveColor); virtual BYTE GetKeyInterpMode(INT KeyIndex); virtual void GetTangents(INT SubIndex, INT KeyIndex, FLOAT& ArriveTangent, FLOAT& LeaveTangent); virtual FLOAT EvalSub(INT SubIndex, FLOAT InVal); virtual INT CreateNewKey(FLOAT KeyIn); virtual void DeleteKey(INT KeyIndex); virtual INT SetKeyIn(INT KeyIndex, FLOAT NewInVal); virtual void SetKeyOut(INT SubIndex, INT KeyIndex, FLOAT NewOutVal); virtual void SetKeyInterpMode(INT KeyIndex, EInterpCurveMode NewMode); virtual void SetTangents(INT SubIndex, INT KeyIndex, FLOAT ArriveTangent, FLOAT LeaveTangent); /** Returns TRUE if this curve uses legacy tangent/interp algorithms and may be 'upgraded' */ virtual UBOOL UsingLegacyInterpMethod() const; /** 'Upgrades' this curve to use the latest tangent/interp algorithms (usually, will 'bake' key tangents.) */ virtual void UpgradeInterpMethod(); // InterpTrackMove interface virtual FName GetLookupKeyGroupName(INT KeyIndex); virtual void SetLookupKeyGroupName(INT KeyIndex, const FName &NewGroupName); virtual void ClearLookupKeyGroupName(INT KeyIndex); /** * Replacement for the PosTrack eval function that uses GetKeyframePosition. This is so we can replace keyframes that get their information from other tracks. * * @param TrInst TrackInst to use for looking up groups. * @param Time Time to evaluate position at. * @return Final position at the specified time. */ FVector EvalPositionAtTime(UInterpTrackInst* TrInst, FLOAT Time); /** * Replacement for the EulerTrack eval function that uses GetKeyframeRotation. This is so we can replace keyframes that get their information from other tracks. * * @param TrInst TrackInst to use for looking up groups. * @param Time Time to evaluate rotation at. * @return Final rotation at the specified time. */ FVector EvalRotationAtTime(UInterpTrackInst* TrInst, FLOAT Time); /** * Gets the position of a keyframe given its key index. Also optionally retrieves the Arrive and Leave tangents for the key. * This function respects the LookupTrack. * * @param TrInst TrackInst to use for lookup track positions. * @param KeyIndex Index of the keyframe to get the position of. * @param OutTime Final time of the keyframe. * @param OutPos Final position of the keyframe. * @param OutArriveTangent Pointer to a vector to store the arrive tangent in, can be NULL. * @param OutLeaveTangent Pointer to a vector to store the leave tangent in, can be NULL. */ void GetKeyframePosition(UInterpTrackInst* TrInst, INT KeyIndex, FLOAT& OutTime, FVector &OutPos, FVector *OutArriveTangent, FVector *OutLeaveTangent); /** * Gets the rotation of a keyframe given its key index. Also optionally retrieves the Arrive and Leave tangents for the key. * This function respects the LookupTrack. * * @param TrInst TrackInst to use for lookup track rotations. * @param KeyIndex Index of the keyframe to get the rotation of. * @param OutTime Final time of the keyframe. * @param OutRot Final rotation of the keyframe. * @param OutArriveTangent Pointer to a vector to store the arrive tangent in, can be NULL. * @param OutLeaveTangent Pointer to a vector to store the leave tangent in, can be NULL. */ void GetKeyframeRotation(UInterpTrackInst* TrInst, INT KeyIndex, FLOAT& OutTime, FVector &OutRot, FVector *OutArriveTangent, FVector *OutLeaveTangent); /** * Computes the world space coordinates for a key; handles keys that use IMF_RelativeToInitial, basing, etc. * * @param MoveTrackInst An instance of this movement track * @param RelativeSpacePos Key position value from curve * @param RelativeSpaceRot Key rotation value from curve * @param OutPos Output world space position * @param OutRot Output world space rotation */ void ComputeWorldSpaceKeyTransform( UInterpTrackInstMove* MoveTrackInst, const FVector& RelativeSpacePos, const FRotator& RelativeSpaceRot, FVector& OutPos, FRotator& OutRot ); virtual void GetKeyTransformAtTime(UInterpTrackInst* TrInst, FLOAT Time, FVector& OutPos, FRotator& OutRot); virtual UBOOL GetLocationAtTime(UInterpTrackInst* TrInst, FLOAT Time, FVector& OutPos, FRotator& OutRot); virtual FMatrix GetMoveRefFrame(UInterpTrackInstMove* MoveTrackInst); /** * Find Best Matching Time From Position * This function simply try to find Time from input Position using simple Lerp * * @param : Pos - input position * @param : StartKeyIndex - optional * * @return : Interp Time */ FLOAT FindBestMatchingTimefromPosition(UInterpTrackInst* TrInst, const FVector& Pos, INT StartKeyIndex=0, EAxis WeightAxis = AXIS_XY); INT CalcSubIndex(UBOOL bPos, INT InIndex) const; /** * Creates and adds subtracks to this track * * @param bCopy If subtracks are being added as a result of a copy */ virtual void CreateSubTracks( UBOOL bCopy ); /** * Splits this movment track in to seperate tracks for translation and rotation */ void SplitTranslationAndRotation(); /** * Reduce Keys within Tolerance * * @param bIntervalStart start of the key to reduce * @param bIntervalEnd end of the key to reduce * @param Tolerance tolerance */ virtual void ReduceKeys( FLOAT IntervalStart, FLOAT IntervalEnd, FLOAT Tolerance ); } /** Actual position keyframe data. */ var InterpCurveVector PosTrack; /** Actual rotation keyframe data, stored as Euler angles in degrees, for easy editing on curve. */ var InterpCurveVector EulerTrack; /** * Array of group names to retrieve position and rotation data from instead of using the datastored in the keyframe. * A value of NAME_None means to use the PosTrack and EulerTrack data for the keyframe. * There needs to be the same amount of elements in this array as there are keyframes. */ struct native InterpLookupPoint { var name GroupName; var float Time; }; struct native InterpLookupTrack { structcpptext { /** Add a new keypoint to the LookupTrack. Returns the index of the new key.*/ INT AddPoint( const FLOAT InTime, FName &InGroupName ) { INT PointIdx=0; for( PointIdx=0; PointIdx= Points.Num() ) { return PointIndex; } FName GroupName = Points(PointIndex).GroupName; Points.Remove(PointIndex); const INT NewPointIndex = AddPoint( NewTime, GroupName ); return NewPointIndex; } } var array Points; }; var InterpLookupTrack LookupTrack; /** When using IMR_LookAtGroup, specifies the Group which this track should always point its actor at. */ var() name LookAtGroupName; /** Controls the tightness of the curve for the translation path. */ var() float LinCurveTension; /** Controls the tightness of the curve for the rotation path. */ var() float AngCurveTension; /** * Use a Quaternion linear interpolation between keys. * This is robust and will find the 'shortest' distance between keys, but does not support ease in/out. */ var() bool bUseQuatInterpolation; /** In the editor, show a small arrow at each keyframe indicating the rotation at that key. */ var() bool bShowArrowAtKeys; /** Disable previewing of this track - will always position Actor at Time=0.0. Useful when keyframing an object relative to this group. */ var() bool bDisableMovement; /** If false, when this track is displayed on the Curve Editor in Matinee, do not show the Translation tracks. */ var() bool bShowTranslationOnCurveEd; /** If false, when this track is displayed on the Curve Editor in Matinee, do not show the Rotation tracks. */ var() bool bShowRotationOnCurveEd; /** If true, 3D representation of this track in the 3D viewport is disabled. */ var() bool bHide3DTrack; /** Use just the raw Location/Rotation of the base actor instead of calculating the initial offset (makes IMF_RelativeToInitial behave more like you would expect). */ var() bool bUseRawActorTMforRelativeToInitial; enum EInterpTrackMoveFrame { /** Track should be fixed relative to the world. */ IMF_World, /** Track should move relative to the initial position of the actor when the interp sequence was started. */ IMF_RelativeToInitial }; /** Indicates what the movement track should be relative to. */ var() editconst EInterpTrackMoveFrame MoveFrame; enum EInterpTrackMoveRotMode { /** Should take orientation from the . */ IMR_Keyframed, /** Point the X-Axis of the controlled Actor at the group specified by LookAtGroupName. */ IMR_LookAtGroup, /** Should look along the direction of the translation path, with Z always up. */ // IMR_LookAlongPath // TODO! /** Do not change rotation. Ignore it. */ IMR_Ignore }; var() EInterpTrackMoveRotMode RotMode; defaultproperties { TrackInstClass=class'Engine.InterpTrackInstMove' bOnePerGroup=true TrackTitle="Movement" LinCurveTension=0.0 AngCurveTension=0.0 MoveFrame=IMF_World RotMode=IMR_Keyframed bShowTranslationOnCurveEd=true bShowRotationOnCurveEd=false SupportedSubTracks.Add( (SupportedClass=class'Engine.InterpTrackMoveAxis', SubTrackName="X", GroupIndex=0) ) SupportedSubTracks.Add( (SupportedClass=class'Engine.InterpTrackMoveAxis', SubTrackName="Y", GroupIndex=0) ) SupportedSubTracks.Add( (SupportedClass=class'Engine.InterpTrackMoveAxis', SubTrackName="Z", GroupIndex=0) ) SupportedSubTracks.Add( (SupportedClass=class'Engine.InterpTrackMoveAxis', SubTrackName="X", GroupIndex=1 ) ) SupportedSubTracks.Add( (SupportedClass=class'Engine.InterpTrackMoveAxis', SubTrackName="Y", GroupIndex=1 ) ) SupportedSubTracks.Add( (SupportedClass=class'Engine.InterpTrackMoveAxis', SubTrackName="Z", GroupIndex=1 ) ) `if(`isdefined(CHAIR_INTERNAL)) // The default behavior for UDK is false, but we always want this true for ChAIR games bUseRawActorTMforRelativeToInitial=true `endif }