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

ClassBase classDescription
UMovieSceneGlyphAnimationTrackUMovieSceneNameableTrackglyph animation main track, manages multiple typed sub-tracks
UMovieSceneGlyphAnimationSectionUMovieSceneSectionsub-track section, one per track type
UMovieSceneTextAnimationSectiontype alias (using = UMovieSceneGlyphAnimationSection), legacy asset serialization compatibility only
FTextAnimationSubTrackDataUSTRUCTsub-track data (track type + display name + Float channel array)
FTextAnimationTrackUSTRUCTlegacy track type (@deprecated, kept for compatibility)
ETextAnimationTrackTypeUENUMtrack type identifier (10 types)

UMovieSceneGlyphAnimationTrack

The main track class carrying all of UGlyphAnimation’s sub-tracks:

  • Internally holds a Sections array (each UMovieSceneGlyphAnimationSection corresponds to a sub-track of one track type) plus a hidden LayoutHelper layout helper section
  • AddSubTrack(ETextAnimationTrackType, FName) / RemoveSubTrack(int32) — add / remove typed sub-tracks
  • SupportsMultipleRows() returns true; each sub-track occupies its own row
  • GetLocalizedSubTrackDisplayName(FName) — localized sub-track display names
  • RenumberRows / 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 name
  • GetSubTrackDataMutable() — mutable access (curve editing)
  • CacheChannelProxy() — registers Channels into the Sequencer channel proxy (keyframe editing entry)
  • LinkedTrackId (FGuid) — link identifier to the legacy text animation track

NOTE

UMovieSceneTextAnimationSection is a using type alias of UMovieSceneGlyphAnimationSection in the source (MovieSceneTextAnimationSection.h contains only this declaration), kept for deserializing legacy assets. New code uses UMovieSceneGlyphAnimationSection directly.

Sub-Track Data Structure

FTextAnimationSubTrackData stores 1–4 FMovieSceneFloatChannels per track type:

Track typeChannelsChannel suffixesDefault key value
Opacity1(none)1.0
LetterSpacing1(none)0.0
Rotation1(none)0.0
Translation2 X / Y0.0
Scale2 X / Y1.0
Shear2 X / Y0.0
Pivot2 X / Y0.5
ShadowOffset2 X / Y0.0
Color4 R / G / B / A1.0
ShadowColor4 R / G / B / A0.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 typeChannelsState propertyDescription
OpacityCurve_OpacityOpacityopacity (default 1.0)
LetterSpacingCurve_LetterSpacingLetterSpacingletter spacing (pixels)
RotationCurve_RotationRotationrotation (degrees)
TranslationCurve_TranslationX / YPositionOffset.X / Yposition offset (pixels)
ScaleCurve_ScaleX / YScale.X / Yscale (default 1.0)
ShearCurve_ShearX / YShear.X / Yshear transform
PivotCurve_PivotX / YPivot.X / Ypivot (default 0.5)
ShadowOffsetCurve_ShadowOffsetX / YShadowOffset.X / Yshadow offset (pixels)

Color (8 Color components)

Track typeChannelsState propertyDescription
ColorCurve_ColorR / G / B / AColor.R / G / B / Atint: RGB = tint color, A = tint share (0–1)
ShadowColorCurve_ShadowColorR / G / B / AShadowColor.R / G / B / Ashadow color

NOTE

Color.A in 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 the Opacity channel.

Curve Extraction

UGlyphAnimation keyframe curves are extracted during baking:

FunctionDescription
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):

ModeDescription
Durationuniform playback over the total duration
CPSdriven 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 valueDescription
Forwardforward playback
Reversereverse playback
PingPongalternating forward/reverse playback

EStagePlayDirection offers the same three options at stage granularity (UTextAnimationStageController). Loop count is controlled independently by FPerLayerCurves::NumberOfLoops (0 = infinite loop).

images/sequencer-track-hierarchy.png — Sequencer screenshot: glyph animation track (UGlyphAnimation asset) expanded into typed sub-track rows (Opacity/Translation/Scale/Color), each with keyframes and FloatChannel curves, channel suffixes X/Y/R/G/B/A matching group names