setMeshData(data) {
    if (!Array.isArray(data)) {
      data = [data];
    }

    const program = this.program;
    program.meshData = data.map(({
      mode,
      positions,
      instanceCount,
      cells,
      cellsCount,
      attributes,
      uniforms,
      textureCoord,
      enableBlend
    }) => {
      const meshData = {
        positions: Renderer.FLOAT(positions),
        uniforms,
        enableBlend: !!enableBlend,
        textureCoord: Renderer.FLOAT(textureCoord)
      };

      if (cells) {
        meshData.cells = Renderer.USHORT(cells);
        meshData.cellsCount = cellsCount || meshData.cells.length;
      }

      if (mode != null) {
        meshData.mode = mode;
      }

      if (instanceCount != null) {
        if (!this.isWebGL2 && !this.aia_ext) throw new Error('Cannot use instanceCount in this rendering context, use webgl2 context instead.');else meshData.instanceCount = instanceCount;
      }

      if (attributes) {
        const copied = {};
        Object.entries(attributes).forEach(([key, value]) => {
          if (!program._attribute[key]) {
            // throw new Error(`Invalid attribute ${key}.`);
            if (false) {}
            program._attribute[key] = 'ignored';
          } else if (program._attribute[key] !== 'ignored') {
            const {
              name,
              type
            } = program._attribute[key];
            let buffer = value.data || value;

            if (Array.isArray(buffer)) {
              buffer = Renderer[type](buffer);
            }

            copied[key] = {
              name,
              data: buffer
            };

            if (value.divisor != null) {
              if (!this.isWebGL2 && !this.aia_ext) throw new Error('Cannot use divisor in this rendering context, use webgl2 context instead.');else copied[key].divisor = value.divisor;
            }
          }
        });
        meshData.attributes = copied;
      }

      return meshData;
    });
    if (this.options.autoUpdate) this.update();
  }
[{
      positions: ...
      cells: ...
      textureCoord: ...
      attributes: {name: {data:..., normalize: true}},
      uniforms: ...
    }]