Commit Graph

36 Commits

Author SHA1 Message Date
Thomas Sarkanen
502797ca50 Animation Curve Runtime & Editor Improvements
Runtime notes:
- Removes 'smart name' usage across the animation systems.
- Changed curve blending from a uniform array (sized per skeleton) to a sparse array of sorted named values. Blends and other combiners are performed using a dual iteration 'tape merge'.
- Skeleton curves are no longer guaranteed to cover all curve names that can be found at runtime.

Editor notes:
- Curve metadata (flags, bone links etc.) is still present on the skeleton, but can also now exist on a skeletal mesh
- Curve metadata (for morph targets) is still populated on import
- Curves can now be used arbitrarily at runtime

New features:
- New Find/Replace dialog that allows for batch-replacing curves and notifies across all of a project's assets
- New curve debugger tab in various Persona editors that allows for viewing curve values live. This also now allows viewing curves for specific pose watches.
- Pose watches now output curve tracks to the Rewind Debugger

#rb Jurre.deBaare,Nicholas.Frechette,Sara.Schvartzman,Helge.Mathee,Kiaran.Ritchie,Jaime.Cifuentes,Martin.Wilson,Keith.Yerex,Andrean.Franc (and more!)
#jira UE-167776
#jira UE-173716
#jira UE-110407
#preflight 63fc98c81206d91a2bc3ab90
#preflight 63f3ad4f81646f1f24c240c2

[CL 24421496 by Thomas Sarkanen in ue5-main branch]
2023-02-27 07:20:58 -05:00
Jurre deBaare
f5ea45d372 Crash when starting a take with a Metahuman source - No Movie Scene found for SequencerDataModel
#jira UE-173258
#fix make sure we never try and sample time-code attributes on an animation sequence which has not been populated (DataModel is created but not initialised)
#rb trivial
#preflight 63b85249d862fdd3473197b4

[CL 23599277 by Jurre deBaare in ue5-main branch]
2023-01-06 12:04:38 -05:00
Jurre deBaare
31f1b097fd Animation Compression
- Added new compression and 'compiling' API/path
  * Relies on newer DDC API
  * Only fetches compressible data when data is not found in DDC
  * Fetching data happens off the GT now (including Additive animation)
- Deprecated and replace AnimSequence API around compression
** AnimStreamable still relies on old, synchronous, compression path **

IAnimationDataModel
- Removed bone track data being stored as FBoneAnimationTrack
- Bone animation can now only be referenced by Name (not track index anymore)
- Deprecated any API relying on FBoneAnimationTrack
- Added API to retrieve FTransform(s) for given frame(s) with provided bone name
- Added API to lock model against modifications during evaluation (required for non-racing off-GT evaluation)

Animation Sequence
- Frame-rate is now stored on a per-platform basis, allowing for future replacement of frame-stripping (editing property is disabled for now)
- Now allows for storing _transient_ per-platform compressed animation data (required for multi-platform cook)

PerPlatformProperties
- Added per-platform FFrameRate implementation

#preflight 63999f102540a78d2778adb7
#rb Thomas.Sarkanen, Nicholas.Frechette, Devin.Doucette
#fyi Zousar.Shaker

[CL 23510521 by Jurre deBaare in ue5-main branch]
2022-12-14 05:56:08 -05:00
Jurre deBaare
c5afc6211b ANIM-RT truncation fixes - AnimationBlueprintLibrary
#jira UE-166629
#rb jaime.cifuentes
#preflight 63512aac8449f85a47b5fa16

[CL 22652656 by Jurre deBaare in ue5-main branch]
2022-10-20 07:23:59 -04:00
Jurre deBaare
ff0db16d0b Reintroducing AnimationDataModel refactor with additional memory and cooktime optimizations.
**Animation Data Model load/cook time and memory optimizations**
- Added SetKeysOnly to FMovieSceneFloatChannel, allowing to only set value/frames values and skip allocating key handles
- Added EvaluateWithCache to TMovieSceneCurveChannelImpl, allowing to evaluate multiple curves using a caching data structure holding the frame-indices resulting from the FrameTime -> indexes calculationg
- UFKControlRig::GetControlName/GetControlTargetName, added thread_local mapping cache and optimized FName generation
- Made the sequencer bone curve keys 'sparse' again, if constant it just sets the default value for the curve otherwise it is still uniform
- Only resample keys when compressing, and clear them on any significant model changes and when save-during-cook has been completed
- Routed ::Presave for AnimSequencerDataModel directly through to UMovieSceneSignedObject to skip compiling cooked sequencer that that will/should never cooked and packaged
- Added some significant pass-by-reference changes to AnimSequencerModel APIs (passing large arrays by value previously) :doh:
- Optimized GenerateLegacyBoneData

Original CL description:

**New**
- Engine
	- IAnimationDataModel interface
- AnimationData plugin
	- AnimSequencerDataModel, sequencer based implementation of IAnimationDataModel
	- AnimSequencerDataController, controller for above (implementation of IAnimationDataController)
- Added FCompressedRichCurve::PopulateCurve, allowing users to convert back to a FRichCurve for validation/debugging
- Added DefaultFrameRate to AnimationSettings, this replaces the hardcoded 30FPS in code
- Added ::GetKeyIndicesFromTime which takes FFrameRate
- Added AnimSequenceBase::OnAnimModelLoaded, this is required for correct postloading behaviour of data model (specifically AnimSequencerDataModel, as it depends on data from its outer ? anim sequence)
- Added IAnimationDataModel ::Evaluate which now takes responsibility for evaluating raw animation bone, curve and attribute data. And moved all trackbased evaluation code into AnimDataModel.cpp
- Added a.ForceEvalRawData allowing to force evaluation of source data
- Added a.SkipDDC to force compressing animation data locally

**Changed**
- Reparent UAnimDataModel to IAnimationDataModel interface, and rejig behaviour
- AnimSequenceBase now reference AnimDataModel as IAnimationDataModel
- Upgrade path for legacy to IAnimationDataModel and existing UAnimDataModel to IAnimationDataModel through IAnimationDataController::PopulateWithExisting
- IAnimationDataModel data is now frame(number/rate/time) based rather than seconds/keyindices. This enforces frameborder aligned data from now on.
- Moved RichCurve evaluation code from RichCurve.cpp to separate file and consolidated all instances of copy-pasta behaviour
- Updated/removed deprecated EngineTests around AnimSequences
- Changed many instances to use a FFrameTime together with a known FFrameRate versus seconds and sequencelength in float involving frame \/ time calculations (including instances of FAnimKeyHelper)
- Switched anim sequence evaluation to use double in Extraction context for time value and patched up places with static\_cast\<double\>
- FRichCurve::Eval
	- Make sure we always evaluate keys when T >= Key0.Time and T <= KeyN.Time to deal with crazy userweighted tangents
- Fixed WeightedKeyDataAdapter::GetKeyInterpMode/GetKeyTangentWeightMode retrieving invalid values, as it was indexing according to KeyIndex rather than KeyIndex\*2. This made it so that values were misinterpreted.
- Fixed WeightedEvalForTwoKeys for compressed data retrieving GetKeyInterpMode and GetKeyTangentWeightMode using the wrong index value. As they are not indexed using KeyDataHandle type.
- Fixed issue where compression could crash when containing zero-key scale additivebase track (tries to retrieve)
- Replaced instances of NULL with nullptr
- Moved required decompression information into FAnimSequenceDecompressionContext and reimplemented decompression within UE::Anim::Decompression namespace and new file
- Deprecated ::GetRawDataGuid and replaced with GetDataModel()->GenerateGuid()
- Fixed UAnimStreamable evaluation/compression (previously broken with MVC refactor)
- Updated Animation exporting pipeline to be frame-based rather than seconds
- Deprecated RetargetPose, replaced with FRetargetingScope (used within AnimModel::Evaluate)
- Fixed BaseAdditiveAnimation array become invalid/incorrect when removing zero-additve tracks during compression
- Updated EngineTest animation sequence related tests to new APIs (while maintaining deprecated path testing as well for now)
- AnimDataController / Animation Sequence tests now generate a USkeleton for the transient animation sequence (used to perform the test on)

**Removed**
- Unused file/class AnimData/AnimDataNotifyCollector.h

#rb Thomas.Sarkanen, Mike.Zyracki
#jira UE-131296
#preflight 631f6897a9331c69c3a34d1e

[CL 21980597 by Jurre deBaare in ue5-main branch]
2022-09-13 06:41:15 -04:00
jack cai
49f430480d AnimationAttribute: Added support for user defined struct as animation attributes
#jira UE-152930
#rb jurre.debaare
#preflight https://horde.devtools.epicgames.com/job/63190886980179553e98e57f

[CL 21863555 by jack cai in ue5-main branch]
2022-09-07 17:37:09 -04:00
jack cai
20a2039066 [Backout] - CL21859777
#fyi jack.cai
Original CL Desc
-----------------------------------------------------------------
AnimationAttribute: Added support for user defined struct as animation attributes

#jira UE-152930
#rb jurre.debaare
#preflight skip

[CL 21860662 by jack cai in ue5-main branch]
2022-09-07 15:56:40 -04:00
jack cai
63e62a9c68 AnimationAttribute: Added support for user defined struct as animation attributes
#jira UE-152930
#rb jurre.debaare
#preflight skip

[CL 21859777 by jack cai in ue5-main branch]
2022-09-07 15:34:00 -04:00
bryan sefcik
0837230669 Ran IWYU again on half of the Engine/Source/Editor/... source files.
#jira

[CL 21716414 by bryan sefcik in ue5-main branch]
2022-08-30 23:03:03 -04:00
Marc Audy
de2c3cb8e0 [Backout] - CL20593017, 20594056, 20625634, 20645670, 20649179, 20649223, 20649380, 20658535
Add new custom version to specify a certain window of AnimSequences are not loadable
#fyi Jurre.deBaare
#robomerge EngineMerge
Original CL Desc
-----------------------------------------------------------------
**New**
- Engine
	- IAnimationDataModel interface
- AnimationData plugin
	- AnimSequencerDataModel, sequencer based implementation of IAnimationDataModel
	- AnimSequencerDataController, controller for above (implementation of IAnimationDataController)
- Added FCompressedRichCurve::PopulateCurve, allowing users to convert back to a FRichCurve for validation/debugging
- Added DefaultFrameRate to AnimationSettings, this replaces the hardcoded 30FPS in code
- Added ::GetKeyIndicesFromTime which takes FFrameRate
- Added AnimSequenceBase::OnAnimModelLoaded, this is required for correct postloading behaviour of data model (specifically AnimSequencerDataModel, as it depends on data from its outer ? anim sequence)
- Added IAnimationDataModel ::Evaluate which now takes responsibility for evaluating raw animation bone, curve and attribute data. And moved all trackbased evaluation code into AnimDataModel.cpp
- Added a.ForceEvalRawData allowing to force evaluation of source data
- Added a.SkipDDC to force compressing animation data locally

**Changed**
- Reparent UAnimDataModel to IAnimationDataModel interface, and rejig behaviour
- AnimSequenceBase now reference AnimDataModel as IAnimationDataModel
- Upgrade path for legacy to IAnimationDataModel and existing UAnimDataModel to IAnimationDataModel through IAnimationDataController::PopulateWithExisting
- IAnimationDataModel data is now frame(number/rate/time) based rather than seconds/keyindices. This enforces frameborder aligned data from now on.
- Moved RichCurve evaluation code from RichCurve.cpp to separate file and consolidated all instances of copy-pasta behaviour
- Updated/removed deprecated EngineTests around AnimSequences
- Changed many instances to use a FFrameTime together with a known FFrameRate versus seconds and sequencelength in float involving frame \/ time calculations (including instances of FAnimKeyHelper)
- Switched anim sequence evaluation to use double in Extraction context for time value and patched up places with static\_cast\<double\>
- FRichCurve::Eval
	- Make sure we always evaluate keys when T >= Key0.Time and T <= KeyN.Time to deal with crazy userweighted tangents
- Fixed WeightedKeyDataAdapter::GetKeyInterpMode/GetKeyTangentWeightMode retrieving invalid values, as it was indexing according to KeyIndex rather than KeyIndex\*2. This made it so that values were misinterpreted.
- Fixed WeightedEvalForTwoKeys for compressed data retrieving GetKeyInterpMode and GetKeyTangentWeightMode using the wrong index value. As they are not indexed using KeyDataHandle type.
- Fixed issue where compression could crash when containing zero-key scale additivebase track (tries to retrieve)
- Replaced instances of NULL with nullptr
- Moved required decompression information into FAnimSequenceDecompressionContext and reimplemented decompression within UE::Anim::Decompression namespace and new file
- Deprecated ::GetRawDataGuid and replaced with GetDataModel()->GenerateGuid()
- Fixed UAnimStreamable evaluation/compression (previously broken with MVC refactor)
- Updated Animation exporting pipeline to be frame-based rather than seconds
- Deprecated RetargetPose, replaced with FRetargetingScope (used within AnimModel::Evaluate)
- Fixed BaseAdditiveAnimation array become invalid/incorrect when removing zero-additve tracks during compression
- Updated EngineTest animation sequence related tests to new APIs (while maintaining deprecated path testing as well for now)
- AnimDataController / Animation Sequence tests now generate a USkeleton for the transient animation sequence (used to perform the test on)

**Removed**
- Unused file/class AnimData/AnimDataNotifyCollector.h

#rb Thomas.Sarkanen, Martin.Wilson, Alexis.Matte, Mike.Zyracki
#jira UE-131296
#preflight 62a308a8b0150a87f9d6891b

[CL 20677979 by Marc Audy in ue5-main branch]
2022-06-15 18:24:46 -04:00
Jurre deBaare
e13fdba72c **New**
- Engine
	- IAnimationDataModel interface
- AnimationData plugin
	- AnimSequencerDataModel, sequencer based implementation of IAnimationDataModel
	- AnimSequencerDataController, controller for above (implementation of IAnimationDataController)
- Added FCompressedRichCurve::PopulateCurve, allowing users to convert back to a FRichCurve for validation/debugging
- Added DefaultFrameRate to AnimationSettings, this replaces the hardcoded 30FPS in code
- Added ::GetKeyIndicesFromTime which takes FFrameRate
- Added AnimSequenceBase::OnAnimModelLoaded, this is required for correct postloading behaviour of data model (specifically AnimSequencerDataModel, as it depends on data from its outer ? anim sequence)
- Added IAnimationDataModel ::Evaluate which now takes responsibility for evaluating raw animation bone, curve and attribute data. And moved all trackbased evaluation code into AnimDataModel.cpp
- Added a.ForceEvalRawData allowing to force evaluation of source data
- Added a.SkipDDC to force compressing animation data locally

**Changed**
- Reparent UAnimDataModel to IAnimationDataModel interface, and rejig behaviour
- AnimSequenceBase now reference AnimDataModel as IAnimationDataModel
- Upgrade path for legacy to IAnimationDataModel and existing UAnimDataModel to IAnimationDataModel through IAnimationDataController::PopulateWithExisting
- IAnimationDataModel data is now frame(number/rate/time) based rather than seconds/keyindices. This enforces frameborder aligned data from now on.
- Moved RichCurve evaluation code from RichCurve.cpp to separate file and consolidated all instances of copy-pasta behaviour
- Updated/removed deprecated EngineTests around AnimSequences
- Changed many instances to use a FFrameTime together with a known FFrameRate versus seconds and sequencelength in float involving frame \/ time calculations (including instances of FAnimKeyHelper)
- Switched anim sequence evaluation to use double in Extraction context for time value and patched up places with static\_cast\<double\>
- FRichCurve::Eval
	- Make sure we always evaluate keys when T >= Key0.Time and T <= KeyN.Time to deal with crazy userweighted tangents
- Fixed WeightedKeyDataAdapter::GetKeyInterpMode/GetKeyTangentWeightMode retrieving invalid values, as it was indexing according to KeyIndex rather than KeyIndex\*2. This made it so that values were misinterpreted.
- Fixed WeightedEvalForTwoKeys for compressed data retrieving GetKeyInterpMode and GetKeyTangentWeightMode using the wrong index value. As they are not indexed using KeyDataHandle type.
- Fixed issue where compression could crash when containing zero-key scale additivebase track (tries to retrieve)
- Replaced instances of NULL with nullptr
- Moved required decompression information into FAnimSequenceDecompressionContext and reimplemented decompression within UE::Anim::Decompression namespace and new file
- Deprecated ::GetRawDataGuid and replaced with GetDataModel()->GenerateGuid()
- Fixed UAnimStreamable evaluation/compression (previously broken with MVC refactor)
- Updated Animation exporting pipeline to be frame-based rather than seconds
- Deprecated RetargetPose, replaced with FRetargetingScope (used within AnimModel::Evaluate)
- Fixed BaseAdditiveAnimation array become invalid/incorrect when removing zero-additve tracks during compression
- Updated EngineTest animation sequence related tests to new APIs (while maintaining deprecated path testing as well for now)
- AnimDataController / Animation Sequence tests now generate a USkeleton for the transient animation sequence (used to perform the test on)

**Removed**
- Unused file/class AnimData/AnimDataNotifyCollector.h

#rb Thomas.Sarkanen, Martin.Wilson, Alexis.Matte, Mike.Zyracki
#jira UE-131296
#preflight 62a308a8b0150a87f9d6891b

[CL 20593017 by Jurre deBaare in ue5-main branch]
2022-06-10 06:24:32 -04:00
Jurre deBaare
4c51bac40d UE5/Release-5.1 - Duplicated keys for localization - UE - Anim
#jira UE-150815
#rb trivial
#preflight 6284d86ef239239af676a70f

[CL 20259117 by Jurre deBaare in ue5-main branch]
2022-05-18 07:36:32 -04:00
frederick lupien
e747e2d057 Add GetMontageSlotNames to AnimationBlueprintLibrary to retrieve the name of all slots used by a given montage
#rb Jurre.deBaare

#ROBOMERGE-AUTHOR: frederick.lupien
#ROBOMERGE-SOURCE: CL 20058271 via CL 20058292 via CL 20058302
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v943-19904690)

[CL 20061208 by frederick lupien in ue5-main branch]
2022-05-05 14:10:40 -04:00
Jurre deBaare
7fffdecb0e 5.0 deprecated functionality removal from AnimSequence(Base) and AnimDataModel
#jira none
#rb Thomas.Sarkanen
#preflight 625566fc3f5641db59efc016

[CL 19718928 by Jurre deBaare in ue5-main branch]
2022-04-12 08:00:50 -04:00
Jurre deBaare
da85ae3f1c AnimPose API improvements
- Add evaluating / retrieving of curve values from pose
- Add ability to retrieve Additive animation as full-pose (base + additive) or just additive
- Add ability to retrieve set of poses, evaluated at provided equal set of time intervals
#rb Thomas.Sarkanen
#jira none
#preflight 624da4b6bd5b36eec325a12f

[CL 19647633 by Jurre deBaare in ue5-main branch]
2022-04-06 10:45:20 -04:00
jonathan adamczewski
aaa222342a fixes for non-pch, non-unity build
#jira none
#trivial
#rnx
#preflight 624b167b292f228e094aa31a

[CL 19610582 by jonathan adamczewski in ue5-main branch]
2022-04-04 12:18:34 -04:00
Jurre deBaare
eeceb102db Added uniform blueprint nodes for adding/updating of Animation Attribute (data)
- Expose built in attribute type properties to blueprints/scripting
#jira none
#rb Thomas.Sarkanen
#preflight 6246c9a2dc6183e3f5170675

[CL 19586053 by Jurre deBaare in ue5-main branch]
2022-04-01 06:09:36 -04:00
marc audy
0731f43da6 Fix Linux build due to use of inline function GetAnimBlueprint
[CODEREVIEW] Jurre.deBaare
#rnx

#ROBOMERGE-AUTHOR: marc.audy
#ROBOMERGE-COMMAND: FNMain
#ROBOMERGE-SOURCE: CL 19432069 in //UE5/Release-Engine-Staging/...
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v930-19419903)

[CL 19432599 by marc audy in ue5-main branch]
2022-03-18 02:35:56 -04:00
jurre debaare
ca75472a6c #feature added script exposed AddNodeAssetOverride function, allowing users to set Animation Asset overrides through Blueprints/Python
#rb Thomas.Sarkanen
#preflight 623315486c05dd6bbc7d0bd5

#ROBOMERGE-OWNER: jurre.debaare
#ROBOMERGE-AUTHOR: jurre.debaare
#ROBOMERGE-SOURCE: CL 19419387 via CL 19419414 via CL 19421349 via CL 19429039 via CL 19429170
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v930-19419903)

[CL 19432568 by jurre debaare in ue5-main branch]
2022-03-18 02:33:13 -04:00
kiaran ritchie
91793932a8 Fixing crash when exporting animation in retargeter.
#JIRA:https://jira.it.epicgames.com/browse/UE-143028
#rb:halfdan.ingvarsson
#preflight:https://horde.devtools.epicgames.com/job/620d7fb77948a1e5e4c2a520

#ROBOMERGE-AUTHOR: kiaran.ritchie
#ROBOMERGE-SOURCE: CL 19079231 in //UE5/Release-5.0/... via CL 19094758
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v921-19075845)

[CL 19137217 by kiaran ritchie in ue5-main branch]
2022-02-24 20:51:27 -05:00
matt johnson
4fd3699e7d AnimationBlueprintLibrary: add function for evaluating the subframe timecode attribute
Since the subframe component of FFrameTime is clamped to the range [0.0, 1.0),
it cannot accurately represent the use case where the timecode metadata represents
subframe values as whole numbered subframes instead of as a percentage of a frame
the way the engine does. The subframe component of the FQualifiedFrameTime returned
by EvaluateRootBoneTimecodeAttributesAtTime() may not reflect the authored subframe
metadata in that case.

This new function allows access to the subframe values that were actually authored in the
timecode metadata.

An additional explicit clamp was added to EvaluateRootBoneTimecodeAttributesAtTime()
to ensure that the subframe value read from the timecode metadata is in range *before*
we try to construct an FFrameTime from it, since the constructor has a checkSlow() that
will assert if the value is out of range.

#jira UE-141224
#rb max.chen
#preflight 620ffdcead11de9431ce8cc5

[CL 19060425 by matt johnson in ue5-main branch]
2022-02-18 19:47:57 -05:00
kiaran ritchie
926a4292db Fixed bug, exported retarget produces different results than editor preview.
#JIRA:https://jira.it.epicgames.com/browse/UE-142160
#rb:halfdan.ingvarsson
#preflight:https://horde.devtools.epicgames.com/job/620ad57e803d9066e68f84dd

#ROBOMERGE-AUTHOR: kiaran.ritchie
#ROBOMERGE-SOURCE: CL 18998188 in //UE5/Release-5.0/... via CL 18998680 via CL 18999001
#ROBOMERGE-BOT: UE5 (Release-Engine-Test -> Main) (v917-18934589)

[CL 19001757 by kiaran ritchie in ue5-main branch]
2022-02-15 15:05:13 -05:00
matt johnson
da28fed981 AnimationBlueprintLibrary: add support for evaluating string-typed timecode custom attributes and timecode rates
This extends the handling in EvaluateRootBoneTimecodeAttributesAtTime() to support reading
numerical values from string-typed custom attributes for any of the existing components of
FTimecode or a subframe value.

It also adds support for parsing a timecode rate string into the FFrameRate it represents,
and accounts for the use of drop frame timecode rates (with either "29.97df" for NTSC_30
or "59.94df" for NTSC_60 frame rates).

#rb max.chen
#preflight 61ef2029ca3de856bcdb2a42

#ROBOMERGE-AUTHOR: matt.johnson
#ROBOMERGE-SOURCE: CL 18715500 in //UE5/Release-5.0/... via CL 18715569 via CL 18715728
#ROBOMERGE-BOT: UE5 (Release-Engine-Test -> Main) (v903-18687472)

[CL 18717033 by matt johnson in ue5-main branch]
2022-01-24 18:58:39 -05:00
matt johnson
b842f67db7 Animation: add "TCRate" timecode custom attribute for specifying the timecode rate
In some workflows when authoring timecode metadata, the timecode rate may be
different from the animation or capture frame rate, for example when capturing
"high" frame rate data at 120 frames per second but recording SMPTE timecode
at 30 frames per second.

This adds a "TCRate" custom attribute setting that allows authoring metadata that
specifies a timecode rate that is different from the animation data frame rate.

With this initial introduction of the new setting, the custom attribute is expected to
be integer or float typed and should represent the timecode rate in frames per second.
Drop frame is not yet supported.

#rb max.chen, benoit.deschenes
#preflight 61d77760932a02483cd95c1a

#ROBOMERGE-AUTHOR: matt.johnson
#ROBOMERGE-SOURCE: CL 18551309 in //UE5/Release-5.0/... via CL 18551318
#ROBOMERGE-BOT: STARSHIP (Release-Engine-Staging -> Release-Engine-Test) (v899-18417669)

[CL 18551341 by matt johnson in ue5-release-engine-test branch]
2022-01-07 17:16:14 -05:00
benoit gadreau
62444fb000 changed transform functions to return const references
#rb jurre.debaare
#jira none
#preflight 61d46fd91a3fd09dcbc70f2b

#ROBOMERGE-AUTHOR: benoit.gadreau
#ROBOMERGE-SOURCE: CL 18508342 in //UE5/Release-5.0/... via CL 18508375
#ROBOMERGE-BOT: STARSHIP (Release-Engine-Staging -> Release-Engine-Test) (v899-18417669)
#ROBOMERGE[STARSHIP]: UE5-Main

[CL 18508395 by benoit gadreau in ue5-release-engine-test branch]
2022-01-04 11:25:06 -05:00