@@ -10,14 +10,14 @@ struct Uniforms {
1010 noiseStrength : f32 ,
1111 displacementAmount : f32 ,
1212 animationPhase : f32 ,
13- rippleX : f32 ,
14- rippleY : f32 ,
15- rippleTime : f32 ,
16- rippleStrength : f32 ,
1713 scalePulse : f32 ,
1814 parallaxStrength : f32 ,
19- padding1 : f32 ,
20- padding2 : f32 ,
15+ _pad0 : f32 ,
16+ _pad1 : f32 ,
17+ ripple0 : vec4 <f32 >,
18+ ripple1 : vec4 <f32 >,
19+ ripple2 : vec4 <f32 >,
20+ ripple3 : vec4 <f32 >,
2121}
2222
2323struct VertexInput {
@@ -76,6 +76,37 @@ fn fbm(p: vec2<f32>, octaves: i32) -> f32 {
7676 return value ;
7777}
7878
79+ // Apply a single ripple effect and return displaced position
80+ fn applyRipple (pos : vec2 <f32 >, ripple : vec4 <f32 >, currentTime : f32 ) -> vec2 <f32 > {
81+ let rippleX = ripple . x ;
82+ let rippleY = ripple . y ;
83+ let rippleTime = ripple . z ;
84+ let rippleStrength = ripple . w ;
85+
86+ let timeSinceRipple = currentTime - rippleTime ;
87+ if (timeSinceRipple < 0 .0 || timeSinceRipple >= 2 .0 ) {
88+ return vec2 <f32 >(0 .0 , 0 .0 );
89+ }
90+
91+ let rippleCenter = vec2 <f32 >(rippleX , rippleY );
92+ let distToRipple = length (pos - rippleCenter );
93+
94+ let rippleSpeed = 0 .8 ;
95+ let rippleRadius = timeSinceRipple * rippleSpeed ;
96+ let rippleWidth = 0 .3 ;
97+
98+ let distFromWave = abs (distToRipple - rippleRadius );
99+ let rippleIntensity = smoothstep (rippleWidth , 0 .0 , distFromWave );
100+ let rippleDecay = 1 .0 - (timeSinceRipple / 2 .0 );
101+
102+ if (distToRipple > 0 .01 ) {
103+ let rippleDir = normalize (pos - rippleCenter );
104+ let rippleAmount = rippleIntensity * rippleDecay * rippleStrength ;
105+ return rippleDir * rippleAmount * sin (distToRipple * 10 .0 - timeSinceRipple * 5 .0 );
106+ }
107+ return vec2 <f32 >(0 .0 , 0 .0 );
108+ }
109+
79110// Smooth layer separation based on index
80111fn layerOffset (layerIdx : f32 , time : f32 ) -> vec2 <f32 > {
81112 // Each layer moves in a different circular pattern
@@ -103,42 +134,22 @@ fn main(input: VertexInput) -> VertexOutput {
103134 // Layer-based displacement (creates depth/parallax)
104135 let layerDisplacement = layerOffset (input . layerIndex , uniforms . time );
105136
106- // Combine displacements
137+ // Combine displacements with breathing modulation (~8s period, ±15%)
138+ let breathing = sin (uniforms . time * 0 .8 ) * 0 .15 + 1 .0 ;
107139 let noiseDisplacement = vec2 <f32 >(
108140 noise2D (pos + vec2 <f32 >(0 .0 , uniforms . time * 0 .2 )) * uniforms . displacementAmount ,
109141 noise2D (pos + vec2 <f32 >(100 .0 , uniforms . time * 0 .2 )) * uniforms . displacementAmount
110- );
142+ ) * breathing ;
111143
112144 // Apply all displacements
113145 pos += noiseDisplacement * uniforms . noiseStrength ;
114146 pos += layerDisplacement ;
115147
116- // --- RIPPLE EFFECT ---
117- // Check if there's an active ripple (rippleTime >= 0 and recent)
118- let timeSinceRipple = uniforms . time - uniforms . rippleTime ;
119- if (timeSinceRipple >= 0 .0 && timeSinceRipple < 2 .0 ) {
120- let rippleCenter = vec2 <f32 >(uniforms . rippleX , uniforms . rippleY );
121- let distToRipple = length (pos - rippleCenter );
122-
123- // Expanding wave pattern
124- let rippleSpeed = 0 .8 ;
125- let rippleRadius = timeSinceRipple * rippleSpeed ;
126- let rippleWidth = 0 .3 ;
127-
128- // Wave intensity based on distance from wave front
129- let distFromWave = abs (distToRipple - rippleRadius );
130- let rippleIntensity = smoothstep (rippleWidth , 0 .0 , distFromWave );
131-
132- // Decay over time
133- let rippleDecay = 1 .0 - (timeSinceRipple / 2 .0 );
134-
135- // Apply ripple displacement
136- if (distToRipple > 0 .01 ) {
137- let rippleDir = normalize (pos - rippleCenter );
138- let rippleAmount = rippleIntensity * rippleDecay * uniforms . rippleStrength ;
139- pos += rippleDir * rippleAmount * sin (distToRipple * 10 .0 - timeSinceRipple * 5 .0 );
140- }
141- }
148+ // --- RIPPLE EFFECTS (4 concurrent slots) ---
149+ pos += applyRipple (pos , uniforms . ripple0 , uniforms . time );
150+ pos += applyRipple (pos , uniforms . ripple1 , uniforms . time );
151+ pos += applyRipple (pos , uniforms . ripple2 , uniforms . time );
152+ pos += applyRipple (pos , uniforms . ripple3 , uniforms . time );
142153
143154 // --- PARALLAX EFFECT ---
144155 // Mouse-based parallax (layers at different depths move differently)
0 commit comments