Time is evaluation, not a widget¶
Workbench separates four ideas that small tools often combine:
TimeValue (coordinate + units/second)
!= TimeRange (descriptive domain)
!= TimeTransport (playback policy)
!= TimelineWidget (user interaction)
TimeValue uses a floating-point coordinate and rate, allowing subframes and
external time codes. Conversion through seconds preserves meaning across rates.
TimeRange has start and duration and does not clamp evaluation.
TimeContext owns only the current sample, delta, and monotonically increasing
evaluation index. The index distinguishes repeated evaluations at the same time.
It has no playing state, loop mode, or range. TimeTransport owns those policies:
deterministic seek/step and elapsed-seconds realtime advance both evaluate the same
context. TimelineWidget adapts buttons and a scrubber to the transport; it does
not own either model.
TimeTransport -> TimeContext -> active consumers
|
`-> host-managed miskeyed.time uniforms
Time changes upload reflected uniform values without changing shader identity or triggering compilation. This boundary lets a future USD time-code source, OTIO transport, offline renderer, simulation, or host DCC replace playback policy while consumers keep the same evaluation input.
Implementation¶
Relevant source is cpp/include/miskeyed/workbench/core/TimeContext.h,
TimeTransport.h, and cpp/src/workbench/ui/TimelineWidget.cpp.