Skip to content

Instantly share code, notes, and snippets.

@murilopolese
Created May 31, 2020 11:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save murilopolese/12bafde4cd8ec490025c4ebfab779a5e to your computer and use it in GitHub Desktop.
Save murilopolese/12bafde4cd8ec490025c4ebfab779a5e to your computer and use it in GitHub Desktop.
Simple Keyframe/Timeline implementation
function KeyFrame({value, handles=[]}) {
this.value = value
this.handles = []
this.handles[0] = handles[0] || createVector(0, 0) // future
this.handles[1] = handles[1] || createVector(0, 0) // past
}
function Timeline(size) {
this.frames = []
this.size = size
for (let i = 0; i < this.size; i++) {
frames[i] = null
}
this.addKeyFrame = function(frame, keyFrame) {
this.frames[frame] = keyFrame
}
this.getPreviousKeyFrame = function(frame) {
let previous = null
let i
for (i = frame; i >= 0; i--) {
let frame = this.frames[i]
if (frame) {
previous = frame
break
}
}
return { index: i, frame: previous }
}
this.getNextKeyFrame = function(frame) {
let next = null
let i
for (i = frame+1; i < this.frames.length; i++) {
let frame = this.frames[i]
if (frame) {
next = frame
break
}
}
return { index: i, frame: next }
}
this.getValue = function(frame) {
let previous = this.getPreviousKeyFrame(frame)
let next = this.getNextKeyFrame(frame)
let previousFrame = previous.frame
let nextFrame = next.frame
if (!previousFrame) return null
if (!nextFrame) return previousFrame.value
let t = map(
frame,
previous.index, next.index,
0, 1
)
return bezierPoint(
previousFrame.value,
previousFrame.value +
previousFrame.handles[0].y,
nextFrame.value +
nextFrame.handles[1].y,
nextFrame.value,
t
)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment