Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SMPTE Timecodes & Timelines, Sequences and Keyframes. #22

Draft
wants to merge 29 commits into
base: main
Choose a base branch
from

Conversation

TheNachoBIT
Copy link
Contributor

@TheNachoBIT TheNachoBIT commented Sep 23, 2024

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:

  • Allow Interpoli to be more general-purpose, so it can be used for animation, video editing, motion graphics, videogames, sound design, etc.
  • Allow for both developers and people with expertise in other artistic areas to have the same concepts.
  • Allow for potential optimizations with interpolations at a large-scale (lots of characters being animated at once in a videogame, a big timeline that contains a lot of properties, etc.)

Progress.

  • Learn how to rebase this PR to upstream Interpoli.
  • Rebase.
  • SMPTE Timecodes (Basics).
    • Basics.
    • Make it run on full integers (frames being isize instead of f64).
    • Add syncronization based on nanoframes (to allow 23.97fps, 23.98fps, 29.97fps, ... to run properly).
    • Add '==' functionality (specially for asserts).
    • Make as_string() prettier (print out '00:00:00:00' instead of '0:0:0:0').
    • Jump to specific parts of the Timecode.
    • Add Utilities (will be useful for Timelines & Tweening).
  • Timelines (Basics).
    • Get basic time functionality.
    • Create new(...) functions.
    • Add Sequences to the mix.
    • Add Timeline Nesting
    • Add AnimationEngine for Tweening
    • Get Animated Values
  • Timelines (Extras).
  • Sequence (Basics).
    • Add tree functionality.
    • Get and/or create keyframes.
    • Be able to use it with all types available.
    • Add ways to get keyframes between timestamps.
    • Add multiple keyframe support.
  • Keyframes.
    • Basic storage functionality.
    • Add States. (Easing, Hold, etc.)
    • Add functions to make API easier.
    • Add more Items.
  • AnimationEngine (Basics).
    • Basic Tweening Functionality.
    • Add states.
  • SMPTE Timecodes (Extras)
    • Sync based on denominators (Get help from @xorgy for this).
    • Better utility implementations.
    • Search for edge-use cases.
  • For review approval
    • Fix errors and apply recommendations detected via clippy
    • Make sure to apply cargo fmt (i always forget about that command ;_;)

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:

tcode_hmsf!(01:23:45:01) // A timecode with Hours (h), Minutes (m), Seconds (s) and Frames (f).

(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:

tcode_hmsf_framerate!(00:01:02:56, Framerate::Fixed(20.0))

There's Framerate::Fixed(n) and Framerate::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.

let mut time = tcode_hmsf_framerate!(00:00:00:00, Framerate::Fixed(24.0));

for i in 0..24 {
    time.next_frame();
}

println!("{:?}", time.as_string()); // Outputs "00:00:01:00 (24.0)"

Example: Add by Duration.

use std::time::Duration;

let mut time = tcode_hmsf_framerate!(00:00:00:00, Framerate::Fixed(24.0));

time.add_by_duration(Duration::from_millis(999));

println!("{:?}", time.as_string()); // Outputs "00:00:00:23 (24.0)"

Example: Sub by Duration.

use std::time::Duration;

let mut time = tcode_hmsf_framerate!(01:00:00:00, Framerate::Fixed(24.0)); // 1 hour

time.sub_by_duration(Duration::from_secs(1800));

println!("{:?}", time.as_string()); // Outputs "00:30:00:00 (24.0)" (30 minutes)

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

@TheNachoBIT TheNachoBIT marked this pull request as draft September 23, 2024 13:37
@xorgy xorgy changed the title SMPTE Timecodes & Timelines, Layers and Keyframes. (Rebased) SMPTE Timecodes & Timelines, Layers and Keyframes. Sep 23, 2024
@TheNachoBIT TheNachoBIT changed the title SMPTE Timecodes & Timelines, Layers and Keyframes. SMPTE Timecodes & Timelines, Sequences and Keyframes. Sep 27, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant