Closed TheNachoBIT closed 2 months ago
Seems like a useful utility. I think it would be good to look at using ratios for framerates rather than floats; common framerates exist based on exact 1000/1001 fractions of a framerate. (i.e. 23.976 [1000/1001 × 24] vs 24)
I use floats so the translation and compatibility between framerates like 23.679 and Durations, Instants and other values is more easier to deal with (atm). But maybe ratio-based framerates can fix other headaches in the future that i'm not aware of lol
I think i figured out how the ratios work, once i'm available i'll give them a try :D
I'm gonna try rebasing this, which it'll probably delete the current repo (and therefor, this PR). Wish me luck :')
I'm making this a draft for now, this PR is to document the progress i've been making so far with this experiment.
This experiment can also fail. If you see any kind of flaw, please feel free to point it out.
The final goals of this (if succeeds) are:
Progress.
isize
instead off64
).as_string()
prettier (print out '00:00:00:00' instead of '0:0:0:0').SMPTE Timecodes (Update 2).
SMPTE Timecodes are time units that are set like a clock: HH:MM:SS:FF (Hours, Minutes, Seconds, Frames).
For convenience, there's a macro that helps visualize this concept better in code:
~(Sadly, Rust's macros don't allow me to use ":" so i have to use ";" instead, if there's a workaround for this, please let me know)~
EDIT: I fixed it!
Timecodes can be used as a Timestamp, or as a value for a Timeline, by setting the Framerate:
There's
Framerate::Fixed(n)
andFramerate::Interpolated(n)
. Once Timelines become a thing, fixed framerates will round up to the nearest frame when the tween is calculated, which will be useful for frame-by-frame animations. Interpolated frames on the other hand, will interpolate regardless of the framerate you're running (unless you explicitly set "hold" frames).Timecodes with a framerate can advance and reverse by frames, seconds, minutes, hours and use
Duration
(Instant
coming soon).Example: Play one second frame-by-frame.
Example: Add by Duration.
Example: Sub by Duration.
The draft repository contains more examples in form of tests inside of
lib.rs
.This is all of the progress for now, for any questions, please feel free to ask :)