From e61f96e614b0086d78dd9f1e34446779c0f5be90 Mon Sep 17 00:00:00 2001 From: Rezmason Date: Sun, 9 Sep 2018 16:42:22 -0700 Subject: [PATCH] Added paradise version. Added Coptic text texture. Added polar coordinate and "sun" support to the renderer. --- README.md | 4 +- TODO.txt | 4 + coptic_msdf.png | Bin 0 -> 74088 bytes index.html | 48 ++++++- js/ColorMapPass.js | 16 ++- js/MatrixRenderer.js | 51 ++++++-- msdf_command.txt | 1 + svg sources/coptic_texture_simplified.svg | 150 ++++++++++++++++++++++ 8 files changed, 252 insertions(+), 22 deletions(-) create mode 100644 coptic_msdf.png create mode 100644 svg sources/coptic_texture_simplified.svg diff --git a/README.md b/README.md index f3315c1..6c544b1 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ You can customize the digital rain by putting a '?' at the end of the link above Here's a list of customization options: -- **version** - the version of the Matrix to simulate. Can be "nightmare" or "1999" (default). +- **version** - the version of the Matrix to simulate. Can be "paradise", "nightmare" or "1999" (default). - **width** - the number of columns (and rows) to draw. Default is 80. - **animationSpeed** - the overall speed of the animation. Can be any number, even negative! Default is 1.0. - **fallSpeed** - the speed of the rain. Can be any number, even negative! Default is 1.0. @@ -32,6 +32,8 @@ The Matrix glyphs in this project are cleaned up vectors [from an old SWF](https The Gothic glyphs in this project are derived from [Dr. jur. Robert Pfeffer's font "Silubur"](http://www.robert-pfeffer.net/gotica/englisch/index.html), which are inspired by the uncial script found in the [Codex Argenteus](https://en.wikipedia.org/wiki/Codex_Argenteus). +The Coptic glyphs in this project are derived from [George Douros's font "Symbola"](http://users.teilar.gr/~g1951d), due to their similarity to the script in [CG II of Nag Hammadi](https://en.wikipedia.org/wiki/Nag_Hammadi_Codex_II). + The glyphs are formatted as a multi-channel distance field (or MSDF) via Victor Chlumsky's [msdfgen](https://github.com/Chlumsky/msdfgen). This format preserves the crisp edges and corners of vector graphics when rendered as textures. Chlumsky's thesis paper, which is in English and is also easy to read, is [available to download here](https://dspace.cvut.cz/handle/10467/62770). The raindrops themselves are particles [computed on the GPU inside of a texture](https://threejs.org/examples/webgl_gpgpu_water.html), much smaller than the final render. The data sent from the CPU to the GPU every frame is negligible. diff --git a/TODO.txt b/TODO.txt index 49de856..890bfdd 100644 --- a/TODO.txt +++ b/TODO.txt @@ -11,6 +11,10 @@ Reach out to Ashley's partner about producing sounds https://youtu.be/721sG2D_9-U?t=67 And some kind of ambient sound that they play over + +Why's it look different on Mobile Safari? + + Much later: Deluxe compute variables Flashing row effect diff --git a/coptic_msdf.png b/coptic_msdf.png new file mode 100644 index 0000000000000000000000000000000000000000..ec64e519d7d44082f3e58256cd704e947a7f3d89 GIT binary patch literal 74088 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 const versions = { + paradise: { + texture: './coptic_msdf.png', + glyphSequenceLength: 32, + bloom: { + strength: 4, + radius: 1, + threshold: 0 + }, + palette: [ + {color: new THREE.Vector3(0.00, 0.00, 0.00), at: 0.0}, + {color: new THREE.Vector3(0.52, 0.17, 0.05), at: 0.4}, + {color: new THREE.Vector3(0.82, 0.37, 0.12), at: 0.7}, + {color: new THREE.Vector3(1.00, 0.74, 0.29), at: 0.9}, + {color: new THREE.Vector3(1.00, 1.00, 1.00), at: 1.0}, + ], + fallSpeed: 0.05, + cycleSpeed: 0.05, + hasThunder: false, + hasSun: true, + isPolar: true, + numColumns: 50 + }, nightmare: { texture: './gothic_msdf.png', glyphSequenceLength: 27, + bloom: { + strength: 2, + radius: 0.8, + threshold: 0.5 + }, palette: [ {color: new THREE.Vector3(0.00, 0.00, 0.00), at: 0.0}, {color: new THREE.Vector3(0.52, 0.00, 0.00), at: 0.2}, @@ -36,13 +63,20 @@ {color: new THREE.Vector3(1.00, 1.00, 0.90), at: 1.0}, ], fallSpeed: 0.4, - cycleSpeed: 0.5, + cycleSpeed: 0.02, hasThunder: true, + hasSun: false, + isPolar: false, numColumns: 60 }, ["1999"]: { texture: './matrixcode_msdf.png', glyphSequenceLength: 57, + bloom: { + strength: 2, + radius: 0.5, + threshold: 0.3 + }, palette: [ {color: new THREE.Vector3(0.00, 0.00, 0.00), at: 0.0}, {color: new THREE.Vector3(0.05, 0.52, 0.17), at: 0.4}, @@ -52,6 +86,8 @@ fallSpeed: 1, cycleSpeed: 1, hasThunder: false, + hasSun: false, + isPolar: false, numColumns: 80 } }; @@ -59,7 +95,7 @@ const urlParams = new Map(window.location.href.replace(/^[^\?]+\?/, "").split("&").map(pair => pair.split("="))); const getParam = (key, defaultValue) => urlParams.has(key) ? urlParams.get(key) : defaultValue; - const version = versions[getParam("version", "1999")]; + const version = versions[getParam("version", "1999")] || versions["1999"]; const sharpness = parseFloat(getParam("sharpness", 0.5)); const animationSpeed = parseFloat(getParam("animationSpeed", 1)); @@ -70,6 +106,8 @@ const glyphSequenceLength = version.glyphSequenceLength; const palette = version.palette; const hasThunder = version.hasThunder; + const hasSun = version.hasSun; + const isPolar = version.isPolar; const effect = getParam("effect", "plain"); @@ -91,13 +129,15 @@ animationSpeed, fallSpeed, cycleSpeed, glyphSequenceLength, numGlyphColumns, - hasThunder + hasThunder, + hasSun, + isPolar, }); matrixRenderer.pass.renderToScreen = false; composer.addPass( matrixRenderer.pass ); - const bloomPass = new THREE.UnrealBloomPass( new THREE.Vector2( window.innerWidth, window.innerHeight ), 2, 0.5, 0.3 ); + const bloomPass = new THREE.UnrealBloomPass( new THREE.Vector2( window.innerWidth, window.innerHeight ), version.bloom.strength, version.bloom.radius, version.bloom.threshold ); composer.addPass( bloomPass ); switch (effect) { diff --git a/js/ColorMapPass.js b/js/ColorMapPass.js index 722d8be..cfe3096 100644 --- a/js/ColorMapPass.js +++ b/js/ColorMapPass.js @@ -11,21 +11,23 @@ const easeInOutQuad = input => { return 1 - 2 * input * input; } +const ARRAY_SIZE = 2048; + THREE.ColorMapPass = function (entries, ditherMagnitude = 1) { - const colors = Array(256).fill().map(_ => new THREE.Vector3()); + const colors = Array(ARRAY_SIZE).fill().map(_ => new THREE.Vector3(0, 0, 0)); const sortedEntries = entries.slice().sort((e1, e2) => e1.at - e2.at).map(entry => ({ color: entry.color, - at255: Math.floor(Math.max(Math.min(1, entry.at), 0) * (colors.length - 1)) + arrayIndex: Math.floor(Math.max(Math.min(1, entry.at), 0) * (ARRAY_SIZE - 1)) })); - sortedEntries.unshift({color:sortedEntries[0].color, at255:0}); - sortedEntries.push({color:sortedEntries[sortedEntries.length - 1].color, at255:255}); + sortedEntries.unshift({color:sortedEntries[0].color, arrayIndex:0}); + sortedEntries.push({color:sortedEntries[sortedEntries.length - 1].color, arrayIndex:ARRAY_SIZE - 1}); sortedEntries.forEach((entry, index) => { - colors[entry.at255].copy(entry.color); + colors[entry.arrayIndex].copy(entry.color); if (index + 1 < sortedEntries.length) { const nextEntry = sortedEntries[index + 1]; - const diff = nextEntry.at255 - entry.at255; + const diff = nextEntry.arrayIndex - entry.arrayIndex; for (let i = 0; i < diff; i++) { - colors[entry.at255 + i].lerpVectors(entry.color, nextEntry.color, i / diff); + colors[entry.arrayIndex + i].lerpVectors(entry.color, nextEntry.color, i / diff); } } }); diff --git a/js/MatrixRenderer.js b/js/MatrixRenderer.js index ade4b19..b1bcfc2 100644 --- a/js/MatrixRenderer.js +++ b/js/MatrixRenderer.js @@ -4,7 +4,9 @@ const makeMatrixRenderer = (renderer, texture, { animationSpeed, fallSpeed, cycleSpeed, glyphSequenceLength, numGlyphColumns, - hasThunder + hasThunder, + hasSun, + isPolar }) => { const matrixRenderer = {}; const camera = new THREE.OrthographicCamera( -0.5, 0.5, 0.5, -0.5, 0.0001, 10000 ); @@ -41,6 +43,10 @@ const glyphVariable = gpuCompute.addVariable( return fract(sin(sn) * c); } + highp float blast( const in float x, const in float power ) { + return pow(pow(pow(x, power), power), power); + } + void main() { vec2 cellSize = 1.0 / resolution.xy; @@ -62,17 +68,22 @@ const glyphVariable = gpuCompute.addVariable( float newBrightness = 3.0 * log(value * 1.25); - #ifdef hasThunder - float thunder = 10.0 * (pow(pow(sin(SQRT_5 * simTime), 10.0), 10.0) + pow(pow(sin(SQRT_2 * simTime), 10.0), 10.0)) + 0.6; + #ifdef hasSun + newBrightness = pow(fract(newBrightness * 0.5), 3.0) * uv.y * 2.0; + #endif - newBrightness *= thunder; + #ifdef hasThunder + vec2 distVec = (gl_FragCoord.xy / resolution.xy - vec2(0.5, 1.0)) * vec2(1.0, 2.0); + float thunder = (blast(sin(SQRT_5 * simTime * 2.0), 10.0) + blast(sin(SQRT_2 * simTime * 2.0), 10.0)); + thunder *= 20.0 * (1.0 - 1.5 * length(distVec)); + + newBrightness *= max(0.0, thunder) * 0.4 + 0.6; if (newBrightness > brightness) { brightness = newBrightness; } else { brightness = mix(brightness, newBrightness, brightnessChangeBias * 0.1); } - brightness = min(1.0, brightness); #else brightness = mix(brightness, newBrightness, brightnessChangeBias); #endif @@ -84,7 +95,7 @@ const glyphVariable = gpuCompute.addVariable( float symbolX = mod(symbol, numGlyphColumns); float symbolY = ((numGlyphColumns - 1.0) - (symbol - symbolX) / numGlyphColumns); - gl_FragColor = vec4(1.0); + gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); gl_FragColor.r = brightness; gl_FragColor.g = cycle; gl_FragColor.b = symbolX / numGlyphColumns; @@ -96,7 +107,7 @@ const glyphVariable = gpuCompute.addVariable( ); gpuCompute.setVariableDependencies( glyphVariable, [ glyphVariable ] ); - const brightnessChangeBias = animationSpeed == 0 ? 1 : Math.min(1, Math.abs(animationSpeed)); + const brightnessChangeBias = (animationSpeed * fallSpeed) == 0 ? 1 : Math.min(1, Math.abs(animationSpeed * fallSpeed)); Object.assign(glyphVariable.material.uniforms, { now: { type: "f", value: 0 }, delta: { type: "f", value: 0.01 }, @@ -110,6 +121,9 @@ const glyphVariable = gpuCompute.addVariable( if (hasThunder) { glyphVariable.material.defines.hasThunder = 1.0; } + if (hasSun) { + glyphVariable.material.defines.hasSun = 1.0; + } const error = gpuCompute.init(); if ( error !== null ) { @@ -140,6 +154,7 @@ const glyphVariable = gpuCompute.addVariable( } `, fragmentShader: ` + #define PI 3.14159265359 #ifdef GL_OES_standard_derivatives #extension GL_OES_standard_derivatives: enable #endif @@ -159,17 +174,26 @@ const glyphVariable = gpuCompute.addVariable( void main() { + #ifdef isPolar + vec2 diff = vUV - vec2(0.5, 1.25); + float radius = length(diff); + float angle = atan(diff.y, diff.x) + PI; + vec2 uv = vec2(angle / PI, 1.0 - pow(radius * 0.75, 0.6)); + #else + vec2 uv = vUV; + #endif + // Unpack the values from the glyph texture - vec4 glyph = texture2D(glyphs, vUV); + vec4 glyph = texture2D(glyphs, uv); float brightness = glyph.r; vec2 symbolUV = glyph.ba; - vec4 sample = texture2D(msdf, fract(vUV * numColumns) / numGlyphColumns + symbolUV); + vec4 sample = texture2D(msdf, fract(uv * numColumns) / numGlyphColumns + symbolUV); // The rest is straight up MSDF float sigDist = median(sample.r, sample.g, sample.b) - 0.5; float alpha = clamp(sigDist/fwidth(sigDist) + 0.5, 0.0, 1.0); float dscale = 0.353505 / sharpness; - vec2 duv = dscale * (dFdx(vUV) + dFdy(vUV)); + vec2 duv = dscale * (dFdx(uv) + dFdy(uv)); float isBigEnough = max(abs(duv.x), abs(duv.y)); if (isBigEnough > BIG_ENOUGH) { float ratio = BIG_ENOUGH / isBigEnough; @@ -183,6 +207,13 @@ const glyphVariable = gpuCompute.addVariable( ` }) ); + + if (isPolar) { + mesh.material.defines.isPolar = 1.0; + } + + // mesh.material = new THREE.MeshBasicMaterial({map: glyphRTT}); + scene.add( mesh ); let start = NaN; diff --git a/msdf_command.txt b/msdf_command.txt index 3b1b53e..a2e5ef5 100644 --- a/msdf_command.txt +++ b/msdf_command.txt @@ -1,2 +1,3 @@ ./msdfgen/out/msdfgen msdf -svg ./svg\ sources/texture_simplified.svg -size 512 512 -pxrange 4 -o ./matrixcode_msdf.png ./msdfgen/out/msdfgen msdf -svg ./svg\ sources/gothic_texture_simplified.svg -size 512 512 -pxrange 4 -o ./gothic_msdf.png +./msdfgen/out/msdfgen msdf -svg ./svg\ sources/coptic_texture_simplified.svg -size 512 512 -pxrange 4 -o ./coptic_msdf.png diff --git a/svg sources/coptic_texture_simplified.svg b/svg sources/coptic_texture_simplified.svg new file mode 100644 index 0000000..20e3838 --- /dev/null +++ b/svg sources/coptic_texture_simplified.svg @@ -0,0 +1,150 @@ + + + + +