Skip to content

Common easing and interpolation functions for game development.

License

Notifications You must be signed in to change notification settings

Games-by-Mason/Tween

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Tween

Rigid motion often appears unnatural. This library provides easing and interpolation functions widely used in game development to create natural looking or stylized tweens ("inbetweens").

Example usage:

const tween = @import("tween");
const lerp = tween.interp.lerp;
const ease = tween.ease;

// ...

pos = lerp(start, end, ease.bounceOut(t));

Interpolation

The following interpolation functions are provided:

  • lerp
  • ilerp
  • remap
  • clamp01
  • damp

Linear interpolation differs from the implementation in the standard library in that it returns exact results at 0 and 1.

Additionally, it accepts a larger variety of types:

  • Floats
  • Vectors
  • Arrays
  • Structures containing other supported types

ilerp is the inverse of lerp, and only accepts floats. remap uses a combination of ilerp and lerp to remap a value from one range to another.

clamp01 is what it sounds like, and is provided for convenience. You can apply it to a t value getting passed to lerp to create a clamped lerp.

damp is useful for framerate independent lerping.

If you're unfamiliar with this class of functions, I recommend viewing The Simple Yet Powerful Math We Don't Talk About by Freya Holmer.

Ease

The following easing functions are supported, most of these originated with Robert Penner:

I've opted to not include GIFs demonstrating the easing styles here, as easings.net already has a great visualizer for almost all of these.

(Note that the links above are provided for convenient reference, the actual implementations may not be 100% identical or may have slightly different parameters.)

In, out, and in-out variations of each are provided, functions are exact at 0 and 1 for 32 bit floats unless otherwise noted.

Easing functions operate on the t value given to lerp. For example:

const result = lerp(a, b, ease.smootherstep(t));

If you're new to easing and not sure which to use, smootherstep is a reasonable default to slap on everything to start.

You can adapt easing functions with mix, combine, reflect, and reverse.

The provided easing functions are exact at 0 and 1 for 32 bit floats unless otherwise noted.

When designing your own easing functions, I highly recommend testing them in Desmos.

Build Configuration

If you're shipping binaries, you probably have a min spec CPU in mind. I recommend making sure muladd is enabled for your baseline so it doesn't end up getting emulated in software, more info here. On x86 this means enabling fma, on arm/aarch64 this means enabling either neon or vfp4.

About

Common easing and interpolation functions for game development.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages