topical media & game development

talk show tell print

mobile-query-three-plugins-iimminigame-examples-vendor-Tween.js / js



  

author: sole / soledadpenades.com
author: mr.doob / mrdoob.com
author: Robert Eisele / www.xarg.org
author: Philippe / philippe.elsass.me
author: Robert Penner / www.robertpenner.com/easing_terms_of_use.html
author: Paul Lewis / www.aerotwist.com/
author: lechecacharro
author: Josh Faul / jocafa.com/
author: egraether / egraether.com/

  
  
  var TWEEN = TWEEN || ( function () {
  
          var _tweens = [];
  
          return {
  
                  REVISION: '6',
  
                  getAll: function () {
  
                          return _tweens;
  
                  },
  
                  removeAll: function () {
  
                          _tweens = [];
  
                  },
  
                  add: function ( tween ) {
  
                          _tweens.push( tween );
  
                  },
  
                  remove: function ( tween ) {
  
                          var i = _tweens.indexOf( tween );
  
                          if ( i !== -1 ) {
  
                                  _tweens.splice( i, 1 );
  
                          }
  
                  },
  
                  update: function ( time ) {
  
                          var i = 0;
                          var num_tweens = _tweens.length;
                          var time = time !== undefined ? time : Date.now();
  
                          while ( i < num_tweens ) {
  
                                  if ( _tweens[ i ].update( time ) ) {
  
                                          i ++;
  
                                  } else {
  
                                          _tweens.splice( i, 1 );
                                          num_tweens --;
  
                                  }
  
                          }
  
                  }
  
          };
  
  } )();
  
  TWEEN.Tween = function ( object ) {
  
          var _object = object;
          var _valuesStart = {};
          var _valuesEnd = {};
          var _duration = 1000;
          var _delayTime = 0;
          var _startTime = null;
          var _easingFunction = TWEEN.Easing.Linear.None;
          var _interpolationFunction = TWEEN.Interpolation.Linear;
          var _chainedTween = null;
          var _onUpdateCallback = null;
          var _onCompleteCallback = null;
  
          this.to = function ( properties, duration ) {
  
                  if ( duration !== null ) {
  
                          _duration = duration;
  
                  }
  
                  _valuesEnd = properties;
  
                  return this;
  
          };
  
          this.start = function ( time ) {
  
                  TWEEN.add( this );
  
                  _startTime = time !== undefined ? time : Date.now();
                  _startTime += _delayTime;
  
                  for ( var property in _valuesEnd ) {
  
                          // This prevents the engine from interpolating null values
                          if ( _object[ property ] === null ) {
  
                                  continue;
  
                          }
  
                          // check if an Array was provided as property value
                          if ( _valuesEnd[ property ] instanceof Array ) {
  
                                  if ( _valuesEnd[ property ].length === 0 ) {
  
                                          continue;
  
                                  }
  
                                  // create a local copy of the Array with the start value at the front
                                  _valuesEnd[ property ] = [ _object[ property ] ].concat( _valuesEnd[ property ] );
  
                          }
  
                          _valuesStart[ property ] = _object[ property ];
  
                  }
  
                  return this;
  
          };
  
          this.stop = function () {
  
                  TWEEN.remove( this );
                  return this;
  
          };
  
          this.delay = function ( amount ) {
  
                  _delayTime = amount;
                  return this;
  
          };
  
          this.easing = function ( easing ) {
  
                  _easingFunction = easing;
                  return this;
  
          };
  
          this.interpolation = function ( interpolation ) {
  
                  _interpolationFunction = interpolation;
                  return this;
  
          };
  
          this.chain = function ( chainedTween ) {
  
                  _chainedTween = chainedTween;
                  return this;
  
          };
  
          this.onUpdate = function ( onUpdateCallback ) {
  
                  _onUpdateCallback = onUpdateCallback;
                  return this;
  
          };
  
          this.onComplete = function ( onCompleteCallback ) {
  
                  _onCompleteCallback = onCompleteCallback;
                  return this;
  
          };
  
          this.update = function ( time ) {
  
                  if ( time < _startTime ) {
  
                          return true;
  
                  }
  
                  var elapsed = ( time - _startTime ) / _duration;
                  elapsed = elapsed > 1 ? 1 : elapsed;
  
                  var value = _easingFunction( elapsed );
  
                  for ( var property in _valuesStart ) {
  
                          var start = _valuesStart[ property ];
                          var end = _valuesEnd[ property ];
  
                          if ( end instanceof Array ) {
  
                                  _object[ property ] = _interpolationFunction( end, value );
  
                          } else {
  
                                  _object[ property ] = start + ( end - start ) * value;
  
                          }
  
                  }
  
                  if ( _onUpdateCallback !== null ) {
  
                          _onUpdateCallback.call( _object, value );
  
                  }
  
                  if ( elapsed == 1 ) {
  
                          if ( _onCompleteCallback !== null ) {
  
                                  _onCompleteCallback.call( _object );
  
                          }
  
                          if ( _chainedTween !== null ) {
  
                                  _chainedTween.start();
  
                          }
  
                          return false;
  
                  }
  
                  return true;
  
          };
  
  };
  
  TWEEN.Easing = {
  
          Linear: {
  
                  None: function ( k ) {
  
                          return k;
  
                  }
  
          },
  
          Quadratic: {
  
                  In: function ( k ) {
  
                          return k * k;
  
                  },
  
                  Out: function ( k ) {
  
                          return k * ( 2 - k );
  
                  },
  
                  InOut: function ( k ) {
  
                          if ( ( k *= 2 ) < 1 ) return 0.5 * k * k;
                          return - 0.5 * ( --k * ( k - 2 ) - 1 );
  
                  }
  
          },
  
          Cubic: {
  
                  In: function ( k ) {
  
                          return k * k * k;
  
                  },
  
                  Out: function ( k ) {
  
                          return --k * k * k + 1;
  
                  },
  
                  InOut: function ( k ) {
  
                          if ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k;
                          return 0.5 * ( ( k -= 2 ) * k * k + 2 );
  
                  }
  
          },
  
          Quartic: {
  
                  In: function ( k ) {
  
                          return k * k * k * k;
  
                  },
  
                  Out: function ( k ) {
  
                          return 1 - --k * k * k * k;
  
                  },
  
                  InOut: function ( k ) {
  
                          if ( ( k *= 2 ) < 1) return 0.5 * k * k * k * k;
                          return - 0.5 * ( ( k -= 2 ) * k * k * k - 2 );
  
                  }
  
          },
  
          Quintic: {
  
                  In: function ( k ) {
  
                          return k * k * k * k * k;
  
                  },
  
                  Out: function ( k ) {
  
                          return --k * k * k * k * k + 1;
  
                  },
  
                  InOut: function ( k ) {
  
                          if ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k * k * k;
                          return 0.5 * ( ( k -= 2 ) * k * k * k * k + 2 );
  
                  }
  
          },
  
          Sinusoidal: {
  
                  In: function ( k ) {
  
                          return 1 - Math.cos( k * Math.PI / 2 );
  
                  },
  
                  Out: function ( k ) {
  
                          return Math.sin( k * Math.PI / 2 );
  
                  },
  
                  InOut: function ( k ) {
  
                          return 0.5 * ( 1 - Math.cos( Math.PI * k ) );
  
                  }
  
          },
  
          Exponential: {
  
                  In: function ( k ) {
  
                          return k === 0 ? 0 : Math.pow( 1024, k - 1 );
  
                  },
  
                  Out: function ( k ) {
  
                          return k === 1 ? 1 : 1 - Math.pow( 2, - 10 * k );
  
                  },
  
                  InOut: function ( k ) {
  
                          if ( k === 0 ) return 0;
                          if ( k === 1 ) return 1;
                          if ( ( k *= 2 ) < 1 ) return 0.5 * Math.pow( 1024, k - 1 );
                          return 0.5 * ( - Math.pow( 2, - 10 * ( k - 1 ) ) + 2 );
  
                  }
  
          },
  
          Circular: {
  
                  In: function ( k ) {
  
                          return 1 - Math.sqrt( 1 - k * k );
  
                  },
  
                  Out: function ( k ) {
  
                          return Math.sqrt( 1 - --k * k );
  
                  },
  
                  InOut: function ( k ) {
  
                          if ( ( k *= 2 ) < 1) return - 0.5 * ( Math.sqrt( 1 - k * k) - 1);
                          return 0.5 * ( Math.sqrt( 1 - ( k -= 2) * k) + 1);
  
                  }
  
          },
  
          Elastic: {
  
                  In: function ( k ) {
  
                          var s, a = 0.1, p = 0.4;
                          if ( k === 0 ) return 0;
                          if ( k === 1 ) return 1;
                          if ( !a || a < 1 ) { a = 1; s = p / 4; }
                          else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );
                          return - ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) );
  
                  },
  
                  Out: function ( k ) {
  
                          var s, a = 0.1, p = 0.4;
                          if ( k === 0 ) return 0;
                          if ( k === 1 ) return 1;
                          if ( !a || a < 1 ) { a = 1; s = p / 4; }
                          else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );
                          return ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );
  
                  },
  
                  InOut: function ( k ) {
  
                          var s, a = 0.1, p = 0.4;
                          if ( k === 0 ) return 0;
                          if ( k === 1 ) return 1;
                          if ( !a || a < 1 ) { a = 1; s = p / 4; }
                          else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );
                          if ( ( k *= 2 ) < 1 ) return - 0.5 * ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) );
                          return a * Math.pow( 2, -10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) * 0.5 + 1;
  
                  }
  
          },
  
          Back: {
  
                  In: function ( k ) {
  
                          var s = 1.70158;
                          return k * k * ( ( s + 1 ) * k - s );
  
                  },
  
                  Out: function ( k ) {
  
                          var s = 1.70158;
                          return --k * k * ( ( s + 1 ) * k + s ) + 1;
  
                  },
  
                  InOut: function ( k ) {
  
                          var s = 1.70158 * 1.525;
                          if ( ( k *= 2 ) < 1 ) return 0.5 * ( k * k * ( ( s + 1 ) * k - s ) );
                          return 0.5 * ( ( k -= 2 ) * k * ( ( s + 1 ) * k + s ) + 2 );
  
                  }
  
          },
  
          Bounce: {
  
                  In: function ( k ) {
  
                          return 1 - TWEEN.Easing.Bounce.Out( 1 - k );
  
                  },
  
                  Out: function ( k ) {
  
                          if ( k < ( 1 / 2.75 ) ) {
  
                                  return 7.5625 * k * k;
  
                          } else if ( k < ( 2 / 2.75 ) ) {
  
                                  return 7.5625 * ( k -= ( 1.5 / 2.75 ) ) * k + 0.75;
  
                          } else if ( k < ( 2.5 / 2.75 ) ) {
  
                                  return 7.5625 * ( k -= ( 2.25 / 2.75 ) ) * k + 0.9375;
  
                          } else {
  
                                  return 7.5625 * ( k -= ( 2.625 / 2.75 ) ) * k + 0.984375;
  
                          }
  
                  },
  
                  InOut: function ( k ) {
  
                          if ( k < 0.5 ) return TWEEN.Easing.Bounce.In( k * 2 ) * 0.5;
                          return TWEEN.Easing.Bounce.Out( k * 2 - 1 ) * 0.5 + 0.5;
  
                  }
  
          }
  
  };
  
  TWEEN.Interpolation = {
  
          Linear: function ( v, k ) {
  
                  var m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.Linear;
  
                  if ( k < 0 ) return fn( v[ 0 ], v[ 1 ], f );
                  if ( k > 1 ) return fn( v[ m ], v[ m - 1 ], m - f );
  
                  return fn( v[ i ], v[ i + 1 > m ? m : i + 1 ], f - i );
  
          },
  
          Bezier: function ( v, k ) {
  
                  var b = 0, n = v.length - 1, pw = Math.pow, bn = TWEEN.Interpolation.Utils.Bernstein, i;
  
                  for ( i = 0; i <= n; i++ ) {
                          b += pw( 1 - k, n - i ) * pw( k, i ) * v[ i ] * bn( n, i );
                  }
  
                  return b;
  
          },
  
          CatmullRom: function ( v, k ) {
  
                  var m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.CatmullRom;
  
                  if ( v[ 0 ] === v[ m ] ) {
  
                          if ( k < 0 ) i = Math.floor( f = m * ( 1 + k ) );
  
                          return fn( v[ ( i - 1 + m ) % m ], v[ i ], v[ ( i + 1 ) % m ], v[ ( i + 2 ) % m ], f - i );
  
                  } else {
  
                          if ( k < 0 ) return v[ 0 ] - ( fn( v[ 0 ], v[ 0 ], v[ 1 ], v[ 1 ], -f ) - v[ 0 ] );
                          if ( k > 1 ) return v[ m ] - ( fn( v[ m ], v[ m ], v[ m - 1 ], v[ m - 1 ], f - m ) - v[ m ] );
  
                          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 );
  
                  }
  
          },
  
          Utils: {
  
                  Linear: function ( p0, p1, t ) {
  
                          return ( p1 - p0 ) * t + p0;
  
                  },
  
                  Bernstein: function ( n , i ) {
  
                          var fc = TWEEN.Interpolation.Utils.Factorial;
                          return fc( n ) / fc( i ) / fc( n - i );
  
                  },
  
                  Factorial: ( function () {
  
                          var a = [ 1 ];
  
                          return function ( n ) {
  
                                  var s = 1, i;
                                  if ( a[ n ] ) return a[ n ];
                                  for ( i = n; i > 1; i-- ) s *= i;
                                  return a[ n ] = s;
  
                          }
  
                  } )(),
  
                  CatmullRom: function ( p0, p1, p2, p3, t ) {
  
                          var v0 = ( p2 - p0 ) * 0.5, v1 = ( p3 - p1 ) * 0.5, t2 = t * t, t3 = t * t2;
                          return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;
  
                  }
  
          }
  
  };


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.