Source: gfx/mesh/webgl/MeshShader.js

const Shader = require('../../core/renderers/webgl/shaders/Shader');
const ShaderManager = require('../../core/renderers/webgl/managers/ShaderManager');

/**
 * @class
 * @extends Shader
 * @memberof mesh
 * @param shaderManager {ShaderManager} The WebGL shader manager this shader works for.
 */
class MeshShader extends Shader {
  constructor(shaderManager) {
    super(shaderManager,
      // vertex shader
      [
        'precision lowp float;',
        'attribute vec2 aVertexPosition;',
        'attribute vec2 aTextureCoord;',

        'uniform mat3 translationMatrix;',
        'uniform mat3 projectionMatrix;',

        'varying vec2 vTextureCoord;',

        'void main(void){',
        '   gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);',
        '   vTextureCoord = aTextureCoord;',
        '}',
      ].join('\n'),
      [
        'precision lowp float;',

        'varying vec2 vTextureCoord;',
        'uniform float alpha;',

        'uniform sampler2D uSampler;',

        'void main(void){',
        '   gl_FragColor = texture2D(uSampler, vTextureCoord) * alpha ;',
        '}',
      ].join('\n'),
          // custom uniforms
      {
        alpha: { type: '1f', value: 0 },
        translationMatrix: { type: 'mat3', value: new Float32Array(9) },
        projectionMatrix: { type: 'mat3', value: new Float32Array(9) },
      },
          // custom attributes
      {
        aVertexPosition:0,
        aTextureCoord:0,
      }
    );
  }
}

ShaderManager.registerPlugin('meshShader', MeshShader);

module.exports = MeshShader;