Commit Graph

66 Commits

Author SHA1 Message Date
max chen
ea910823bd Sequencer: Additional Tree View UX - Highlight parents even if the selected item is collapsed
Same as SSceneOutlinerTreeView::Private_UpdateParentHighlights

#rb Andrew.Rodham
#jira UE-200166

[CL 30272151 by max chen in ue5-main branch]
2023-12-12 14:29:01 -05:00
max chen
96499ec11c Sequencer: Tree View UX
- TableRowStyle for Sequencer which is a combination of the alternative row style and the show parent style - Alternating rows have different tints, parents have different tints.
- Make sure top level rows also report as a parent row
- Rows that have keys or sections selected also report as highlighted

#rb Andrew.Rodham
#jira UE-200166

[CL 30187311 by max chen in ue5-main branch]
2023-12-07 13:58:37 -05:00
max chen
6aad82d604 Sequencer: Column UX
- Update icons to 14x14
- Remove inner border
- Update opacities: Default 10%, Row Hover 25%, Row and Icon Hover 80%, Selected 100%

#jira UE-200167
#rb andrew.rodham

[CL 30143354 by max chen in ue5-main branch]
2023-12-05 19:45:55 -05:00
david bromberg
dd8c44e6f5 Sequencer- Binding Lifetime Track.
The Binding Lifetime track is an optional track that can be added to any object binding. It allows the user to set time range(s) for when the object in question will be bound by Sequencer. Outside of those ranges, the object will be released, and any tracks underneath it will restore state/keep state as set.

Currently this track works for both spawnables and possessables. This track is a precursor to other binding types coming to Sequencer, and in the future this track will allow the user to trigger events as part of the binding activation/deactivation so that changes like AI control for example can be set when binding/unbinding NPC characters or player characters.

As part of this change, it was necessary to clean up some of the sequencer UI color settings on labels, as well as a few changes to the layer bar UI to facilitate a hatch overlay for the sections of the binding tracks that are in a deactivated area.

[REVIEW] [at]ue-sequencer
#jira UE-200088, UE-199857, UE-199299
#rb ludovic.chabant

[CL 29636485 by david bromberg in ue5-main branch]
2023-11-10 07:34:17 -05:00
ludovic chabant
cce1cd40c0 Sequencer: stable sort sequencer outliner children to avoid weird reordering issues
#jira UE-194092
#rb max.chen, andrew.rodham

[CL 28479854 by ludovic chabant in ue5-main branch]
2023-10-04 18:28:03 -04:00
max chen
cb5bb57b06 Sequencer: OnHierarchyUpdated can be called while the widget is being destroyed, so just mark bWidgetsDirty and not RecreateWidgets() immediately. bWidgetsDirty will call RecreateWidgets() on Tick() if necessary.
#jira UE-194376
#rb andrew.rodham

[CL 28347249 by max chen in ue5-main branch]
2023-09-29 13:21:29 -04:00
steve robb
51f3ea53ae Removed ChooseClass.h includes.
#rb trivial

[CL 27823723 by steve robb in ue5-main branch]
2023-09-13 05:43:01 -04:00
andrew rodham
02f64a43a5 Sequencer: Optimized mute/solo/lock columns by implementing caching and removing redundant UI delegation
+ Added a new row type for outliner trees that sets the background color once for the whole row. Previously this logic was implemented by each widget within the row (now each column widget, and the outliner view widget), which meant we re-ran the exact same logic (that was copied around) for background color computation multiple times per row. We now only do this once for the whole row.

  + Added a ModelID to all MVVM models. This is just a non-persistent serial uint32 unique to the instance and can be used for more efficient and stable keys than using the instance ptr.

  + SharedData is now a view model so it can support arbitrary extension and casting. This enables us to:
     + Add a new hierarchical cache extension that is easily accessible from any widget using GetSharedData()->CastThis<FOutlinerCacheExtension>()
     + Hierarchical Cache will perform a single pass on the entire MVVM hierarchy and allow clients to compute cached flags.
     + We have a separate cache for each of mute, solo and lock states that includes whether the item is set directly, and also whether it has settable children, and is implicitly set by a parent or child.

  + Added a dynamic extension iterator that allows anyone to iterate and filter the currently active dynamic extensions.
  + Moved Mute and Solo logic into the actual mute / solo extensions, rather than it being implemented in the NodeTree
  + Fixed header coloration for collapsed outliner rows that had selected keys within them. The logic here was incorrect and looked like an error in porting the code. It is now correct (and more efficient).

  - Only folders, objects, tracks and track rows now implement mute/solo. Channels and categories were never supported, and now no longer show as such on the UI.
  - Deleted the pre-existing XYZEditorExtension classes since they have all been ported to these new caches (the code is largely the same)


#jira UE-193500
#rb Max.Chen

[CL 27669850 by andrew rodham in ue5-main branch]
2023-09-07 08:25:43 -04:00
david bromberg
14598e7e48 Fix rendering issue where color property tracks in Materials were causing key areas to get culled due to mismatching outliner and trackview heights.
[REVIEW] [at]ue-sequencer
#jira UE-194187

[CL 27599233 by david bromberg in ue5-main branch]
2023-09-05 12:10:05 -04:00
david bromberg
5c5b2be807 Sequencer- Add fixup UX logic for Component Material Parameter and Material Switcher tracks. We now detect when a track bound to a material by slot name no longer matches both slot name and material index, and allow the user to either automatically or manually rebind the track to the material slot and index.
As part of this, change display name tooltips on tracks back to using a function rather than a saved value so they can be dynamically specified. This needed Sequencer and ObjectBindingID passed to the function for context. This was only very recently changed to use saved values, so this shouldn't cause issues.
#jira UE-192507
[REVIEW] [at]ue-sequencer

[CL 27595620 by david bromberg in ue5-main branch]
2023-09-05 10:15:32 -04:00
max chen
5e4758c80e Sequencer: Outliner Column fixed height caused issues with alignment between Outliner View and Track View
#rb john.manard
#rnx

[CL 27250398 by max chen in ue5-main branch]
2023-08-21 15:36:02 -04:00
max chen
b64ec0a641 Sequencer: Only allow dropping onto spacers from sequencer outilner drag and drop operations, ie. not actors from the outliner
#jira UE-192214
#rb andrew.rodham

[CL 27030696 by max chen in ue5-main branch]
2023-08-11 11:55:32 -04:00
andrew rodham
e670357cd0 Sequencer: Fixed hotspot changed delegate not being broadcast for some functions
This corrects the event only being broadcast for the SetHotspot call from CL 24179637.

#jira UE-191858
#rb Max.Chen

[CL 26818509 by andrew rodham in ue5-main branch]
2023-08-03 14:00:33 -04:00
john manard
88df562bf9 Sequencer: Outliner Column Implementations
Implementations for the pin, mute, lock, and solo outliner columns to be displayed in the SOutlinerView of Sequencer. Each outliner column widget implements click and drag functionality. Outliner column visibility is saved per-sequencer and per-user. Default column visibility and order can be saved and restored in BaseEditorPerProjectUserSettings.ini.

#jira UE-105291
#rb max.chen

[CL 26656030 by john manard in ue5-main branch]
2023-07-27 17:10:27 -04:00
john manard
56358a858a Sequencer: Outliner Column Editor Extensions
These editor extensions are used by outliner column implementations to query and modify pin, mute, lock, and solo.

#jira UE-105291
#rb max.chen

[CL 26520650 by john manard in ue5-main branch]
2023-07-21 14:37:00 -04:00
john manard
53f37e6fe6 Sequencer: Track Gutter UI Framework, Outliner Column Creation and Settings
#jira UE-105291
#rb max.chen

[CL 26286273 by john manard in ue5-main branch]
2023-06-28 11:25:52 -04:00
john manard
889e3d920d Sequencer: Track Gutter UI Framework, Outliner Column Creation and Settings
#jira UE-105291
#rb max.chen

[CL 26273588 by john manard in ue5-main branch]
2023-06-27 18:19:42 -04:00
max chen
b0f2b032cb Sequencer: When a track or binding is added, adjust sorting orders if there is going to be clash. The incoming track should be sorted to the bottom amongst the other tracks of the same class and name.
#jira UE-186432
#rb andrew.rodham, ludovic.chabant

[CL 26242858 by max chen in ue5-main branch]
2023-06-26 15:54:15 -04:00
john manard
6d06a1857c Sequencer: Outliner column registration and column interface declaration
#jira UE-105291
#rb max.chen

[CL 26028906 by john manard in ue5-main branch]
2023-06-15 18:16:21 -04:00
john manard
14fc05eb24 Sequencer: Outliner column registration and column interface declaration
#jira UE-105291
#rb max.chen

[CL 26028143 by john manard in ue5-main branch]
2023-06-15 17:56:10 -04:00
andrew rodham
9dce7cca59 Sequencer: Fixed a crash when duplicating keys
The tempoarary structure used by duplication has no owner, so doesn't need to report changes

#rb none
#jira UE-188234

[CL 25879219 by andrew rodham in ue5-main branch]
2023-06-08 15:29:43 -04:00
ludovic chabant
b912c0e4e9 Sequencer: don't assert on zero-width sections
#jira UE-187497
#rb max.chen
#preflight skip

[CL 25712517 by ludovic chabant in ue5-main branch]
2023-05-31 16:17:36 -04:00
ludovic chabant
ec974790d6 Sequencer: improve edge interaction for sections
- Draw easing handles as rounded triangles sized to match the grip size, instead of the previous bitmap.
- Easing handles are bigger, with bigger hit-testing area.
- Expose key size through the section interface in addition to grip size
- Fix bug where small sections can result in negative time-to-pixel conversion

#jira UE-171407
#rb max.chen
#preflight 6476202b4b1ead7c7f1db4e0

[CL 25694826 by ludovic chabant in ue5-main branch]
2023-05-30 19:34:48 -04:00
max chen
a5419cbe9a Sequencer: Added custom, persistent scheduler for dispatching ECS tasks
The aim of this work is to improve overall CPU cost in 3 ways:

  - to reduce the per-frame overhead of running ECS tasks
  - to decrease latency between useful gamethread work being able to run
  - to increase thread ultilization where many cores are available

In both single-threaded and multi-threaded mode this is showing a wall-clock speed improvement of ~25%, upon which other optimizations can now be made.

Previously, the Dispatch_ methods would construct tasks and filters for their work every frame. Tasks dispatched by downstream systems that were added as implicit dependencies would always depend on all the work of their upstream systems, even if they didn't necessarily need to be (for example, float properties would need to wait for *all* float channels to be evaluated and blended before they could be applied, even ones that only applied to transform properties).

The new approach introduces a new system phase (ESystemPhase::Scheduling) which is only run as part of the post-instantiation. This phase invokes a new method (OnSchedulePersistentTasks) which allows systems to define the task-structure for the current state of the ECS. Tasks defined here are stored inside the scheduler, and live for the duration of the instantiation - if the structure of the entity manager materially changes, the task graph is re-constructed.

Entity task builders are still used in this new method, but can only call Schedule_ and Fork_ functions for running tasks. These methods define serial and parallel behavior respectively that is to be run across the ECS (as should already be familiar). Crucially, each relevant entity allocation now gets its own task - the filter is run when the task graph is constructed, and a new task is created for each match. This allows us to interleave and/or distribute tasks across as many cores as possible, as soon as prerequisites are completed.

Tasks may also 'prelock' their component data - doing so will cache the location of the component data for each task (using a new type, TRelativePtr) so that it doesn't have to go hunting for component headers when the task is run.

Implementation details:
    IMovieSceneTaskScheduler exists as the public front-end to the new routines, but allows us to keep all the implementation details private.

    Tasks can be in one of two states: a single task can have multiple prerequisites and subsequents, a parent task can have many children which must be complete in order for the parent to be considered complete. This is used for depending on the results of forked and serial tasks that may be spawned multiple times.

    When constructing the graph, we keep track of the read and write dependencies for each component type within each allocation. When a task reads from a component it must first depend on any tasks that write to the same component on the same allocation. When a task writes to a component it must depend on all upstream read and write dependencies for that component, on that allocation.

    Moved TSparseBitSet to UE::MovieScene so I can use it for task dependencies

    Introduced TRelativePtr which allows storage of pointers relative to another pointer using a smaller type than a raw ptr would, and isn't invalidated like a raw ptr would be if is pointing to an element in a dynamic array.
    This is used for our prelocked component data, but may have uses elsewhere. Note that this is not a TRelativePtr that is relative to 'this' like some other relative pointer implementations (though one could easily be written that uses this implementation if necessary.

#rb Ludovic.Chabant, Max.Chen
#preflight 646e782e64351d76f3c508a2

[CL 25644373 by max chen in ue5-main branch]
2023-05-26 12:04:49 -04:00
Patrick Boutot
abd2be3706 Slate: Deprecate the SListView functions that managed the item in the STreeView. User should use the RootItem version instead.
#rb yohann.dossantos
#preflight 6463ce842d446eac965feb48

[CL 25505361 by Patrick Boutot in ue5-main branch]
2023-05-17 08:51:13 -04:00