@srinivasprabhu/three-bmfont-text
Version:
renders BMFont files in ThreeJS with word-wrapping
76 lines (70 loc) • 2.87 kB
JavaScript
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);
};