diff --git a/TODO.txt b/TODO.txt index 29ef061..314399a 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,105 +1,105 @@ TODO: WebGPU formulate is expensive - Mirror pass clicks bug + Mirror pass clicks bug - Minify bundles - Naming "matrix" for the github repo, "digital-rain" and "DigitalRain" for everything else - Minimum react requirement? - Retire fetchLibraries? - Move off of regl - Unify implementations? - Responsive changes - Move start time to rain object - Matrix component should record, then overwrite it - Reshape all passes to react to config changes, ie. "configure" - main.js "formulate" --> "configure" - simple deltas only require updating the uniforms - return boolean of whether all deltas are simple - Resource changes are simple if they're cached and loaded, false otherwise - remake the pipeline if anything returns false - Core vs full - core - One embedded MSDF, combined from the two main glyph sets and their configs - full - Other MSDFs and configs - and then one with built-in MSDF generation - (TTF + glyphString) --> MSDF - Is MSDF strictly necessary? - Expanded configurability - Modify regl pass - async build(config, inputs) - loads all required stuff - async resize - adjusts the sizes - run — performs the GPU operation - Rewrite main code to accept changes to config + Minify bundles + Naming "matrix" for the github repo, "digital-rain" and "DigitalRain" for everything else + Minimum react requirement? + Retire fetchLibraries? + Move off of regl + Unify implementations? + Responsive changes + Move start time to rain object + Matrix component should record, then overwrite it + Reshape all passes to react to config changes, ie. "configure" + main.js "formulate" --> "configure" + simple deltas only require updating the uniforms + return boolean of whether all deltas are simple + Resource changes are simple if they're cached and loaded, false otherwise + remake the pipeline if anything returns false + Core vs full + core + One embedded MSDF, combined from the two main glyph sets and their configs + full + Other MSDFs and configs + and then one with built-in MSDF generation + (TTF + glyphString) --> MSDF + Is MSDF strictly necessary? + Expanded configurability + Modify regl pass + async build(config, inputs) + loads all required stuff + async resize - adjusts the sizes + run — performs the GPU operation + Rewrite main code to accept changes to config Build a Tweakpane for config - https://cocopon.github.io/tweakpane - Show a gear emoji in the top right on mouse move - Hide after three seconds - If tapped, show the tweakpane + https://cocopon.github.io/tweakpane + Show a gear emoji in the top right on mouse move + Hide after three seconds + If tapped, show the tweakpane Seems like bloom size and resolution impact the REGL and WebGPU bloom implementations differently - Move high pass into WebGPU bloom + Move high pass into WebGPU bloom Dithering bug on mobile? - Looks like a subtle fade occurring at a per-second interval + Looks like a subtle fade occurring at a per-second interval Write an explanation of the rain pass (and include images) - Compute - Volumetric quads - Fullscreen quad and spacial mapping - MSDFs + Compute + Volumetric quads + Fullscreen quad and spacial mapping + MSDFs Audio system - Toggle (or number representing frequency) - Load the sound effect - Play it multiple times with delay - Random pan - Random volume? - Randomize pitch a little? + Toggle (or number representing frequency) + Load the sound effect + Play it multiple times with delay + Random pan + Random volume? + Randomize pitch a little? Playdate version - Audio system - Falling sound - Launch sound - Undocking sound - Docking sound - Maybe crank sounds? Not sure yet + Audio system + Falling sound + Launch sound + Undocking sound + Docking sound + Maybe crank sounds? Not sure yet Support Resurrections SDF bevel and "lights" - https://shaderfun.com/2018/07/23/signed-distance-fields-part-8-gradients-bevels-and-noise/ - Get the "normals" and color right - Note: even completely dark glyphs can have glint on their edges - "Golden hour" - Stuff MSDF-derived normal vectors from rain pass frag into two of its output channels - Anomaly mode toggles between this and anomaly streaks + https://shaderfun.com/2018/07/23/signed-distance-fields-part-8-gradients-bevels-and-noise/ + Get the "normals" and color right + Note: even completely dark glyphs can have glint on their edges + "Golden hour" + Stuff MSDF-derived normal vectors from rain pass frag into two of its output channels + Anomaly mode toggles between this and anomaly streaks WebGPU - Try https://github.com/brendan-duncan/wgsl_reflect - Get rid of end pass once it's possible to copy a bgra8unorm to a canvas texture - Switch to rgba32float somehow? - Why isn't this straightforward? - Try shorthand - Share a bind group and layout just for time? - Try using a buffer for the stripe pass 1D texture + Try https://github.com/brendan-duncan/wgsl_reflect + Get rid of end pass once it's possible to copy a bgra8unorm to a canvas texture + Switch to rgba32float somehow? + Why isn't this straightforward? + Try shorthand + Share a bind group and layout just for time? + Try using a buffer for the stripe pass 1D texture Improve loop support Idea: Build a UI - Replace versions with presets - Simple changes update the values - Complex changes replace the pipeline - Make it a form, so it's accessible - Then, make it look cool like the UI from the old site + Replace versions with presets + Simple changes update the values + Complex changes replace the pipeline + Make it a form, so it's accessible + Then, make it look cool like the UI from the old site Maybe pay someone to make Mac/Windows screensavers Zion Control's matrix variant - From Reloaded + From Reloaded gpu-buffer, working title - Support type aliasing (type Q = array) - Support shorthand (vec4f) - Build mocha tests, example project - Give it its own repo, microsite + Support type aliasing (type Q = array) + Support shorthand (vec4f) + Build mocha tests, example project + Give it its own repo, microsite diff --git a/shaders/glsl/quiltPass.frag.glsl b/shaders/glsl/quiltPass.frag.glsl index 3aeb889..043167f 100644 --- a/shaders/glsl/quiltPass.frag.glsl +++ b/shaders/glsl/quiltPass.frag.glsl @@ -13,10 +13,10 @@ uniform vec2 quiltViewPortion; varying vec2 vUV; vec2 texArr(vec3 uvz) { - float z = floor(uvz.z * tileX * tileY); - float x = (mod(z, tileX) + uvz.x) / tileX; - float y = (floor(z / tileX) + uvz.y) / tileY; - return vec2(x, y) * quiltViewPortion; + float z = floor(uvz.z * tileX * tileY); + float x = (mod(z, tileX) + uvz.x) / tileX; + float y = (floor(z / tileX) + uvz.y) / tileY; + return vec2(x, y) * quiltViewPortion; } float remap(float value, float from1, float to1, float from2, float to2) { @@ -24,19 +24,19 @@ float remap(float value, float from1, float to1, float from2, float to2) { } void main() { - vec4 rgb[3]; - vec3 nuv = vec3(vUV.xy, 0.0); + vec4 rgb[3]; + vec3 nuv = vec3(vUV.xy, 0.0); - // Flip UVs if necessary - nuv.x = (1.0 - flipImageX) * nuv.x + flipImageX * (1.0 - nuv.x); - nuv.y = (1.0 - flipImageY) * nuv.y + flipImageY * (1.0 - nuv.y); + // Flip UVs if necessary + nuv.x = (1.0 - flipImageX) * nuv.x + flipImageX * (1.0 - nuv.x); + nuv.y = (1.0 - flipImageY) * nuv.y + flipImageY * (1.0 - nuv.y); - for (int i = 0; i < 3; i++) { - nuv.z = (vUV.x + float(i) * subp + vUV.y * tilt) * pitch - center; - nuv.z = mod(nuv.z + ceil(abs(nuv.z)), 1.0); - nuv.z = (1.0 - invView) * nuv.z + invView * (1.0 - nuv.z); - rgb[i] = texture2D(quiltTexture, texArr(vec3(vUV.x, vUV.y, nuv.z))); - } + for (int i = 0; i < 3; i++) { + nuv.z = (vUV.x + float(i) * subp + vUV.y * tilt) * pitch - center; + nuv.z = mod(nuv.z + ceil(abs(nuv.z)), 1.0); + nuv.z = (1.0 - invView) * nuv.z + invView * (1.0 - nuv.z); + rgb[i] = texture2D(quiltTexture, texArr(vec3(vUV.x, vUV.y, nuv.z))); + } - gl_FragColor = vec4(rgb[0].r, rgb[1].g, rgb[2].b, 1); + gl_FragColor = vec4(rgb[0].r, rgb[1].g, rgb[2].b, 1); }