text: /**
   * @module echarts-gl/util/geometry/QuadsGeometry
   * @author Yi Shen(http://github.com/pissang)
   */
  
  import Geometry from 'claygl/src/Geometry';
  import echarts from 'echarts/lib/echarts';
  import dynamicConvertMixin from './dynamicConvertMixin';
  import glmatrix from 'claygl/src/dep/glmatrix';
  var vec3 = glmatrix.vec3;
  
  /**
   * @constructor
   * @alias module:echarts-gl/util/geometry/QuadsGeometry
   * @extends clay.Geometry
   */
  
  var QuadsGeometry = Geometry.extend(function () {
      return {
  
          segmentScale: 1,
  
          /**
           * Need to use mesh to expand lines if lineWidth > MAX_LINE_WIDTH
           */
          useNativeLine: true,
  
          attributes: {
              position: new Geometry.Attribute('position', 'float', 3, 'POSITION'),
              normal: new Geometry.Attribute('normal', 'float', 3, 'NORMAL'),
              color: new Geometry.Attribute('color', 'float', 4, 'COLOR')
          }
      };
  },
  /** @lends module: echarts-gl/util/geometry/QuadsGeometry.prototype */
  {
  
      /**
       * Reset offset
       */
      resetOffset: function () {
          this._vertexOffset = 0;
          this._faceOffset = 0;
      },
  
      /**
       * @param {number} nQuad
       */
      setQuadCount: function (nQuad) {
          var attributes = this.attributes;
          var vertexCount = this.getQuadVertexCount() * nQuad;
          var triangleCount = this.getQuadTriangleCount() * nQuad;
          if (this.vertexCount !== vertexCount) {
              attributes.position.init(vertexCount);
              attributes.normal.init(vertexCount);
              attributes.color.init(vertexCount);
          }
          if (this.triangleCount !== triangleCount) {
              this.indices = vertexCount > 0xffff ? new Uint32Array(triangleCount * 3) : new Uint16Array(triangleCount * 3);
          }
      },
  
      getQuadVertexCount: function () {
          return 4;
      },
  
      getQuadTriangleCount: function () {
          return 2;
      },
  
      /**
       * Add a quad, which in following order:
       * 0-----1
       * 3-----2
       */
      addQuad: (function () {
          var a = vec3.create();
          var b = vec3.create();
          var normal = vec3.create();
          var indices = [0, 3, 1, 3, 2, 1];
          return function (coords,  color) {
              var positionAttr = this.attributes.position;
              var normalAttr = this.attributes.normal;
              var colorAttr = this.attributes.color;
  
              vec3.sub(a, coords[1], coords[0]);
              vec3.sub(b, coords[2], coords[1]);
              vec3.cross(normal, a, b);
              vec3.normalize(normal, normal);
  
              for (var i = 0; i < 4; i++) {
                  positionAttr.set(this._vertexOffset + i, coords[i]);
                  colorAttr.set(this._vertexOffset + i, color);
                  normalAttr.set(this._vertexOffset + i, normal);
              }
              var idx = this._faceOffset * 3;
              for (var i = 0; i < 6; i++) {
                  this.indices[idx + i] = indices[i] + this._vertexOffset;
              }
              this._vertexOffset += 4;
              this._faceOffset += 2;
          };
      })()
  });
  
  echarts.util.defaults(QuadsGeometry.prototype, dynamicConvertMixin);
  
  export default QuadsGeometry;