You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
radium/radium/engine.ease.coffee

165 lines
7.4 KiB
CoffeeScript

Engine::ease =
_calculateElasticValues: (amplitude, period, change, inout = false) =>
if !period?
if inout
period = duration * (0.3 * 1.5)
else
period = duration * 0.3
if !amplitude? or amplitude < Math.abs(change)
amplitude = change
overshoot = period / 4
else
overshoot = period / (2 * Math.PI) * Math.asin(change / amplitude)
return [amplitude, period, change]
backIn: (start, end, duration, infinite = false, overshoot = 1.70158) =>
return new Ease("backIn", infinite, start, end, @current_frame, duration, overshoot)
backOut: (start, end, duration, infinite = false, overshoot = 1.70158) =>
return new Ease("backOut", infinite, start, end, @current_frame, duration, overshoot)
backInOut: (start, end, duration, infinite = false, overshoot = 1.70158) =>
return new Ease("backInOut", infinite, start, end, @current_frame, duration, overshoot)
bounceOut: (start, end, duration, infinite = false) =>
return new Ease("bounceOut", infinite, start, end, @current_frame, duration)
bounceIn: (start, end, duration, infinite = false) =>
return new Ease("bounceIn", infinite, start, end, @current_frame, duration)
bounceInOut: (start, end, duration, infinite = false) =>
return new Ease("bounceInOut", infinite, start, end, @current_frame, duration)
circOut: (start, end, duration, infinite = false) =>
return new Ease("circOut", infinite, start, end, @current_frame, duration)
circIn: (start, end, duration, infinite = false) =>
return new Ease("circIn", infinite, start, end, @current_frame, duration)
circInOut: (start, end, duration, infinite = false) =>
return new Ease("circInOut", infinite, start, end, @current_frame, duration)
cubicOut: (start, end, duration, infinite = false) =>
return new Ease("cubicOut", infinite, start, end, @current_frame, duration)
cubicIn: (start, end, duration, infinite = false) =>
return new Ease("cubicIn", infinite, start, end, @current_frame, duration)
cubicInOut: (start, end, duration, infinite = false) =>
return new Ease("cubicInOut", infinite, start, end, @current_frame, duration)
elasticOut: (start, end, duration, infinite = false, amplitude = null, period = null) =>
[amplitude, period, change] = @_calculateElasticValues(amplitude, period, end - start)
end = start + change
return new Ease("elasticOut", infinite, start, end, @current_frame, duration)
elasticIn: (start, end, duration, infinite = false, amplitude = null, period = null) =>
[amplitude, period, change] = @_calculateElasticValues(amplitude, period, end - start)
end = start + change
return new Ease("elasticIn", infinite, start, end, @current_frame, duration)
elasticInOut: (start, end, duration, infinite = false, amplitude = null, period = null) =>
[amplitude, period, change] = @_calculateElasticValues(amplitude, period, end - start, true)
end = start + change
return new Ease("elasticInOut", infinite, start, end, @current_frame, duration)
expoOut: (start, end, duration, infinite = false) =>
return new Ease("expoOut", infinite, start, end, @current_frame, duration)
expoIn: (start, end, duration, infinite = false) =>
return new Ease("expoIn", infinite, start, end, @current_frame, duration)
expoInOut: (start, end, duration, infinite = false) =>
return new Ease("expoInOut", infinite, start, end, @current_frame, duration)
linearNone: (start, end, duration, infinite = false) =>
return new Ease("linearNone", infinite, start, end, @current_frame, duration)
linearOut: (start, end, duration, infinite = false) =>
return new Ease("linearNone", infinite, start, end, @current_frame, duration)
linearIn: (start, end, duration, infinite = false) =>
return new Ease("linearNone", infinite, start, end, @current_frame, duration)
linearInOut: (start, end, duration, infinite = false) =>
return new Ease("linearNone", infinite, start, end, @current_frame, duration)
quadOut: (start, end, duration, infinite = false) =>
return new Ease("quadOut", infinite, start, end, @current_frame, duration)
quadIn: (start, end, duration, infinite = false) =>
return new Ease("quadIn", infinite, start, end, @current_frame, duration)
quadInOut: (start, end, duration, infinite = false) =>
return new Ease("quadInOut", infinite, start, end, @current_frame, duration)
quartOut: (start, end, duration, infinite = false) =>
return new Ease("quartOut", infinite, start, end, @current_frame, duration)
quartIn: (start, end, duration, infinite = false) =>
return new Ease("quartIn", infinite, start, end, @current_frame, duration)
quartInOut: (start, end, duration, infinite = false) =>
return new Ease("quartInOut", infinite, start, end, @current_frame, duration)
sineOut: (start, end, duration, infinite = false) =>
return new Ease("sineOut", infinite, start, end, @current_frame, duration)
sineIn: (start, end, duration, infinite = false) =>
return new Ease("sineIn", infinite, start, end, @current_frame, duration)
sineInOut: (start, end, duration, infinite = false) =>
return new Ease("sineInOut", infinite, start, end, @current_frame, duration)
class Ease
# Port based on https://github.com/jimjeffers/Easie. I don't think this qualifies as a "bad thing" :)
constructor: (type, @infinite, @start, end, @start_frame, @duration, @params...) ->
@func = this[type]
@change = end - @start
@value = @start
@finished = false
# TODO: Investigate whether JS engines cache deterministic outcomes by themselves. If not,
# the below could provide some performance gain.
#@bounce_constant_1 = 1 / 2.75
#@bounce_constant_2 = 2 / 2.75
#@bounce_constant_3 = 2.5 / 2.75
updateValue: (current_frame) =>
@value = @func(current_frame - @start_frame)
backIn: (time) =>
time = time / @duration
overshoot = @params[0]
return @change * time * time * ((overshoot + 1) * time - overshoot) + @start
backOut: (time) =>
time = time / @duration - 1
overshoot = @params[0]
return @change * (time * time * ((overshoot + 1) * time + overshoot) + 1) + @start
backInOut: (time) =>
time = time / (@duration / 2)
overshoot = @params[0] * 1.525
if time < 1
return @change / 2 * (time * time * ((overshoot + 1) * time - overshoot)) + @start
else
time -= 2
return @change / 2 * (time * time * ((overshoot + 1) * time + overshoot) + 2) + @start
bounceOut: (time, start = null) =>
time = time / @duration
start = start ? @start
if time < 1 / 2.75
return @change * (7.5625 * time * time) + start
else if time < 2 / 2.75
time = time - (1.5 / 2.75)
return @change * (7.5625 * time * time + 0.75) + start
else if time < 2.5 / 2.75
time = time - (2.25 / 2.75)
return @change * (7.5625 * time * time + 0.9375) + start
else
time = time - (2.625 / 2.75)
return @change * (7.5625 * time * time + 0.984375) + start
bounceIn: (time, start = null) =>
start = start ? @start
return @change - @bounceOut(@duration - time, 0) + start
bounceInOut: (time) =>
if time < @duration / 2
return @bounceIn(time * 2, 0) + @start
else
return @bounceOut(time * 2 - @duration, 0) + @start
circIn: (time) =>
time = time / @duration
return -@change * (Math.sqrt(1 - time * time) - 1) + @start
circOut: (time) =>
time = time / @duration - 1
return @change * Math.sqrt(1 - time * time) + @start
circInOut: (time) =>
time = time / (@duration / 2)
if time < 1
return -@change / 2 * (Math.sqrt(1 - time * time) - 1) + @start
else
time = time - 2
return @change / 2 * (Math.sqrt(1 - time * time) + 1) + @begin