UNPKG

phaser

Version:

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

138 lines (137 loc) 4.86 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 vec3 uSeedX;', 'uniform vec3 uSeedY;', 'uniform vec3 uSeedZ;', 'uniform vec3 uCells;', 'uniform vec3 uCellOffset;', 'uniform vec3 uVariation;', 'uniform vec3 uWrap;', 'uniform float uSmoothing;', 'uniform float uNormalScale;', 'uniform vec4 uColorStart;', 'uniform vec4 uColorEnd;', 'varying vec2 outTexCoord;', 'float trig(vec3 p)', '{', ' return fract(43757.5453*sin(dot(p, vec3(12.9898,78.233, 9441.8953))));', '}', 'vec3 bigCoord (vec3 coord, float scale)', '{', ' return (coord + uCellOffset) * scale * uCells;', '}', 'vec3 hash3D (vec3 coord)', '{', ' return vec3(', ' trig(coord + uSeedX),', ' trig(coord + uSeedY),', ' trig(coord + uSeedZ)', ' ) * uVariation;', '}', 'float worley3D (vec3 uv, float scale)', '{', ' vec3 coord = bigCoord(uv, scale);', ' vec3 point = floor(coord);', ' vec3 frac = fract(coord);', ' float dist = 12.0;', ' 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++)', ' {', ' vec3 cellNeighbor = vec3(i, j, k);', ' vec3 jitter = hash3D(mod(point + cellNeighbor, uWrap * scale));', ' vec3 diff = cellNeighbor - frac + jitter;', ' float d = dot(diff, diff); // Squared length of diff.', ' if (d < dist)', ' {', ' dist = d;', ' }', ' }', ' return sqrt(dist);', '}', 'float worley3DIndex (vec3 uv, float scale)', '{', ' vec3 coord = bigCoord(uv, scale);', ' vec3 point = floor(coord);', ' vec3 frac = fract(coord);', ' float dist = 12.0;', ' float random = 0.0;', ' 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++)', ' {', ' vec3 cellNeighbor = vec3(i, j, k);', ' vec3 jitter = hash3D(mod(point + cellNeighbor, uWrap * scale));', ' vec3 diff = cellNeighbor - frac + jitter;', ' float d = dot(diff, diff); // Squared length of diff.', ' if (d < dist)', ' {', ' dist = d;', ' random = jitter.x;', ' }', ' }', ' return random;', '}', 'float worley3DSmooth (vec3 uv, float scale)', '{', ' vec3 coord = bigCoord(uv, scale);', ' vec3 point = floor(coord);', ' vec3 frac = fract(coord);', ' float value = 0.0;', ' 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++)', ' {', ' vec3 cellNeighbor = vec3(i, j, k);', ' vec3 jitter = hash3D(mod(point + cellNeighbor, uWrap * scale));', ' vec3 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 iterateWorley3D (vec3 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 = worley3D(uv + iteration, scale);', ' #endif', ' #ifdef MODE_INDEX', ' itValue = worley3DIndex(uv + iteration, scale);', ' #endif', ' #ifdef MODE_DISTANCE_SMOOTH', ' itValue = worley3DSmooth(uv + iteration, scale);', ' #endif', ' value += (itValue - 0.5) / scale;', ' }', ' return value + 0.5;', '}', 'void main ()', '{', ' vec3 uv = vec3(outTexCoord, 0.0);', ' float value = iterateWorley3D(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');