diff --git a/js/utils.js b/js/utils.js index 5def554..1d08d1f 100644 --- a/js/utils.js +++ b/js/utils.js @@ -115,23 +115,23 @@ const loadText = (url) => { const makeFullScreenQuad = (regl, uniforms = {}, context = {}) => regl({ vert: ` - precision mediump float; - attribute vec2 aPosition; - varying vec2 vUV; - void main() { - vUV = 0.5 * (aPosition + 1.0); - gl_Position = vec4(aPosition, 0, 1); - } - `, + precision mediump float; + attribute vec2 aPosition; + varying vec2 vUV; + void main() { + vUV = 0.5 * (aPosition + 1.0); + gl_Position = vec4(aPosition, 0, 1); + } + `, frag: ` - precision mediump float; - varying vec2 vUV; - uniform sampler2D tex; - void main() { - gl_FragColor = texture2D(tex, vUV); - } - `, + precision mediump float; + varying vec2 vUV; + uniform sampler2D tex; + void main() { + gl_FragColor = texture2D(tex, vUV); + } + `, attributes: { aPosition: [-4, -4, 4, -4, 0, 4], diff --git a/shaders/blur.frag b/shaders/blur.frag index b38792f..b5a692d 100644 --- a/shaders/blur.frag +++ b/shaders/blur.frag @@ -4,21 +4,21 @@ uniform sampler2D tex; uniform vec2 direction; varying vec2 vUV; void main() { - vec2 size = width > height ? vec2(width / height, 1.) : vec2(1., height / width); - gl_FragColor = - texture2D(tex, vUV) * 0.442 + - ( - texture2D(tex, vUV + direction / max(width, height) * size) + - texture2D(tex, vUV - direction / max(width, height) * size) - ) * 0.279; - // gl_FragColor = - // texture2D(tex, vUV) * 0.38774 + - // ( - // texture2D(tex, vUV + direction / max(width, height) * size * 0.5) + - // texture2D(tex, vUV - direction / max(width, height) * size * 0.5) - // ) * 0.24477 + - // ( - // texture2D(tex, vUV + direction / max(width, height) * size) + - // texture2D(tex, vUV - direction / max(width, height) * size) - // ) * 0.06136; + vec2 size = width > height ? vec2(width / height, 1.) : vec2(1., height / width); + gl_FragColor = + texture2D(tex, vUV) * 0.442 + + ( + texture2D(tex, vUV + direction / max(width, height) * size) + + texture2D(tex, vUV - direction / max(width, height) * size) + ) * 0.279; + // gl_FragColor = + // texture2D(tex, vUV) * 0.38774 + + // ( + // texture2D(tex, vUV + direction / max(width, height) * size * 0.5) + + // texture2D(tex, vUV - direction / max(width, height) * size * 0.5) + // ) * 0.24477 + + // ( + // texture2D(tex, vUV + direction / max(width, height) * size) + + // texture2D(tex, vUV - direction / max(width, height) * size) + // ) * 0.06136; } diff --git a/shaders/highPass.frag b/shaders/highPass.frag index ca26c30..4f36ebd 100644 --- a/shaders/highPass.frag +++ b/shaders/highPass.frag @@ -3,9 +3,9 @@ varying vec2 vUV; uniform sampler2D tex; uniform float highPassThreshold; void main() { - vec3 lumaColor = texture2D(tex, vUV).rgb; - if (lumaColor.r < highPassThreshold) lumaColor.r = 0.0; - if (lumaColor.g < highPassThreshold) lumaColor.g = 0.0; - if (lumaColor.b < highPassThreshold) lumaColor.b = 0.0; - gl_FragColor = vec4(lumaColor, 1.0); + vec3 lumaColor = texture2D(tex, vUV).rgb; + if (lumaColor.r < highPassThreshold) lumaColor.r = 0.0; + if (lumaColor.g < highPassThreshold) lumaColor.g = 0.0; + if (lumaColor.b < highPassThreshold) lumaColor.b = 0.0; + gl_FragColor = vec4(lumaColor, 1.0); } diff --git a/shaders/imagePass.frag b/shaders/imagePass.frag index ea66d38..96d264c 100644 --- a/shaders/imagePass.frag +++ b/shaders/imagePass.frag @@ -5,7 +5,7 @@ uniform sampler2D backgroundTex; varying vec2 vUV; void main() { - vec3 bgColor = texture2D(backgroundTex, vUV).rgb; - float brightness = pow(min(1., texture2D(tex, vUV).r * 2.) + texture2D(bloomTex, vUV).r, 1.5); - gl_FragColor = vec4(bgColor * brightness, 1.0); + vec3 bgColor = texture2D(backgroundTex, vUV).rgb; + float brightness = pow(min(1., texture2D(tex, vUV).r * 2.) + texture2D(bloomTex, vUV).r, 1.5); + gl_FragColor = vec4(bgColor * brightness, 1.0); } diff --git a/shaders/palettePass.frag b/shaders/palettePass.frag index 71aacec..455be54 100644 --- a/shaders/palettePass.frag +++ b/shaders/palettePass.frag @@ -10,14 +10,14 @@ uniform vec3 backgroundColor; varying vec2 vUV; highp float rand( const in vec2 uv, const in float t ) { - const highp float a = 12.9898, b = 78.233, c = 43758.5453; - highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI ); - return fract(sin(sn) * c + t); + const highp float a = 12.9898, b = 78.233, c = 43758.5453; + highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI ); + return fract(sin(sn) * c + t); } void main() { - vec4 brightnessRGB = texture2D( tex, vUV ) + texture2D( bloomTex, vUV ); - float brightness = brightnessRGB.r + brightnessRGB.g + brightnessRGB.b; - float at = brightness - rand( gl_FragCoord.xy, time ) * ditherMagnitude; - gl_FragColor = texture2D( palette, vec2(at, 0.0)) + vec4(backgroundColor, 0.0); + vec4 brightnessRGB = texture2D( tex, vUV ) + texture2D( bloomTex, vUV ); + float brightness = brightnessRGB.r + brightnessRGB.g + brightnessRGB.b; + float at = brightness - rand( gl_FragCoord.xy, time ) * ditherMagnitude; + gl_FragColor = texture2D( palette, vec2(at, 0.0)) + vec4(backgroundColor, 0.0); } diff --git a/shaders/render.frag b/shaders/render.frag index 751e1d2..a6d414b 100644 --- a/shaders/render.frag +++ b/shaders/render.frag @@ -19,70 +19,70 @@ varying vec3 vChannel; varying vec4 vGlyph; float median3(vec3 i) { - return max(min(i.r, i.g), min(max(i.r, i.g), i.b)); + return max(min(i.r, i.g), min(max(i.r, i.g), i.b)); } float getSymbolIndex(float glyphCycle) { - float symbol = floor(glyphSequenceLength * glyphCycle); - float symbolX = mod(symbol, glyphTextureColumns); - float symbolY = ((glyphTextureColumns - 1.0) - (symbol - symbolX) / glyphTextureColumns); - return symbolY * glyphTextureColumns + symbolX; + float symbol = floor(glyphSequenceLength * glyphCycle); + float symbolX = mod(symbol, glyphTextureColumns); + float symbolY = ((glyphTextureColumns - 1.0) - (symbol - symbolX) / glyphTextureColumns); + return symbolY * glyphTextureColumns + symbolX; } void main() { - vec2 uv = vUV; + vec2 uv = vUV; - if (!volumetric) { - if (isPolar) { - // Curves the UV space to make letters appear to radiate from up above - uv -= 0.5; - uv *= 0.5; - uv.y -= 0.5; - float radius = length(uv); - float angle = atan(uv.y, uv.x) / (2. * PI) + 0.5; - uv = vec2(angle * 4. - 0.5, 1.5 - pow(radius, 0.5) * 1.5); - } else { - // Applies the slant, scaling the UV space - // to guarantee the viewport is still covered - uv = vec2( - (uv.x - 0.5) * slantVec.x + (uv.y - 0.5) * slantVec.y, - (uv.y - 0.5) * slantVec.x - (uv.x - 0.5) * slantVec.y - ) * slantScale + 0.5; - } - uv.y /= glyphHeightToWidth; - } + if (!volumetric) { + if (isPolar) { + // Curves the UV space to make letters appear to radiate from up above + uv -= 0.5; + uv *= 0.5; + uv.y -= 0.5; + float radius = length(uv); + float angle = atan(uv.y, uv.x) / (2. * PI) + 0.5; + uv = vec2(angle * 4. - 0.5, 1.5 - pow(radius, 0.5) * 1.5); + } else { + // Applies the slant, scaling the UV space + // to guarantee the viewport is still covered + uv = vec2( + (uv.x - 0.5) * slantVec.x + (uv.y - 0.5) * slantVec.y, + (uv.y - 0.5) * slantVec.x - (uv.x - 0.5) * slantVec.y + ) * slantScale + 0.5; + } + uv.y /= glyphHeightToWidth; + } - vec4 glyph = volumetric ? vGlyph : texture2D(lastState, uv); + vec4 glyph = volumetric ? vGlyph : texture2D(lastState, uv); - if (showComputationTexture) { - gl_FragColor = glyph; - return; - } + if (showComputationTexture) { + gl_FragColor = glyph; + return; + } - // Unpack the values from the font texture - float brightness = glyph.r; - float symbolIndex = getSymbolIndex(glyph.g); - float quadDepth = glyph.b; - float effect = glyph.a; + // Unpack the values from the font texture + float brightness = glyph.r; + float symbolIndex = getSymbolIndex(glyph.g); + float quadDepth = glyph.b; + float effect = glyph.a; - brightness = max(effect, brightness); - if (volumetric) { - brightness = min(1.0, brightness * quadDepth * 1.25); - } + brightness = max(effect, brightness); + if (volumetric) { + brightness = min(1.0, brightness * quadDepth * 1.25); + } - // resolve UV to MSDF texture coord - vec2 symbolUV = vec2(mod(symbolIndex, glyphTextureColumns), floor(symbolIndex / glyphTextureColumns)); - vec2 glyphUV = fract(uv * vec2(numColumns, numRows)); - glyphUV -= 0.5; - glyphUV *= clamp(1.0 - glyphEdgeCrop, 0.0, 1.0); - glyphUV += 0.5; - vec2 msdfUV = (glyphUV + symbolUV) / glyphTextureColumns; + // resolve UV to MSDF texture coord + vec2 symbolUV = vec2(mod(symbolIndex, glyphTextureColumns), floor(symbolIndex / glyphTextureColumns)); + vec2 glyphUV = fract(uv * vec2(numColumns, numRows)); + glyphUV -= 0.5; + glyphUV *= clamp(1.0 - glyphEdgeCrop, 0.0, 1.0); + glyphUV += 0.5; + vec2 msdfUV = (glyphUV + symbolUV) / glyphTextureColumns; - // MSDF - vec3 dist = texture2D(glyphTex, msdfUV).rgb; - float sigDist = median3(dist) - 0.5; - float alpha = clamp(sigDist/fwidth(sigDist) + 0.5, 0.0, 1.0); + // MSDF + vec3 dist = texture2D(glyphTex, msdfUV).rgb; + float sigDist = median3(dist) - 0.5; + float alpha = clamp(sigDist/fwidth(sigDist) + 0.5, 0.0, 1.0); - gl_FragColor = vec4(vChannel * brightness * alpha, 1.0); + gl_FragColor = vec4(vChannel * brightness * alpha, 1.0); } diff --git a/shaders/render.vert b/shaders/render.vert index 9784065..330c87c 100644 --- a/shaders/render.vert +++ b/shaders/render.vert @@ -16,38 +16,38 @@ varying vec3 vChannel; varying vec4 vGlyph; highp float rand( const in vec2 uv ) { - const highp float a = 12.9898, b = 78.233, c = 43758.5453; - highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI ); - return fract(sin(sn) * c); + const highp float a = 12.9898, b = 78.233, c = 43758.5453; + highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI ); + return fract(sin(sn) * c); } void main() { - vUV = (aPosition + aCorner) * quadSize; - vGlyph = texture2D(lastState, aPosition * quadSize); + vUV = (aPosition + aCorner) * quadSize; + vGlyph = texture2D(lastState, aPosition * quadSize); - float quadDepth = 0.0; - if (volumetric && !showComputationTexture) { - quadDepth = fract(vGlyph.b + time * animationSpeed * forwardSpeed); - vGlyph.b = quadDepth; - } - vec2 position = (aPosition + aCorner * vec2(density, 1.)) * quadSize; - vec4 pos = vec4((position - 0.5) * 2.0, quadDepth, 1.0); + float quadDepth = 0.0; + if (volumetric && !showComputationTexture) { + quadDepth = fract(vGlyph.b + time * animationSpeed * forwardSpeed); + vGlyph.b = quadDepth; + } + vec2 position = (aPosition + aCorner * vec2(density, 1.)) * quadSize; + vec4 pos = vec4((position - 0.5) * 2.0, quadDepth, 1.0); - vChannel = vec3(1.0, 0.0, 0.0); + vChannel = vec3(1.0, 0.0, 0.0); - if (volumetric) { - if (rand(vec2(aPosition.x, 0)) < resurrectingCodeRatio) { - pos.y = -pos.y; - vChannel = vec3(0.0, 1.0, 0.0); - } + if (volumetric) { + if (rand(vec2(aPosition.x, 0)) < resurrectingCodeRatio) { + pos.y = -pos.y; + vChannel = vec3(0.0, 1.0, 0.0); + } - pos.x /= glyphHeightToWidth; + pos.x /= glyphHeightToWidth; - pos = camera * transform * pos; - } else { - pos.xy *= screenSize; - } + pos = camera * transform * pos; + } else { + pos.xy *= screenSize; + } - gl_Position = pos; + gl_Position = pos; } diff --git a/shaders/resurrectionPass.frag b/shaders/resurrectionPass.frag index 373dd34..62fc4ee 100644 --- a/shaders/resurrectionPass.frag +++ b/shaders/resurrectionPass.frag @@ -9,36 +9,36 @@ uniform vec3 backgroundColor; varying vec2 vUV; highp float rand( const in vec2 uv, const in float t ) { - const highp float a = 12.9898, b = 78.233, c = 43758.5453; - highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI ); - return fract(sin(sn) * c + t); + const highp float a = 12.9898, b = 78.233, c = 43758.5453; + highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI ); + return fract(sin(sn) * c + t); } float rgbComponent(float p, float q, float t) { - if (t < 0.0) t += 1.0; - if (t > 1.0) t -= 1.0; - if (t < 1.0 / 6.0) return p + (q - p) * 6.0 * t; - if (t < 1.0 / 2.0) return q; - if (t < 2.0 / 3.0) return p + (q - p) * (2.0 / 3.0 - t) * 6.0; - return p; + if (t < 0.0) t += 1.0; + if (t > 1.0) t -= 1.0; + if (t < 1.0 / 6.0) return p + (q - p) * 6.0 * t; + if (t < 1.0 / 2.0) return q; + if (t < 2.0 / 3.0) return p + (q - p) * (2.0 / 3.0 - t) * 6.0; + return p; } vec3 hslToRgb(float h, float s, float l){ - float q = l < 0.5 ? l * (1. + s) : l + s - l * s; - float p = 2.0 * l - q; - return vec3( - rgbComponent(p, q, h + 1.0 / 3.0), - rgbComponent(p, q, h), - rgbComponent(p, q, h - 1.0 / 3.0) - ); + float q = l < 0.5 ? l * (1. + s) : l + s - l * s; + float p = 2.0 * l - q; + return vec3( + rgbComponent(p, q, h + 1.0 / 3.0), + rgbComponent(p, q, h), + rgbComponent(p, q, h - 1.0 / 3.0) + ); } void main() { - vec3 brightness = mix(texture2D( bloomTex, vUV ).rgb, texture2D( tex, vUV ).rgb, (0.7 - length(vUV - 0.5))) * 1.25 - rand( gl_FragCoord.xy, time ) * ditherMagnitude; + vec3 brightness = mix(texture2D( bloomTex, vUV ).rgb, texture2D( tex, vUV ).rgb, (0.7 - length(vUV - 0.5))) * 1.25 - rand( gl_FragCoord.xy, time ) * ditherMagnitude; - float hue = 0.35 + (length(vUV - vec2(0.5, 1.0)) * -0.4 + 0.2); - vec3 rgb = hslToRgb(hue, 0.8, max(0., brightness.r)) * vec3(0.8, 1.0, 0.7); - vec3 resurrectionRGB = hslToRgb(0.13, 1.0, max(0., brightness.g) * 0.9); - gl_FragColor = vec4(rgb + resurrectionRGB + backgroundColor, 1.0); + float hue = 0.35 + (length(vUV - vec2(0.5, 1.0)) * -0.4 + 0.2); + vec3 rgb = hslToRgb(hue, 0.8, max(0., brightness.r)) * vec3(0.8, 1.0, 0.7); + vec3 resurrectionRGB = hslToRgb(0.13, 1.0, max(0., brightness.g) * 0.9); + gl_FragColor = vec4(rgb + resurrectionRGB + backgroundColor, 1.0); } diff --git a/shaders/stripePass.frag b/shaders/stripePass.frag index 10c1076..90e30c3 100644 --- a/shaders/stripePass.frag +++ b/shaders/stripePass.frag @@ -10,14 +10,14 @@ uniform vec3 backgroundColor; varying vec2 vUV; highp float rand( const in vec2 uv, const in float t ) { - const highp float a = 12.9898, b = 78.233, c = 43758.5453; - highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI ); - return fract(sin(sn) * c + t); + const highp float a = 12.9898, b = 78.233, c = 43758.5453; + highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI ); + return fract(sin(sn) * c + t); } void main() { - vec3 color = texture2D(stripes, vUV).rgb; - float brightness = min(1., texture2D(tex, vUV).r * 2.) + texture2D(bloomTex, vUV).r; - float at = brightness - rand( gl_FragCoord.xy, time ) * ditherMagnitude; - gl_FragColor = vec4(color * at + backgroundColor, 1.0); + vec3 color = texture2D(stripes, vUV).rgb; + float brightness = min(1., texture2D(tex, vUV).r * 2.) + texture2D(bloomTex, vUV).r; + float at = brightness - rand( gl_FragCoord.xy, time ) * ditherMagnitude; + gl_FragColor = vec4(color * at + backgroundColor, 1.0); } diff --git a/shaders/update.frag b/shaders/update.frag index 9965a26..5e685f0 100644 --- a/shaders/update.frag +++ b/shaders/update.frag @@ -1,11 +1,11 @@ precision highp float; // This shader is the star of the show. -// In normal operation, each pixel represents a glyph's: -// R: brightness -// G: progress through the glyph sequence -// B: current glyph index -// A: additional brightness, for effects +// In normal operation, each pixel represents a glyph's: +// R: brightness +// G: progress through the glyph sequence +// B: current glyph index +// A: additional brightness, for effects #define PI 3.14159265359 #define RADS_TO_HZ 0.15915494309 @@ -28,151 +28,151 @@ uniform int rippleType; uniform float cursorEffectThreshold; float max2(vec2 v) { - return max(v.x, v.y); + return max(v.x, v.y); } highp float rand( const in vec2 uv ) { - const highp float a = 12.9898, b = 78.233, c = 43758.5453; - highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI ); - return fract(sin(sn) * c); + const highp float a = 12.9898, b = 78.233, c = 43758.5453; + highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI ); + return fract(sin(sn) * c); } vec2 rand2(vec2 p) { - return fract(vec2(sin(p.x * 591.32 + p.y * 154.077), cos(p.x * 391.32 + p.y * 49.077))); + return fract(vec2(sin(p.x * 591.32 + p.y * 154.077), cos(p.x * 391.32 + p.y * 49.077))); } float getRainTime(float simTime, vec2 glyphPos) { - float columnTimeOffset = rand(vec2(glyphPos.x, 0.0)); - float columnSpeedOffset = rand(vec2(glyphPos.x + 0.1, 0.0)); - // columnSpeedOffset = 0.0; // loop - float columnTime = (columnTimeOffset * 1000.0 + simTime * 0.5 * fallSpeed) * (0.5 + columnSpeedOffset * 0.5) + (sin(RADS_TO_HZ * simTime * fallSpeed * columnSpeedOffset) * 0.2); - return (glyphPos.y * 0.01 + columnTime) / raindropLength; + float columnTimeOffset = rand(vec2(glyphPos.x, 0.0)); + float columnSpeedOffset = rand(vec2(glyphPos.x + 0.1, 0.0)); + // columnSpeedOffset = 0.0; // loop + float columnTime = (columnTimeOffset * 1000.0 + simTime * 0.5 * fallSpeed) * (0.5 + columnSpeedOffset * 0.5) + (sin(RADS_TO_HZ * simTime * fallSpeed * columnSpeedOffset) * 0.2); + return (glyphPos.y * 0.01 + columnTime) / raindropLength; } float getRainBrightness(float rainTime) { - float value = 1.0 - fract((rainTime + 0.3 * sin(RADS_TO_HZ * SQRT_2 * rainTime) + 0.2 * sin(RADS_TO_HZ * SQRT_5 * rainTime))); - // value = 1.0 - fract(rainTime); // loop - return log(value * 1.25) * 3.0; + float value = 1.0 - fract((rainTime + 0.3 * sin(RADS_TO_HZ * SQRT_2 * rainTime) + 0.2 * sin(RADS_TO_HZ * SQRT_5 * rainTime))); + // value = 1.0 - fract(rainTime); // loop + return log(value * 1.25) * 3.0; } float getGlyphCycleSpeed(float rainTime, float brightness) { - float glyphCycleSpeed = 0.0; - if (cycleStyle == 0 && brightness > 0.0) { - glyphCycleSpeed = pow(1.0 - brightness, 4.0); - } else if (cycleStyle == 1) { - glyphCycleSpeed = fract((rainTime + 0.7 * sin(RADS_TO_HZ * SQRT_2 * rainTime) + 1.1 * sin(RADS_TO_HZ * SQRT_5 * rainTime))) * 0.75; - // glyphCycleSpeed = fract(rainTime) * 0.75; // loop - } - return glyphCycleSpeed; + float glyphCycleSpeed = 0.0; + if (cycleStyle == 0 && brightness > 0.0) { + glyphCycleSpeed = pow(1.0 - brightness, 4.0); + } else if (cycleStyle == 1) { + glyphCycleSpeed = fract((rainTime + 0.7 * sin(RADS_TO_HZ * SQRT_2 * rainTime) + 1.1 * sin(RADS_TO_HZ * SQRT_5 * rainTime))) * 0.75; + // glyphCycleSpeed = fract(rainTime) * 0.75; // loop + } + return glyphCycleSpeed; } float applySunShower(float rainBrightness, vec2 screenPos) { - if (rainBrightness < -4.) { - return rainBrightness; - } - float value = pow(fract(rainBrightness * 0.5), 3.0) * screenPos.y * 1.5; - return value; + if (rainBrightness < -4.) { + return rainBrightness; + } + float value = pow(fract(rainBrightness * 0.5), 3.0) * screenPos.y * 1.5; + return value; } float applyThunder(float rainBrightness, float simTime, vec2 screenPos) { - simTime *= 0.5; - float thunder = 1.0 - fract((simTime + 0.3 * sin(RADS_TO_HZ * SQRT_2 * simTime) + 0.2 * sin(RADS_TO_HZ * SQRT_5 * simTime))); - // thunder = 1.0 - fract(simTime + 0.3); // loop - thunder = log(thunder * 1.5) * 4.0; - thunder = clamp(thunder, 0., 1.); - thunder = thunder * pow(screenPos.y, 2.) * 3.; - return rainBrightness + thunder; + simTime *= 0.5; + float thunder = 1.0 - fract((simTime + 0.3 * sin(RADS_TO_HZ * SQRT_2 * simTime) + 0.2 * sin(RADS_TO_HZ * SQRT_5 * simTime))); + // thunder = 1.0 - fract(simTime + 0.3); // loop + thunder = log(thunder * 1.5) * 4.0; + thunder = clamp(thunder, 0., 1.); + thunder = thunder * pow(screenPos.y, 2.) * 3.; + return rainBrightness + thunder; } float applyRippleEffect(float effect, float simTime, vec2 screenPos) { - if (rippleType == -1) { - return effect; - } + if (rippleType == -1) { + return effect; + } - float rippleTime = (simTime * 0.5 + 0.2 * sin(RADS_TO_HZ * simTime)) * rippleSpeed + 1.; - // rippleTime = (simTime * 0.5) * rippleSpeed + 1.; // loop + float rippleTime = (simTime * 0.5 + 0.2 * sin(RADS_TO_HZ * simTime)) * rippleSpeed + 1.; + // rippleTime = (simTime * 0.5) * rippleSpeed + 1.; // loop - vec2 offset = rand2(vec2(floor(rippleTime), 0.)) - 0.5; - // offset = vec2(0.); // loop - vec2 ripplePos = screenPos * 2.0 - 1.0 + offset; - float rippleDistance; - if (rippleType == 0) { - rippleDistance = max2(abs(ripplePos) * vec2(1.0, glyphHeightToWidth)); - } else if (rippleType == 1) { - rippleDistance = length(ripplePos); - } + vec2 offset = rand2(vec2(floor(rippleTime), 0.)) - 0.5; + // offset = vec2(0.); // loop + vec2 ripplePos = screenPos * 2.0 - 1.0 + offset; + float rippleDistance; + if (rippleType == 0) { + rippleDistance = max2(abs(ripplePos) * vec2(1.0, glyphHeightToWidth)); + } else if (rippleType == 1) { + rippleDistance = length(ripplePos); + } - float rippleValue = fract(rippleTime) * rippleScale - rippleDistance; + float rippleValue = fract(rippleTime) * rippleScale - rippleDistance; - if (rippleValue > 0. && rippleValue < rippleThickness) { - return effect + 0.75; - } else { - return effect; - } + if (rippleValue > 0. && rippleValue < rippleThickness) { + return effect + 0.75; + } else { + return effect; + } } float applyCursorEffect(float effect, float brightness) { - if (brightness >= cursorEffectThreshold) { - effect = 1.0; - } - return effect; + if (brightness >= cursorEffectThreshold) { + effect = 1.0; + } + return effect; } -void main() { +void main() { - vec2 glyphPos = gl_FragCoord.xy; - vec2 screenPos = glyphPos / vec2(numColumns, numRows); - float simTime = time * animationSpeed; + vec2 glyphPos = gl_FragCoord.xy; + vec2 screenPos = glyphPos / vec2(numColumns, numRows); + float simTime = time * animationSpeed; - // Read the current values of the glyph - vec4 data = texture2D( lastState, screenPos ); - bool isInitializing = length(data) == 0.; - float oldRainBrightness = data.r; - float oldGlyphCycle = data.g; - if (isInitializing) { - oldGlyphCycle = showComputationTexture ? 0.5 : rand(screenPos); - } + // Read the current values of the glyph + vec4 data = texture2D( lastState, screenPos ); + bool isInitializing = length(data) == 0.; + float oldRainBrightness = data.r; + float oldGlyphCycle = data.g; + if (isInitializing) { + oldGlyphCycle = showComputationTexture ? 0.5 : rand(screenPos); + } - if (oldRainBrightness <= 0.0) { - // oldGlyphCycle = showComputationTexture ? 0.5 : rand(screenPos); // loop - } + if (oldRainBrightness <= 0.0) { + // oldGlyphCycle = showComputationTexture ? 0.5 : rand(screenPos); // loop + } - float rainTime = getRainTime(simTime, glyphPos); - float rainBrightness = getRainBrightness(rainTime); + float rainTime = getRainTime(simTime, glyphPos); + float rainBrightness = getRainBrightness(rainTime); - if (hasSun) rainBrightness = applySunShower(rainBrightness, screenPos); - if (hasThunder) rainBrightness = applyThunder(rainBrightness, simTime, screenPos); + if (hasSun) rainBrightness = applySunShower(rainBrightness, screenPos); + if (hasThunder) rainBrightness = applyThunder(rainBrightness, simTime, screenPos); - float glyphCycleSpeed = getGlyphCycleSpeed(rainTime, rainBrightness); - float glyphCycle = fract(oldGlyphCycle + 0.005 * animationSpeed * cycleSpeed * glyphCycleSpeed); + float glyphCycleSpeed = getGlyphCycleSpeed(rainTime, rainBrightness); + float glyphCycle = fract(oldGlyphCycle + 0.005 * animationSpeed * cycleSpeed * glyphCycleSpeed); - float effect = 0.; - effect = applyRippleEffect(effect, simTime, screenPos); - effect = applyCursorEffect(effect, rainBrightness); + float effect = 0.; + effect = applyRippleEffect(effect, simTime, screenPos); + effect = applyCursorEffect(effect, rainBrightness); - float glyphDepth = rand(vec2(glyphPos.x, 0.0)); + float glyphDepth = rand(vec2(glyphPos.x, 0.0)); - if (rainBrightness > brightnessMinimum) { - rainBrightness = rainBrightness * brightnessMultiplier + brightnessOffset; - } + if (rainBrightness > brightnessMinimum) { + rainBrightness = rainBrightness * brightnessMultiplier + brightnessOffset; + } - if (!isInitializing) { - rainBrightness = mix(oldRainBrightness, rainBrightness, brightnessMix); - } + if (!isInitializing) { + rainBrightness = mix(oldRainBrightness, rainBrightness, brightnessMix); + } - if (showComputationTexture) { - gl_FragColor = vec4( - rainBrightness, - glyphCycle, - min(1.0, glyphCycleSpeed), // Better use of the blue channel, for show and tell - 1.0 - ); - } else { - gl_FragColor = vec4( - rainBrightness, - glyphCycle, - glyphDepth, - effect - ); - } + if (showComputationTexture) { + gl_FragColor = vec4( + rainBrightness, + glyphCycle, + min(1.0, glyphCycleSpeed), // Better use of the blue channel, for show and tell + 1.0 + ); + } else { + gl_FragColor = vec4( + rainBrightness, + glyphCycle, + glyphDepth, + effect + ); + } }