code: function (opts) {
  
      opts = opts || {};
  
      Clip.call(this, opts);
      /**
       * Output clip must have blend2D method
       * @type {clay.animation.Clip}
       */
      this.output = opts.output || null;
      /**
       * @type {clay.animation.Blend2DClip.IClipInput[]}
       */
      this.inputs = opts.inputs || [];
      /**
       * @type {clay.Vector2}
       */
      this.position = new Vector2();
  
      this._cacheTriangle = null;
  
      this._triangles = [];
  
      this._updateTriangles();
  }
docs: 2D Blend clip of blend tree http://docs.unity3d.com/Documentation/Manual/2DBlending.html 
  @typedef {Object} clay.animation.Blend2DClip.IClipInput
  @property {clay.Vector2} position
  @property {clay.animation.Clip} clip
  @property {number} offset
   
  2d blending node in animation blend tree.
  output clip must have blend2D method
  @constructor
  @alias clay.animation.Blend2DClip
  @extends clay.animation.Clip
  
  @param {Object} [opts]
  @param {string} [opts.name]
  @param {Object} [opts.target]
  @param {number} [opts.life]
  @param {number} [opts.delay]
  @param {number} [opts.gap]
  @param {number} [opts.playbackRatio]
  @param {boolean|number} [opts.loop] If loop is a number, it indicate the loop count of animation
  @param {string|Function} [opts.easing]
  @param {Function} [opts.onframe]
  @param {Function} [opts.onfinish]
  @param {Function} [opts.onrestart]
  @param {object[]} [opts.inputs]
  @param {clay.Vector2} [opts.position]
  @param {clay.animation.Clip} [opts.output]