Track Types Overview
Texturge’s Sequencer integration stores UGlyphAnimation keyframe curves through dedicated track types. The track system is defined in Plugins/Texturge/Source/Texturge/Public/Animation/Tracks/.
Track Class Overview
| Class | Base class | Description |
|---|---|---|
UMovieSceneGlyphAnimationTrack | UMovieSceneNameableTrack | glyph animation main track, manages multiple typed sub-tracks |
UMovieSceneGlyphAnimationSection | UMovieSceneSection | sub-track section, one per track type |
UMovieSceneTextAnimationSection | — | type alias (using = UMovieSceneGlyphAnimationSection), legacy asset serialization compatibility only |
FTextAnimationSubTrackData | USTRUCT | sub-track data (track type + display name + Float channel array) |
FTextAnimationTrack | USTRUCT | legacy track type (@deprecated, kept for compatibility) |
ETextAnimationTrackType | UENUM | track type identifier (10 types) |
UMovieSceneGlyphAnimationTrack
The main track class carrying all of UGlyphAnimation’s sub-tracks:
- Internally holds a
Sectionsarray (eachUMovieSceneGlyphAnimationSectioncorresponds to a sub-track of one track type) plus a hiddenLayoutHelperlayout helper section AddSubTrack(ETextAnimationTrackType, FName)/RemoveSubTrack(int32)— add / remove typed sub-tracksSupportsMultipleRows()returnstrue; each sub-track occupies its own rowGetLocalizedSubTrackDisplayName(FName)— localized sub-track display namesRenumberRows/SyncLayoutHelper— internal row renumbering and layout helper maintenance
UMovieSceneGlyphAnimationSection
Sub-track section whose core data is FTextAnimationSubTrackData SubTrack:
SetSubTrackData(ETextAnimationTrackType, const FName&)— set the sub-track type and display nameGetSubTrackDataMutable()— mutable access (curve editing)CacheChannelProxy()— registersChannelsinto the Sequencer channel proxy (keyframe editing entry)LinkedTrackId(FGuid) — link identifier to the legacy text animation track
NOTE
UMovieSceneTextAnimationSectionis a using type alias ofUMovieSceneGlyphAnimationSectionin the source (MovieSceneTextAnimationSection.hcontains only this declaration), kept for deserializing legacy assets. New code usesUMovieSceneGlyphAnimationSectiondirectly.
Sub-Track Data Structure
FTextAnimationSubTrackData stores 1–4 FMovieSceneFloatChannels per track type:
| Track type | Channels | Channel suffixes | Default key value |
|---|---|---|---|
Opacity | 1 | (none) | 1.0 |
LetterSpacing | 1 | (none) | 0.0 |
Rotation | 1 | (none) | 0.0 |
Translation | 2 | X / Y | 0.0 |
Scale | 2 | X / Y | 1.0 |
Shear | 2 | X / Y | 0.0 |
Pivot | 2 | X / Y | 0.5 |
ShadowOffset | 2 | X / Y | 0.0 |
Color | 4 | R / G / B / A | 1.0 |
ShadowColor | 4 | R / G / B / A | 0.0 |
The channel count is determined by FTextAnimationSubTrackData::GetChannelCount(ETextAnimationTrackType) (Float→1, Vector2D→2, Color→4).
Animation Channels (21 Channels)
The 10 track types expand into 21 curve channels, corresponding to FPerLayerCurves’s 21 TArray<FRichCurveKey>s and the properties of FGlyphAnimationState:
Transform (3 Float + 10 Vector2D components)
| Track type | Channels | State property | Description |
|---|---|---|---|
Opacity | Curve_Opacity | Opacity | opacity (default 1.0) |
LetterSpacing | Curve_LetterSpacing | LetterSpacing | letter spacing (pixels) |
Rotation | Curve_Rotation | Rotation | rotation (degrees) |
Translation | Curve_TranslationX / Y | PositionOffset.X / Y | position offset (pixels) |
Scale | Curve_ScaleX / Y | Scale.X / Y | scale (default 1.0) |
Shear | Curve_ShearX / Y | Shear.X / Y | shear transform |
Pivot | Curve_PivotX / Y | Pivot.X / Y | pivot (default 0.5) |
ShadowOffset | Curve_ShadowOffsetX / Y | ShadowOffset.X / Y | shadow offset (pixels) |
Color (8 Color components)
| Track type | Channels | State property | Description |
|---|---|---|---|
Color | Curve_ColorR / G / B / A | Color.R / G / B / A | tint: RGB = tint color, A = tint share (0–1) |
ShadowColor | Curve_ShadowColorR / G / B / A | ShadowColor.R / G / B / A | shadow color |
NOTE
Color.Ain channels is the tint share, not opacity — the identity value is Transparent (0,0,0,0); untinted channels do not participate in multiplication (always-0 would break multiply blending; the evaluator uses additive stacking instead). Glyph opacity is controlled separately by theOpacitychannel.
Curve Extraction
UGlyphAnimation keyframe curves are extracted during baking:
| Function | Description |
|---|---|
FAnimationCompiler::ExtractCurves(const UGlyphAnimation*) | extracts and returns FGlyphCurveSet (21 FRichCurves) |
FAnimationCompiler::ExtractCurvesRef(const UGlyphAnimation*) | zero-copy reference extraction (UGlyphAnimation internally caches CachedExtractedCurves + fingerprint) |
Extraction caches on GetSignature() of all Tracks/Sections in the MovieScene — Sequencer edits only update Section signatures, so all sub-objects must be traversed (see”Bake Pipeline”).
Timing Modes
Playback timing is controlled by UTextAnimator’s EPlaybackMode (tracks carry no timing mode):
| Mode | Description |
|---|---|
Duration | uniform playback over the total duration |
CPS | driven by glyphs revealed per second, CPS floor 1.0 |
Track Editor
FGlyphAnimationTrackEditor (TexturgeEditor module, Private/TrackEditors directory) extends FMovieSceneTrackEditor:
- Renders glyph animation tracks and typed sub-tracks in the Sequencer UI
- Handles sub-track section creation, dragging, and resizing
- The static callback
OnSubTrackAddedToSequencer(ETextAnimationTrackType)syncs new sub-tracks back to the Blueprint - Available in editor builds only; not packaged into runtime
Play Direction
EPlayMode defines the layer-level play direction (FPerLayerCurves::PlayDirection):
| Enum value | Description |
|---|---|
Forward | forward playback |
Reverse | reverse playback |
PingPong | alternating forward/reverse playback |
EStagePlayDirection offers the same three options at stage granularity (UTextAnimationStageController). Loop count is controlled independently by FPerLayerCurves::NumberOfLoops (0 = infinite loop).