2 * @author sole / http://soledadpenades.com
3 * @author mrdoob / http://mrdoob.com
4 * @author Robert Eisele / http://www.xarg.org
5 * @author Philippe / http://philippe.elsass.me
6 * @author Robert Penner / http://www.robertpenner.com/easing_terms_of_use.html
7 * @author Paul Lewis / http://www.aerotwist.com/
8 * @author lechecacharro
9 * @author Josh Faul / http://jocafa.com/
10 * @author egraether / http://egraether.com/
11 * @author endel / http://endel.me
12 * @author Ben Delarre / http://delarre.net
15 // Date.now shim for (ahem) Internet Explo(d|r)er
16 if ( Date.now === undefined ) {
18 Date.now = function () {
20 return new Date().valueOf();
26 var TWEEN = TWEEN || ( function () {
40 removeAll: function () {
46 add: function ( tween ) {
48 _tweens.push( tween );
52 remove: function ( tween ) {
54 var i = _tweens.indexOf( tween );
58 _tweens.splice( i, 1 );
64 update: function ( time ) {
66 if ( _tweens.length === 0 ) return false;
70 time = time !== undefined ? time : ( typeof window !== 'undefined' && window.performance !== undefined && window.performance.now !== undefined ? window.performance.now() : Date.now() );
72 while ( i < _tweens.length ) {
74 if ( _tweens[ i ].update( time ) ) {
80 _tweens.splice( i, 1 );
93 TWEEN.Tween = function ( object ) {
96 var _valuesStart = {};
98 var _valuesStartRepeat = {};
102 var _isPlaying = false;
103 var _reversed = false;
105 var _startTime = null;
106 var _easingFunction = TWEEN.Easing.Linear.None;
107 var _interpolationFunction = TWEEN.Interpolation.Linear;
108 var _chainedTweens = [];
109 var _onStartCallback = null;
110 var _onStartCallbackFired = false;
111 var _onUpdateCallback = null;
112 var _onCompleteCallback = null;
114 // Set all starting values present on the target object
115 for ( var field in object ) {
117 _valuesStart[ field ] = parseFloat(object[field], 10);
121 this.to = function ( properties, duration ) {
123 if ( duration !== undefined ) {
125 _duration = duration;
129 _valuesEnd = properties;
135 this.start = function ( time ) {
141 _onStartCallbackFired = false;
143 _startTime = time !== undefined ? time : ( typeof window !== 'undefined' && window.performance !== undefined && window.performance.now !== undefined ? window.performance.now() : Date.now() );
144 _startTime += _delayTime;
146 for ( var property in _valuesEnd ) {
148 // check if an Array was provided as property value
149 if ( _valuesEnd[ property ] instanceof Array ) {
151 if ( _valuesEnd[ property ].length === 0 ) {
157 // create a local copy of the Array with the start value at the front
158 _valuesEnd[ property ] = [ _object[ property ] ].concat( _valuesEnd[ property ] );
162 _valuesStart[ property ] = _object[ property ];
164 if( ( _valuesStart[ property ] instanceof Array ) === false ) {
165 _valuesStart[ property ] *= 1.0; // Ensures we're using numbers, not strings
168 _valuesStartRepeat[ property ] = _valuesStart[ property ] || 0;
176 this.stop = function () {
182 TWEEN.remove( this );
184 this.stopChainedTweens();
189 this.stopChainedTweens = function () {
191 for ( var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++ ) {
193 _chainedTweens[ i ].stop();
199 this.delay = function ( amount ) {
206 this.repeat = function ( times ) {
213 this.yoyo = function( yoyo ) {
221 this.easing = function ( easing ) {
223 _easingFunction = easing;
228 this.interpolation = function ( interpolation ) {
230 _interpolationFunction = interpolation;
235 this.chain = function () {
237 _chainedTweens = arguments;
242 this.onStart = function ( callback ) {
244 _onStartCallback = callback;
249 this.onUpdate = function ( callback ) {
251 _onUpdateCallback = callback;
256 this.onComplete = function ( callback ) {
258 _onCompleteCallback = callback;
263 this.update = function ( time ) {
267 if ( time < _startTime ) {
273 if ( _onStartCallbackFired === false ) {
275 if ( _onStartCallback !== null ) {
277 _onStartCallback.call( _object );
281 _onStartCallbackFired = true;
285 var elapsed = ( time - _startTime ) / _duration;
286 elapsed = elapsed > 1 ? 1 : elapsed;
288 var value = _easingFunction( elapsed );
290 for ( property in _valuesEnd ) {
292 var start = _valuesStart[ property ] || 0;
293 var end = _valuesEnd[ property ];
295 if ( end instanceof Array ) {
297 _object[ property ] = _interpolationFunction( end, value );
301 // Parses relative end values with start as base (e.g.: +10, -3)
302 if ( typeof(end) === "string" ) {
303 end = start + parseFloat(end, 10);
306 // protect against non numeric properties.
307 if ( typeof(end) === "number" ) {
308 _object[ property ] = start + ( end - start ) * value;
315 if ( _onUpdateCallback !== null ) {
317 _onUpdateCallback.call( _object, value );
321 if ( elapsed == 1 ) {
325 if( isFinite( _repeat ) ) {
329 // reassign starting values, restart by making startTime = now
330 for( property in _valuesStartRepeat ) {
332 if ( typeof( _valuesEnd[ property ] ) === "string" ) {
333 _valuesStartRepeat[ property ] = _valuesStartRepeat[ property ] + parseFloat(_valuesEnd[ property ], 10);
337 var tmp = _valuesStartRepeat[ property ];
338 _valuesStartRepeat[ property ] = _valuesEnd[ property ];
339 _valuesEnd[ property ] = tmp;
340 _reversed = !_reversed;
342 _valuesStart[ property ] = _valuesStartRepeat[ property ];
346 _startTime = time + _delayTime;
352 if ( _onCompleteCallback !== null ) {
354 _onCompleteCallback.call( _object );
358 for ( var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++ ) {
360 _chainedTweens[ i ].start( time );
381 None: function ( k ) {
397 Out: function ( k ) {
399 return k * ( 2 - k );
403 InOut: function ( k ) {
405 if ( ( k *= 2 ) < 1 ) return 0.5 * k * k;
406 return - 0.5 * ( --k * ( k - 2 ) - 1 );
420 Out: function ( k ) {
422 return --k * k * k + 1;
426 InOut: function ( k ) {
428 if ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k;
429 return 0.5 * ( ( k -= 2 ) * k * k + 2 );
439 return k * k * k * k;
443 Out: function ( k ) {
445 return 1 - ( --k * k * k * k );
449 InOut: function ( k ) {
451 if ( ( k *= 2 ) < 1) return 0.5 * k * k * k * k;
452 return - 0.5 * ( ( k -= 2 ) * k * k * k - 2 );
462 return k * k * k * k * k;
466 Out: function ( k ) {
468 return --k * k * k * k * k + 1;
472 InOut: function ( k ) {
474 if ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k * k * k;
475 return 0.5 * ( ( k -= 2 ) * k * k * k * k + 2 );
485 return 1 - Math.cos( k * Math.PI / 2 );
489 Out: function ( k ) {
491 return Math.sin( k * Math.PI / 2 );
495 InOut: function ( k ) {
497 return 0.5 * ( 1 - Math.cos( Math.PI * k ) );
507 return k === 0 ? 0 : Math.pow( 1024, k - 1 );
511 Out: function ( k ) {
513 return k === 1 ? 1 : 1 - Math.pow( 2, - 10 * k );
517 InOut: function ( k ) {
519 if ( k === 0 ) return 0;
520 if ( k === 1 ) return 1;
521 if ( ( k *= 2 ) < 1 ) return 0.5 * Math.pow( 1024, k - 1 );
522 return 0.5 * ( - Math.pow( 2, - 10 * ( k - 1 ) ) + 2 );
532 return 1 - Math.sqrt( 1 - k * k );
536 Out: function ( k ) {
538 return Math.sqrt( 1 - ( --k * k ) );
542 InOut: function ( k ) {
544 if ( ( k *= 2 ) < 1) return - 0.5 * ( Math.sqrt( 1 - k * k) - 1);
545 return 0.5 * ( Math.sqrt( 1 - ( k -= 2) * k) + 1);
555 var s, a = 0.1, p = 0.4;
556 if ( k === 0 ) return 0;
557 if ( k === 1 ) return 1;
558 if ( !a || a < 1 ) { a = 1; s = p / 4; }
559 else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );
560 return - ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) );
564 Out: function ( k ) {
566 var s, a = 0.1, p = 0.4;
567 if ( k === 0 ) return 0;
568 if ( k === 1 ) return 1;
569 if ( !a || a < 1 ) { a = 1; s = p / 4; }
570 else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );
571 return ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );
575 InOut: function ( k ) {
577 var s, a = 0.1, p = 0.4;
578 if ( k === 0 ) return 0;
579 if ( k === 1 ) return 1;
580 if ( !a || a < 1 ) { a = 1; s = p / 4; }
581 else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );
582 if ( ( k *= 2 ) < 1 ) return - 0.5 * ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) );
583 return a * Math.pow( 2, -10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) * 0.5 + 1;
594 return k * k * ( ( s + 1 ) * k - s );
598 Out: function ( k ) {
601 return --k * k * ( ( s + 1 ) * k + s ) + 1;
605 InOut: function ( k ) {
607 var s = 1.70158 * 1.525;
608 if ( ( k *= 2 ) < 1 ) return 0.5 * ( k * k * ( ( s + 1 ) * k - s ) );
609 return 0.5 * ( ( k -= 2 ) * k * ( ( s + 1 ) * k + s ) + 2 );
619 return 1 - TWEEN.Easing.Bounce.Out( 1 - k );
623 Out: function ( k ) {
625 if ( k < ( 1 / 2.75 ) ) {
627 return 7.5625 * k * k;
629 } else if ( k < ( 2 / 2.75 ) ) {
631 return 7.5625 * ( k -= ( 1.5 / 2.75 ) ) * k + 0.75;
633 } else if ( k < ( 2.5 / 2.75 ) ) {
635 return 7.5625 * ( k -= ( 2.25 / 2.75 ) ) * k + 0.9375;
639 return 7.5625 * ( k -= ( 2.625 / 2.75 ) ) * k + 0.984375;
645 InOut: function ( k ) {
647 if ( k < 0.5 ) return TWEEN.Easing.Bounce.In( k * 2 ) * 0.5;
648 return TWEEN.Easing.Bounce.Out( k * 2 - 1 ) * 0.5 + 0.5;
656 TWEEN.Interpolation = {
658 Linear: function ( v, k ) {
660 var m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.Linear;
662 if ( k < 0 ) return fn( v[ 0 ], v[ 1 ], f );
663 if ( k > 1 ) return fn( v[ m ], v[ m - 1 ], m - f );
665 return fn( v[ i ], v[ i + 1 > m ? m : i + 1 ], f - i );
669 Bezier: function ( v, k ) {
671 var b = 0, n = v.length - 1, pw = Math.pow, bn = TWEEN.Interpolation.Utils.Bernstein, i;
673 for ( i = 0; i <= n; i++ ) {
674 b += pw( 1 - k, n - i ) * pw( k, i ) * v[ i ] * bn( n, i );
681 CatmullRom: function ( v, k ) {
683 var m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.CatmullRom;
685 if ( v[ 0 ] === v[ m ] ) {
687 if ( k < 0 ) i = Math.floor( f = m * ( 1 + k ) );
689 return fn( v[ ( i - 1 + m ) % m ], v[ i ], v[ ( i + 1 ) % m ], v[ ( i + 2 ) % m ], f - i );
693 if ( k < 0 ) return v[ 0 ] - ( fn( v[ 0 ], v[ 0 ], v[ 1 ], v[ 1 ], -f ) - v[ 0 ] );
694 if ( k > 1 ) return v[ m ] - ( fn( v[ m ], v[ m ], v[ m - 1 ], v[ m - 1 ], f - m ) - v[ m ] );
696 return fn( v[ i ? i - 1 : 0 ], v[ i ], v[ m < i + 1 ? m : i + 1 ], v[ m < i + 2 ? m : i + 2 ], f - i );
704 Linear: function ( p0, p1, t ) {
706 return ( p1 - p0 ) * t + p0;
710 Bernstein: function ( n , i ) {
712 var fc = TWEEN.Interpolation.Utils.Factorial;
713 return fc( n ) / fc( i ) / fc( n - i );
717 Factorial: ( function () {
721 return function ( n ) {
724 if ( a[ n ] ) return a[ n ];
725 for ( i = n; i > 1; i-- ) s *= i;
732 CatmullRom: function ( p0, p1, p2, p3, t ) {
734 var v0 = ( p2 - p0 ) * 0.5, v1 = ( p3 - p1 ) * 0.5, t2 = t * t, t3 = t * t2;
735 return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;