text: define('frender/core/matrix',[],function () {
      var ArrayCtor = typeof Float32Array === 'undefined'
          ? Array
          : Float32Array;
      /**
       * 3x2矩阵操作类
       * @exports frender/tool/matrix
       */
      var matrix = {
          /**
           * 创建一个单位矩阵
           * @return {Float32Array|Array.<number>}
           */
          create : function() {
              var out = new ArrayCtor(6);
              matrix.identity(out);
  
              return out;
          },
          /**
           * 设置矩阵为单位矩阵
           * @param {Float32Array|Array.<number>} out
           */
          identity : function(out) {
              out[0] = 1;
              out[1] = 0;
              out[2] = 0;
              out[3] = 1;
              out[4] = 0;
              out[5] = 0;
              return out;
          },
          /**
           * 复制矩阵
           * @param {Float32Array|Array.<number>} out
           * @param {Float32Array|Array.<number>} m
           */
          copy: function(out, m) {
              out[0] = m[0];
              out[1] = m[1];
              out[2] = m[2];
              out[3] = m[3];
              out[4] = m[4];
              out[5] = m[5];
              return out;
          },
          /**
           * 矩阵相乘
           * @param {Float32Array|Array.<number>} out
           * @param {Float32Array|Array.<number>} m1
           * @param {Float32Array|Array.<number>} m2
           */
          mul : function (out, m1, m2) {
              // Consider matrix.mul(m, m2, m);
              // where out is the same as m2.
              // So use temp variable to escape error.
              var out0 = m1[0] * m2[0] + m1[2] * m2[1];
              var out1 = m1[1] * m2[0] + m1[3] * m2[1];
              var out2 = m1[0] * m2[2] + m1[2] * m2[3];
              var out3 = m1[1] * m2[2] + m1[3] * m2[3];
              var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4];
              var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5];
              out[0] = out0;
              out[1] = out1;
              out[2] = out2;
              out[3] = out3;
              out[4] = out4;
              out[5] = out5;
              return out;
          },
          /**
           * 平移变换
           * @param {Float32Array|Array.<number>} out
           * @param {Float32Array|Array.<number>} a
           * @param {Float32Array|Array.<number>} v
           */
          translate : function(out, a, v) {
              out[0] = a[0];
              out[1] = a[1];
              out[2] = a[2];
              out[3] = a[3];
              out[4] = a[4] + v[0];
              out[5] = a[5] + v[1];
              return out;
          },
          /**
           * 旋转变换
           * @param {Float32Array|Array.<number>} out
           * @param {Float32Array|Array.<number>} a
           * @param {number} rad
           */
          rotate : function(out, a, rad) {
              var aa = a[0];
              var ac = a[2];
              var atx = a[4];
              var ab = a[1];
              var ad = a[3];
              var aty = a[5];
              var st = Math.sin(rad);
              var ct = Math.cos(rad);
  
              out[0] = aa * ct + ab * st;
              out[1] = -aa * st + ab * ct;
              out[2] = ac * ct + ad * st;
              out[3] = -ac * st + ct * ad;
              out[4] = ct * atx + st * aty;
              out[5] = ct * aty - st * atx;
              return out;
          },
          /**
           * 缩放变换
           * @param {Float32Array|Array.<number>} out
           * @param {Float32Array|Array.<number>} a
           * @param {Float32Array|Array.<number>} v
           */
          scale : function(out, a, v) {
              var vx = v[0];
              var vy = v[1];
              out[0] = a[0] * vx;
              out[1] = a[1] * vy;
              out[2] = a[2] * vx;
              out[3] = a[3] * vy;
              out[4] = a[4] * vx;
              out[5] = a[5] * vy;
              return out;
          },
          /**
           * 求逆矩阵
           * @param {Float32Array|Array.<number>} out
           * @param {Float32Array|Array.<number>} a
           */
          invert : function(out, a) {
  
              var aa = a[0];
              var ac = a[2];
              var atx = a[4];
              var ab = a[1];
              var ad = a[3];
              var aty = a[5];
  
              var det = aa * ad - ab * ac;
              if (!det) {
                  return null;
              }
              det = 1.0 / det;
  
              out[0] = ad * det;
              out[1] = -ab * det;
              out[2] = -ac * det;
              out[3] = aa * det;
              out[4] = (ac * aty - ad * atx) * det;
              out[5] = (ab * atx - aa * aty) * det;
              return out;
          }
      };
  
      return matrix;
  });
  