UNPKG

phaser

Version:

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

143 lines (142 loc) 5.08 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 vec4 uSeedX;', 'uniform vec4 uSeedY;', 'uniform vec4 uSeedZ;', 'uniform vec4 uSeedW;', 'uniform vec4 uCells;', 'uniform vec4 uCellOffset;', 'uniform vec4 uVariation;', 'uniform vec4 uWrap;', 'uniform float uSmoothing;', 'uniform float uNormalScale;', 'uniform vec4 uColorStart;', 'uniform vec4 uColorEnd;', 'varying vec2 outTexCoord;', 'float trig(vec4 p)', '{', ' return fract(43757.5453*sin(dot(p, vec4(12.9898,78.233,9441.8953,61.99))));', '}', 'vec4 bigCoord (vec4 coord, float scale)', '{', ' return (coord + uCellOffset) * scale * uCells;', '}', 'vec4 hash4D (vec4 coord)', '{', ' return vec4(', ' trig(coord + uSeedX),', ' trig(coord + uSeedY),', ' trig(coord + uSeedZ),', ' trig(coord + uSeedW)', ' ) * uVariation;', '}', 'float worley4D (vec4 uv, float scale)', '{', ' vec4 coord = bigCoord(uv, scale);', ' vec4 point = floor(coord);', ' vec4 frac = fract(coord);', ' float dist = 16.0;', ' for (float l = -1.0; l <= 1.0; l++)', ' for (float k = -1.0; k <= 1.0; k++)', ' for (float j = -1.0; j <= 1.0; j++)', ' for (float i = -1.0; i <= 1.0; i++)', ' {', ' vec4 cellNeighbor = vec4(i, j, k, l);', ' vec4 jitter = hash4D(mod(point + cellNeighbor, uWrap * scale));', ' vec4 diff = cellNeighbor - frac + jitter;', ' float d = dot(diff, diff); // Squared length of diff.', ' if (d < dist)', ' {', ' dist = d;', ' }', ' }', ' return sqrt(dist);', '}', 'float worley4DIndex (vec4 uv, float scale)', '{', ' vec4 coord = bigCoord(uv, scale);', ' vec4 point = floor(coord);', ' vec4 frac = fract(coord);', ' float dist = 16.0;', ' float random = 0.0;', ' for (float l = -1.0; l <= 1.0; l++)', ' for (float k = -1.0; k <= 1.0; k++)', ' for (float j = -1.0; j <= 1.0; j++)', ' for (float i = -1.0; i <= 1.0; i++)', ' {', ' vec4 cellNeighbor = vec4(i, j, k, l);', ' vec4 jitter = hash4D(mod(point + cellNeighbor, uWrap * scale));', ' vec4 diff = cellNeighbor - frac + jitter;', ' float d = dot(diff, diff); // Squared length of diff.', ' if (d < dist)', ' {', ' dist = d;', ' random = jitter.x;', ' }', ' }', ' return random;', '}', 'float worley4DSmooth (vec4 uv, float scale)', '{', ' vec4 coord = bigCoord(uv, scale);', ' vec4 point = floor(coord);', ' vec4 frac = fract(coord);', ' float value = 0.0;', ' for (float l = -1.0; l <= 1.0; l++)', ' for (float k = -1.0; k <= 1.0; k++)', ' for (float j = -1.0; j <= 1.0; j++)', ' for (float i = -1.0; i <= 1.0; i++)', ' {', ' vec4 cellNeighbor = vec4(i, j, k, l);', ' vec4 jitter = hash4D(mod(point + cellNeighbor, uWrap * scale));', ' vec4 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 iterateWorley4D (vec4 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 = worley4D(uv + iteration, scale);', ' #endif', ' #ifdef MODE_INDEX', ' itValue = worley4DIndex(uv + iteration, scale);', ' #endif', ' #ifdef MODE_DISTANCE_SMOOTH', ' itValue = worley4DSmooth(uv + iteration, scale);', ' #endif', ' value += (itValue - 0.5) / scale;', ' }', ' return value + 0.5;', '}', 'void main ()', '{', ' vec4 uv = vec4(outTexCoord, 0.0, 0.0);', ' float value = iterateWorley4D(uv);', ' #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');