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.
165 lines
7.4 KiB
CoffeeScript
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
|
|
|