Home Reference Source

lib/make/shaders.js

/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

const random = require('../random')
const make = require('../make')
const utils = require('../utils')

class shaders extends make {
  static get fragment1 () {
    return [
      [
        '#ifdef GL_ES',
        'precision mediump float;',
        '#endif',
        'varying vec4 vColor;',
        'void main() {',
        'gl_FragColor=vColor;',
        '}'
      ],
      [
        'varying highp vec2 vTextureCoord;',
        'varying highp vec3 vLighting;',
        'uniform sampler2D uSampler;',
        'void main(void) {',
        'highp vec4 texelColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));',
        'gl_FragColor = vec4(texelColor.rgb * vLighting, texelColor.a);',
        '}'
      ]
    ]
  }

  static get vertex1 () {
    return [
      [
        'attribute vec4 aVertex;',
        'attribute vec4 aColor;',
        'varying vec4 vColor;',
        'void main(){',
        'vColor=aColor;',
        'gl_Position=aVertex;',
        '}'
      ],
      [
        'attribute highp vec3 aVertexNormal;',
        'attribute highp vec3 aVertexPosition;',
        'attribute highp vec2 aTextureCoord;',
        'uniform highp mat4 uNormalMatrix;',
        'uniform highp mat4 uMVMatrix;',
        'uniform highp mat4 uPMatrix;',
        'varying highp vec2 vTextureCoord;',
        'varying highp vec3 vLighting;',
        'void main(void) {',
        'gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);',
        'vTextureCoord = aTextureCoord;',
        'highp vec3 ambientLight = vec3(0.6, 0.6, 0.6);',
        'highp vec3 directionalLightColor = vec3(0.5, 0.5, 0.75);',
        'highp vec3 directionalVector = vec3(0.85, 0.8, 0.75);',
        'highp vec4 transformedNormal = uNormalMatrix * vec4(aVertexNormal, 1.0);',
        'highp float directional = max(dot(transformedNormal.xyz, directionalVector), 0.0);',
        'vLighting = ambientLight + (directionalLightColor * directional);',
        '}'
      ]
    ]
  }

  static get fragment2 () {
    return [
      [
        'varying highp vec2 vTextureCoord;',
        'varying highp vec3 vLighting;',
        'uniform sampler2D uSampler;',
        'void main(void) {',
        'highp vec4 texelColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));',
        'gl_FragColor = vec4(texelColor.rgb * vLighting, texelColor.a);',
        '}'
      ],
      [
        '#version proto-200',
        'uniform sampler2D albedoMap;',
        'uniform sampler2D normalMap;',
        'varying vec3 varyingTangent;',
        'varying vec3 varyingBitangent;',
        'varying vec3 varyingNormal;',
        'varying vec2 varyingUV;',
        'void main(void) {',
        'vec3 albedo=texture2D(albedoMap,varyingUV).rgb;',
        'vec3 normal=texture2D(normalMap,varyingUV).rgb*2.0-1.0;',
        'float specularFactor=pow((albedo.r+albedo.g+albedo.b)*0.33,2.0);',
        'float specularHardness=2.0;',
        'vec3 spaceNormal=varyingTangent*normal.x+varyingBitangent*normal.y+varyingNormal*normal.z;',
        'gl_FragData[0]=vec4(albedo,1.0);',
        'gl_FragData[1]=vec4(spaceNormal*0.5 +0.5,1.0);',
        'gl_FragData[2]=vec4(specularFactor,specularHardness*0.1,0.0,1.0);',
        '}'
      ]
    ]
  }

  static get vertex2 () {
    return [
      [
        'attribute highp vec3 aVertexNormal;',
        'attribute highp vec3 aVertexPosition;',
        'attribute highp vec2 aTextureCoord;',
        'uniform highp mat4 uNormalMatrix;',
        'uniform highp mat4 uMVMatrix;',
        'uniform highp mat4 uPMatrix;',
        'varying highp vec2 vTextureCoord;',
        'varying highp vec3 vLighting;',
        'void main(void) {',
        'gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);',
        'vTextureCoord = aTextureCoord;',
        'highp vec3 ambientLight = vec3(0.6, 0.6, 0.6);',
        'highp vec3 directionalLightColor = vec3(0.5, 0.5, 0.75);',
        'highp vec3 directionalVector = vec3(0.85, 0.8, 0.75);',
        'highp vec4 transformedNormal = uNormalMatrix * vec4(aVertexNormal, 1.0);',
        'highp float directional = max(dot(transformedNormal.xyz, directionalVector), 0.0);',
        'vLighting = ambientLight + (directionalLightColor * directional);',
        '}'
      ],
      [
        '#version proto-200',
        'attribute vec3 vertexPosition;',
        'attribute vec3 vertexTangent;',
        'attribute vec3 vertexBitangent;',
        'attribute vec3 vertexNormal;',
        'attribute vec2 vertexUV;',
        'uniform mat4 modelMatrix;',
        'uniform mat4 viewMatrix;',
        'varying vec3 varyingTangent;',
        'varying vec3 varyingBitangent;',
        'varying vec3 varyingNormal;',
        'varying vec2 varyingUV;',
        'void main(void){',
        'gl_Position=viewMatrix*(modelMatrix*vec4(vertexPosition,1.0));',
        'gl_Position.xy=gl_Position.xy*0.5+(float(gl_InstanceID)-0.5);',
        'varyingTangent=(modelMatrix*vec4(vertexTangent,0.0)).xyz;',
        'varyingBitangent=(modelMatrix*vec4(vertexBitangent,0.0)).xyz;',
        'varyingNormal=(modelMatrix*vec4(vertexNormal,0.0)).xyz;',
        'varyingUV = vertexUV;',
        '}'
      ]
    ]
  }

  static shaderPair (v, f) {
    let i = random.number(v.length)
    return {
      vertex: utils.common.quote(v[i].join(' ')),
      fragment: utils.common.quote(f[i].join(' '))
    }
  }
}

module.exports = shaders