Change consist of only forward declaration and additional includes
#preflight 63789c1de30d438849c48188
#rb none
[CL 23218412 by henrik karlsson in ue5-main branch]
This fixes a problem of pre-recycling state leaking through after an update
#rb max.chen, andrew.rodham
#jira none
#preflight 6328be3e6919ce39982d8266
[CL 22087360 by ludovic chabant in ue5-main branch]
A few changes here:
- FKeyHandleLookupTable used to roll its own sparse array using a TArray of TOptionals. It was also designed to lazily update its map of handles to indices if it encountered one that was not correct. Unfortunately this results in an n^2 operation if you try and resolve key handles for all the elements in a channel when they are not valid (because it has to look through all the key handles to find the correct index). I have changed this to always keep the handle/index mappings up to date when moving keys around. In this way the operation scales poorly with the number of keys added or removed from the channel, rather than the total number of keys (which is still bad, but not as bad as always scaling poorly for large numbers of keys).
- Various optimizations to FKeyRenderer. When preserving computed keys (ie, when we are simply padding new keys into or old keys out of view), we no longer re-allocate the entire array (which can be very large), and instead opt to relocate-construct the preserved keys within the same allocation. When the array gets large enough we always end up going to the crt allocator which is extremely slow, so keeping the allocation alive is beneficial here.
- FKeyRenderer cached key computation is now performed using a parallel for loop when the number of channels or keys is large. This should really be improved by doing the same work for _all keys rendered in the current frame_ rahter than only going wide for each section, but this is a good win for control rigs at least.
- When determining whether to draw a group of keys as selected, hovered or preview selected, we now only consider the first 500 keys before assuming all the others have the same state. This saves us from iterating thousands and thousands of keys to see if they are all selected when zoomed out very far.
- FSequencerSelectedKey construction and comparison was taking up a lot of CPU. I have added raw FKeyHandle sets to the various selection classes for direct comparisons which speeds up checking for selected and hovered keys greatly. FKeyHandle is a unique index regardless of what channel it exists on, so this is safe.
#preflight 630d555c0345de4ccf9738e4
#rb Ludovic.Chabant, Max.Chen
#jira UE-162145
[CL 21694939 by Andrew Rodham in ue5-main branch]
- This is now supported by either overriding ISequencerSection::CreateChannelModel, or by defining a
TSharedPtr<UE::Sequencer::STrackLaneView> CreateChannelView(TMovieSceneChannelHandle<FMyChannelType>, TWeakPtr<FChannelModel> const UE::Sequencer::FCreateTrackLaneViewParams&);
overload for the sequencer channel traits of that type.
#preflight 630d555c0345de4ccf9738e4
#rb Ludovic.Chabant, Max.Chen
#jira none
[CL 21694520 by Andrew Rodham in ue5-main branch]
- We previously did not arrange sections with degenerate (ie, [0,0] ) ranges on their track lanes. Unfortunately UMG often creates degenerate section ranges so we need to show those properly.
- Also fixed resize-handle offsets that were not rendering correctly outside the section range when the pixel width of the section was small enough.
#jira UE-161709
#preflight 63079aa82a56ec23c8402321
#rb Max.Chen
[CL 21566845 by Andrew Rodham in ue5-main branch]
SSequencerSection now has an SChannelView that is only shown when collapsed, which reflects all the keys within it (including top-level channels). This actually allows us to also remove a second pass we had to do previously to generate top-level channel view widgets as well.
#jira UE-161879
#rb Max.Chen
#preflight 630661efc744dac9672f5c44
[CL 21545954 by Andrew Rodham in ue5-main branch]
DrawExtra now receives a parameter struct that contains the necessary slate rendering parameters, rather than utilizing the section painter and separate geometry. Ideally such rendering code would exist in actual view models or custom views, but for now this API needs to be maintained
#rb Mike.Zyracki, Max.Chen, Benoit.Badreau
#jira none
#preflight 63064e705366f61a42c398d1
[CL 21543371 by Andrew Rodham in ue5-main branch]
- Nested track lanes are now supported, allowing sequencer channels to be added as fully fledged child widgets of a parent, while still being arranged automatically and have their lifetime managed by their respective outliner item (therefore, they are now fully virtualized as you might expect)
- Key bars have been added. This is exposed through a new ConnectionStyle member of FKeyDrawParams. Their rendering is also cached and batched within FKeyRenderer
- Most relevant parts have been moved to SequencerCore now. Channel and category views remain in the Sequencer library due to their reliance on internal classes there, but they should be trivially moved to SequencerCore as a future task.
- Track area now has a shared FTimeToPixel that can be shared amonst any widgets that need to convert times to track-area-pixel-space.
- Added methods to ISequencerSection to allow client classes to create custom channel and category model types
- Layer bar improvements:
- Layer bars now encompass finite section ranges.
- Resize handles are now only visible on hover as per design guidelines.
- Inline curve display improvements:
- Rendering is now part of each channel's view
- Added API for determining curve extents
- Curves are now rendered using FCurveModels
- Snapping fixes and improvements
- There were several places where snapping seemed not to work at all, or would snap inconsistently with dense keyframe data.
- I've added a Weighting to the snap points so we can specify preferred snap points (section bounds, time cursor etc), and accumulate weights for specific frames where many keys exist. This helps to snap to times that are actually relevant, rather than always snapping to the nearest snap point, even if that snap point only has a single key on that time, and there are others within the snap threshold that have hundreds.
- Converted the snapping utilities to operate on FFrameTimes rather than FFrameNumbers in order to support custom sequencer UIs that might not operate on integer time bases (it remains fully frame accurate with integers however)
- Allow 'Key this section' to be unchecked
#rb Max.Chen, Ludovic.Chabant, Matt.Hoffman
#preflight 63055b5903520e063cd53cfb
[CL 21526535 by Andrew Rodham in ue5-main branch]
Previously, only float channels were adding an extension to context menus. When double channels were made, they had the same code but only the latest one to add an extension would "win", because menu builders only use the top extender. So now we create one extender with multiple extensions in it. However, this means that now we'll get duplicate sets of menu entries (one for double channels, one for float channels). Plus the menu entries from overriden channels. So we also now put channel menu entries inside sub-menus, in a different context menu section.
#jira none
#rb max.chen
#preflight 6303f632a45b007ea2551892
[CL 21494993 by ludovic chabant in ue5-main branch]
This made the layer bars never properly computed.
#rb max.chen, mike.zyracki
#robomerge FNMain
#jira none
#preflight 62d84d2ed76ea4b5037e9e01
[CL 21186194 by ludovic chabant in ue5-main branch]
Headers are updated to contain any missing #includes needed to compile and #includes are sorted. Nothing is removed.
#ushell-cherrypick of 21065253 by bryan.sefcik
#jira
#preflight 62d5b3e91062f2e63014598e
#ROBOMERGE-AUTHOR: bryan.sefcik
#ROBOMERGE-SOURCE: CL 21152630 via CL 21156388 via CL 21157044
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v972-20964824)
[CL 21181817 by bryan sefcik in ue5-main branch]