UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MovieSceneTimeTransform.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
7#include "Misc/FrameTime.h"
8#include "MovieSceneTimeTransform.generated.h"
9
21USTRUCT()
23{
25
26
30 : TimeScale(1.f)
31 , Offset(0)
32 {}
33
40 explicit FMovieSceneTimeTransform(FFrameTime InOffset, float InTimeScale = 1.f)
41 : TimeScale(InTimeScale)
42 , Offset(InOffset)
43 {
44 checkf(!FMath::IsNearlyZero(TimeScale), TEXT("It is invalid to create a linear transformation with a zero timescale. This case should be handled externally by FMovieSceneTimeWarpVariant and FLAG_Zero."))
45 }
46
48 {
49 return A.TimeScale == B.TimeScale && A.Offset == B.Offset;
50 }
51
53 {
54 return A.TimeScale != B.TimeScale || A.Offset != B.Offset;
55 }
56
60 bool IsIdentity() const
61 {
62 return Offset.FrameNumber.Value == 0 && FMath::IsNearlyZero(Offset.GetSubFrame()) && FMath::IsNearlyEqual(TimeScale, 1.f);
63 }
64
69 {
70 const FFrameTime NewOffset = FMath::IsNearlyZero(TimeScale) ? -Offset : -Offset / TimeScale;
71 return FMovieSceneTimeTransform(NewOffset, FMath::IsNearlyZero(TimeScale) ? std::numeric_limits<float>::infinity() : 1.f / TimeScale);
72 }
73
75 UPROPERTY()
76 float TimeScale;
77
79 UPROPERTY()
81};
82
90{
91 // Avoid floating point conversion when in the same time-space
92 if (RHS.TimeScale == 1.f)
93 {
94 return InTime + RHS.Offset;
95 }
96 else if (!FMath::IsFinite(RHS.TimeScale))
97 {
98 // Special case infinite timescale (inverse of a zero-timescale) and just return the RHS.Offset
99 return RHS.Offset;
100 }
101
102 return InTime * RHS.TimeScale + RHS.Offset;
103}
104
112{
113 InTime = InTime * RHS;
114 return InTime;
115}
116
123template<typename T>
125{
126 TRange<T> Result = LHS;
127
128 if (!Result.GetLowerBound().IsOpen())
129 {
130 Result.SetLowerBoundValue(Result.GetLowerBoundValue() * RHS);
131 }
132 if (!Result.GetUpperBound().IsOpen())
133 {
134 Result.SetUpperBoundValue(Result.GetUpperBoundValue() * RHS);
135 }
136
137 return Result;
138}
139
141{
142 TRange<FFrameNumber> Result = LHS;
143
144 if (!Result.GetLowerBound().IsOpen())
145 {
146 Result.SetLowerBoundValue((Result.GetLowerBoundValue() * RHS).FloorToFrame());
147 }
148 if (!Result.GetUpperBound().IsOpen())
149 {
150 Result.SetUpperBoundValue((Result.GetUpperBoundValue() * RHS).FloorToFrame());
151 }
152
153 return Result;
154}
155
162template<typename T>
164{
165 LHS = LHS * RHS;
166 return LHS;
167}
168
174{
175 // The matrix multiplication occurs as follows:
176 //
177 // | TimeScaleA , OffsetA | . | TimeScaleB, OffsetB |
178 // | 0 , 1 | | 0 , 1 |
179 //
180 const FFrameTime ScaledOffsetRHS = (LHS.TimeScale == 1.f || !FMath::IsFinite(LHS.TimeScale)) ? RHS.Offset : RHS.Offset * LHS.TimeScale;
182 LHS.Offset + ScaledOffsetRHS, // New Offset
183 RHS.TimeScale * LHS.TimeScale // New TimeScale
184 );
185}
186
189{
190 if (InTransform.TimeScale == 1.f)
191 {
192 if (InTransform.Offset.GetSubFrame() == 0.f)
193 {
194 return *FString::Printf(TEXT("[ %+i ]"), InTransform.Offset.FrameNumber.Value);
195 }
196 else
197 {
198 return *FString::Printf(TEXT("[ %+i+%.3f ]"),
199 InTransform.Offset.FrameNumber.Value, InTransform.Offset.GetSubFrame());
200 }
201 }
202 else
203 {
204 if (InTransform.Offset.GetSubFrame() == 0.f)
205 {
206 return *FString::Printf(TEXT("[ %+i x%.3f ]"),
207 InTransform.Offset.FrameNumber.Value, InTransform.TimeScale);
208 }
209 else
210 {
211 return *FString::Printf(TEXT("[ %+i+%.3f x%.3f ]"),
212 InTransform.Offset.FrameNumber.Value, InTransform.Offset.GetSubFrame(), InTransform.TimeScale);
213 }
214 }
215}
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define TEXT(x)
Definition Platform.h:1272
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
FFrameTime & operator*=(FFrameTime &InTime, const FMovieSceneTimeTransform &RHS)
Definition MovieSceneTimeTransform.h:111
FString LexToString(const FMovieSceneTimeTransform &InTransform)
Definition MovieSceneTimeTransform.h:188
FFrameTime operator*(FFrameTime InTime, const FMovieSceneTimeTransform &RHS)
Definition MovieSceneTimeTransform.h:89
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define USTRUCT(...)
Definition ObjectMacros.h:746
USkinnedMeshComponent float
Definition SkinnedMeshComponent.h:60
uint32 Offset
Definition VulkanMemory.cpp:4033
Definition Range.h:50
Definition FrameTime.h:16
static UE_FORCEINLINE_HINT bool IsNearlyEqual(float A, float B, float ErrorTolerance=UE_SMALL_NUMBER)
Definition UnrealMathUtility.h:388
static UE_FORCEINLINE_HINT bool IsNearlyZero(float Value, float ErrorTolerance=UE_SMALL_NUMBER)
Definition UnrealMathUtility.h:407
Definition MovieSceneTimeTransform.h:23
FFrameTime Offset
Definition MovieSceneTimeTransform.h:80
FMovieSceneTimeTransform Inverse() const
Definition MovieSceneTimeTransform.h:68
friend bool operator==(const FMovieSceneTimeTransform &A, const FMovieSceneTimeTransform &B)
Definition MovieSceneTimeTransform.h:47
float TimeScale
Definition MovieSceneTimeTransform.h:76
FMovieSceneTimeTransform(FFrameTime InOffset, float InTimeScale=1.f)
Definition MovieSceneTimeTransform.h:40
friend bool operator!=(const FMovieSceneTimeTransform &A, const FMovieSceneTimeTransform &B)
Definition MovieSceneTimeTransform.h:52
bool IsIdentity() const
Definition MovieSceneTimeTransform.h:60