UNPKG

@srinivasprabhu/three-bmfont-text

Version:
76 lines (70 loc) 2.87 kB
var assign = require('object-assign'); module.exports = function createMSDFShader (opt) { opt = opt || {}; var opacity = typeof opt.opacity === 'number' ? opt.opacity : 1; var alphaTest = typeof opt.alphaTest === 'number' ? opt.alphaTest : 0.0001; var precision = opt.precision || 'highp'; var color = opt.color; var map = opt.map; var negate = typeof opt.negate === 'boolean' ? opt.negate : true; // remove to satisfy r73 delete opt.map; delete opt.color; delete opt.precision; delete opt.opacity; delete opt.negate; return assign({ uniforms: { opacity: { type: 'f', value: opacity }, map: { type: 't', value: map || new THREE.Texture() }, color: { type: 'c', value: new THREE.Color(color) }, center: {type: 'vec2', value: new THREE.Vector2(0.5,0.5)} }, vertexShader: [ 'attribute vec2 uv;', 'attribute vec4 position;', 'uniform mat4 modelMatrix;', 'uniform mat4 modelViewMatrix;', 'uniform mat4 projectionMatrix;', 'uniform float rotation;', 'uniform vec2 center;', 'varying vec2 vUv;', 'void main() {', 'vUv = uv;', 'vec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );', 'vec2 scale;', 'scale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );', 'scale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );', 'vec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;', 'vec2 rotatedPosition;', 'float PI = 3.1415926538;', 'rotatedPosition.x = sin( rotation ) * alignedPosition.y + cos( rotation ) * alignedPosition.x;', 'rotatedPosition.y = cos( rotation ) * (-alignedPosition.y) - sin( rotation ) * (-alignedPosition.x);', 'mvPosition.xy += rotatedPosition;', 'gl_Position = projectionMatrix * mvPosition;', '}' ].join('\n'), fragmentShader: [ '#ifdef GL_OES_standard_derivatives', '#extension GL_OES_standard_derivatives : enable', '#endif', 'precision ' + precision + ' float;', 'uniform float opacity;', 'uniform vec3 color;', 'uniform sampler2D map;', 'varying vec2 vUv;', 'float median(float r, float g, float b) {', ' return max(min(r, g), min(max(r, g), b));', '}', 'void main() {', ' vec3 sample = ' + (negate ? '1.0 - ' : '') + 'texture2D(map, vUv).rgb;', ' float sigDist = median(sample.r, sample.g, sample.b) - 0.5;', ' float alpha = clamp(sigDist/fwidth(sigDist) + 0.5, 0.0, 1.0);', ' gl_FragColor = vec4(color.xyz, alpha * opacity);', alphaTest === 0 ? '' : ' if (gl_FragColor.a < ' + alphaTest + ') discard;', '}' ].join('\n') }, opt); };