UNPKG

phaser

Version:

A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.

132 lines (131 loc) 4.6 kB
module.exports = [ '#version 100', '#pragma phaserTemplate(shaderName)', '#pragma phaserTemplate(fragmentMode)', '#pragma phaserTemplate(fragmentIterations)', '#pragma phaserTemplate(fragmentNormalMap)', '#ifdef GL_FRAGMENT_PRECISION_HIGH', 'precision highp float;', '#else', 'precision mediump float;', '#endif', 'uniform vec2 uSeedX;', 'uniform vec2 uSeedY;', 'uniform vec2 uCells;', 'uniform vec2 uCellOffset;', 'uniform vec2 uVariation;', 'uniform vec2 uWrap;', 'uniform float uSmoothing;', 'uniform float uNormalScale;', 'uniform vec4 uColorStart;', 'uniform vec4 uColorEnd;', 'varying vec2 outTexCoord;', 'float trig(vec2 p)', '{', ' return fract(43757.5453*sin(dot(p, vec2(12.9898,78.233))));', '}', 'vec2 bigCoord (vec2 coord, float scale)', '{', ' return (coord + uCellOffset) * scale * uCells;', '}', 'vec2 hash2D (vec2 coord)', '{', ' return vec2(', ' trig(coord + uSeedX),', ' trig(coord + uSeedY)', ' ) * uVariation;', '}', 'float worley2D (vec2 uv, float scale)', '{', ' vec2 coord = bigCoord(uv, scale);', ' vec2 point = floor(coord);', ' vec2 frac = fract(coord);', ' float dist = 12.0;', ' for (float j = -1.0; j <= 1.0; j++)', ' for (float i = -1.0; i <= 1.0; i++)', ' {', ' vec2 cellNeighbor = vec2(i, j);', ' vec2 jitter = hash2D(mod(point + cellNeighbor, uWrap * scale));', ' vec2 diff = cellNeighbor - frac + jitter;', ' float d = dot(diff, diff); // Squared length of diff.', ' if (d < dist)', ' {', ' dist = d;', ' }', ' }', ' return sqrt(dist);', '}', 'float worley2DIndex (vec2 uv, float scale)', '{', ' vec2 coord = bigCoord(uv, scale);', ' vec2 point = floor(coord);', ' vec2 frac = fract(coord);', ' float dist = 12.0;', ' float random = 0.0;', ' for (float j = -1.0; j <= 1.0; j++)', ' for (float i = -1.0; i <= 1.0; i++)', ' {', ' vec2 cellNeighbor = vec2(i, j);', ' vec2 jitter = hash2D(mod(point + cellNeighbor, uWrap * scale));', ' vec2 diff = cellNeighbor - frac + jitter;', ' float d = dot(diff, diff); // Squared length of diff.', ' if (d < dist)', ' {', ' dist = d;', ' random = jitter.x;', ' }', ' }', ' return random;', '}', 'float worley2DSmooth (vec2 uv, float scale)', '{', ' vec2 coord = bigCoord(uv, scale);', ' vec2 point = floor(coord);', ' vec2 frac = fract(coord);', ' float value = 0.0;', ' for (float j = -1.0; j <= 1.0; j++)', ' for (float i = -1.0; i <= 1.0; i++)', ' {', ' vec2 cellNeighbor = vec2(i, j);', ' vec2 jitter = hash2D(mod(point + cellNeighbor, uWrap * scale));', ' vec2 diff = cellNeighbor - frac + jitter;', ' float d = length(diff);', ' value += exp2(-32.0 / uSmoothing * d); // Accumulate fast-decaying exponential of length.', ' }', ' return -(1.0 / 32.0 * uSmoothing) * log2(value);', '}', 'float iterateWorley2D (vec2 uv)', '{', ' float value = 0.0;', ' float itValue = 0.0;', ' for (float iteration = 0.0; iteration < ITERATION_COUNT; iteration++)', ' {', ' float scale = exp2(iteration);', ' #ifdef MODE_DISTANCE', ' itValue = worley2D(uv + iteration, scale);', ' #endif', ' #ifdef MODE_INDEX', ' itValue = worley2DIndex(uv + iteration, scale);', ' #endif', ' #ifdef MODE_DISTANCE_SMOOTH', ' itValue = worley2DSmooth(uv + iteration, scale);', ' #endif', ' value += (itValue - 0.5) / scale;', ' }', ' return value + 0.5;', '}', 'void main ()', '{', ' float value = iterateWorley2D(outTexCoord);', ' #ifndef NORMAL_MAP', ' vec4 color = mix(uColorStart, uColorEnd, value);', ' color.rgb *= color.a;', ' gl_FragColor = color;', ' #else', ' float dx = dFdx(value) * uNormalScale;', ' float dy = dFdy(value) * uNormalScale;', ' vec3 normal = vec3(dx, dy, 1.0 - sqrt(dx * dx + dy * dy)) * 0.5 + 0.5;', ' gl_FragColor = vec4(normal, 1.0);', ' #endif', '}', ].join('\n');