mirror of
https://github.com/Rezmason/matrix.git
synced 2026-04-18 22:29:28 -07:00
Adding intro and skipIntro option
This commit is contained in:
@@ -61,7 +61,7 @@ vec2 getUV(vec2 uv) {
|
||||
|
||||
vec3 getBrightness(vec4 raindrop, vec4 effect, float quadDepth, vec2 uv) {
|
||||
|
||||
float base = raindrop.r;
|
||||
float base = raindrop.r + max(0., 1.0 - raindrop.a * 5.0);
|
||||
bool isCursor = bool(raindrop.g) && isolateCursor;
|
||||
float glint = base;
|
||||
float multipliedEffects = effect.r;
|
||||
@@ -94,7 +94,7 @@ vec3 getBrightness(vec4 raindrop, vec4 effect, float quadDepth, vec2 uv) {
|
||||
return vec3(
|
||||
(isCursor ? vec2(0.0, 1.0) : vec2(1.0, 0.0)) * base,
|
||||
glint
|
||||
);
|
||||
) * raindrop.b;
|
||||
}
|
||||
|
||||
vec2 getSymbolUV(float index) {
|
||||
|
||||
59
shaders/glsl/rainPass.intro.frag.glsl
Normal file
59
shaders/glsl/rainPass.intro.frag.glsl
Normal file
@@ -0,0 +1,59 @@
|
||||
precision highp float;
|
||||
|
||||
// This shader governs the "intro"— the initial stream of rain from a blank screen.
|
||||
// It writes falling rain to the channels of a data texture:
|
||||
// R: raindrop length
|
||||
// G: unused
|
||||
// B: unused
|
||||
// A: unused
|
||||
|
||||
#define PI 3.14159265359
|
||||
#define SQRT_2 1.4142135623730951
|
||||
#define SQRT_5 2.23606797749979
|
||||
|
||||
uniform sampler2D previousIntroState;
|
||||
uniform float numColumns, numRows;
|
||||
uniform float time, tick;
|
||||
uniform float animationSpeed, fallSpeed;
|
||||
|
||||
uniform bool skipIntro;
|
||||
|
||||
// Helper functions for generating randomness, borrowed from elsewhere
|
||||
|
||||
highp float randomFloat( 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);
|
||||
}
|
||||
|
||||
vec2 randomVec2( const in vec2 uv ) {
|
||||
return fract(vec2(sin(uv.x * 591.32 + uv.y * 154.077), cos(uv.x * 391.32 + uv.y * 49.077)));
|
||||
}
|
||||
|
||||
float wobble(float x) {
|
||||
return x + 0.3 * sin(SQRT_2 * x) + 0.2 * sin(SQRT_5 * x);
|
||||
}
|
||||
|
||||
// Main function
|
||||
|
||||
vec4 computeResult(float simTime, bool isFirstFrame, vec2 glyphPos, vec2 screenPos, vec4 previous) {
|
||||
if (skipIntro) {
|
||||
return vec4(1., 0., 0., 0.);
|
||||
}
|
||||
|
||||
float columnTimeOffset = randomFloat(vec2(glyphPos.x, 0.)) * -10.;
|
||||
columnTimeOffset += sin(glyphPos.x / numColumns * PI) - 1.;
|
||||
float introTime = (simTime + columnTimeOffset) * fallSpeed / numRows * 100.;
|
||||
|
||||
vec4 result = vec4(introTime, 0., 0., 0.);
|
||||
return result;
|
||||
}
|
||||
|
||||
void main() {
|
||||
float simTime = time * animationSpeed;
|
||||
bool isFirstFrame = tick <= 1.;
|
||||
vec2 glyphPos = gl_FragCoord.xy;
|
||||
vec2 screenPos = glyphPos / vec2(numColumns, numRows);
|
||||
vec4 previous = texture2D( previousIntroState, screenPos );
|
||||
gl_FragColor = computeResult(simTime, isFirstFrame, glyphPos, screenPos, previous);
|
||||
}
|
||||
@@ -4,7 +4,7 @@ precision highp float;
|
||||
// It writes falling rain to the channels of a data texture:
|
||||
// R: raindrop brightness
|
||||
// G: whether the cell is a "cursor"
|
||||
// B: unused
|
||||
// B: whether the cell is "activated" — to animate the intro
|
||||
// A: unused
|
||||
|
||||
// Listen.
|
||||
@@ -16,15 +16,14 @@ precision highp float;
|
||||
#define SQRT_2 1.4142135623730951
|
||||
#define SQRT_5 2.23606797749979
|
||||
|
||||
uniform sampler2D previousShineState;
|
||||
uniform sampler2D previousRaindropState, introState;
|
||||
uniform float numColumns, numRows;
|
||||
uniform float time, tick;
|
||||
uniform float animationSpeed, fallSpeed;
|
||||
|
||||
uniform bool loops;
|
||||
uniform bool loops, skipIntro;
|
||||
uniform float brightnessDecay;
|
||||
uniform float baseContrast, baseBrightness;
|
||||
uniform float raindropLength, glyphHeightToWidth;
|
||||
uniform float raindropLength;
|
||||
|
||||
// Helper functions for generating randomness, borrowed from elsewhere
|
||||
|
||||
@@ -61,10 +60,17 @@ float getRainBrightness(float simTime, vec2 glyphPos) {
|
||||
|
||||
// Main function
|
||||
|
||||
vec4 computeResult(float simTime, bool isFirstFrame, vec2 glyphPos, vec2 screenPos, vec4 previous) {
|
||||
vec4 computeResult(float simTime, bool isFirstFrame, vec2 glyphPos, vec4 previous, vec4 intro) {
|
||||
float brightness = getRainBrightness(simTime, glyphPos);
|
||||
float brightnessBelow = getRainBrightness(simTime, glyphPos + vec2(0., -1.));
|
||||
float cursor = brightness > brightnessBelow ? 1.0 : 0.0;
|
||||
|
||||
float introProgress = intro.r - (1. - glyphPos.y / numRows);
|
||||
float introProgressBelow = intro.r - (1. - (glyphPos.y - 1.) / numRows);
|
||||
|
||||
bool activated = bool(previous.b) || skipIntro || introProgress > 0.;
|
||||
bool activatedBelow = skipIntro || introProgressBelow > 0.;
|
||||
|
||||
bool cursor = brightness > brightnessBelow || (activated && !activatedBelow);
|
||||
|
||||
// Blend the glyph's brightness with its previous brightness, so it winks on and off organically
|
||||
if (!isFirstFrame) {
|
||||
@@ -72,7 +78,7 @@ vec4 computeResult(float simTime, bool isFirstFrame, vec2 glyphPos, vec2 screenP
|
||||
brightness = mix(previousBrightness, brightness, brightnessDecay);
|
||||
}
|
||||
|
||||
vec4 result = vec4(brightness, cursor, 0.0, 0.0);
|
||||
vec4 result = vec4(brightness, cursor, activated, introProgress);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -81,6 +87,7 @@ void main() {
|
||||
bool isFirstFrame = tick <= 1.;
|
||||
vec2 glyphPos = gl_FragCoord.xy;
|
||||
vec2 screenPos = glyphPos / vec2(numColumns, numRows);
|
||||
vec4 previous = texture2D( previousShineState, screenPos );
|
||||
gl_FragColor = computeResult(simTime, isFirstFrame, glyphPos, screenPos, previous);
|
||||
vec4 previous = texture2D( previousRaindropState, screenPos );
|
||||
vec4 intro = texture2D( introState, vec2(screenPos.x, 0.) );
|
||||
gl_FragColor = computeResult(simTime, isFirstFrame, glyphPos, previous, intro);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user