mirror of
https://github.com/Qz3rK/tdesktop.git
synced 2026-07-03 14:15:08 +02:00
54 lines
1.3 KiB
Plaintext
54 lines
1.3 KiB
Plaintext
#version 450
|
|
|
|
layout(local_size_x = 64) in;
|
|
|
|
struct Particle {
|
|
vec2 offset;
|
|
vec2 velocity;
|
|
float lifetime;
|
|
float _pad;
|
|
};
|
|
|
|
layout(std430, binding = 0) buffer Particles {
|
|
Particle particles[];
|
|
};
|
|
|
|
layout(std140, binding = 1) uniform Params {
|
|
uint particleCountX;
|
|
uint particleCountY;
|
|
float phase;
|
|
float timeStep;
|
|
};
|
|
|
|
float easeInWindow(float fraction, float t) {
|
|
float windowSize = 0.8;
|
|
float windowStart = -windowSize;
|
|
float windowEnd = 1.0;
|
|
float windowPos = (1.0 - fraction) * windowStart + fraction * windowEnd;
|
|
float windowT = clamp(t - windowPos, 0.0, windowSize) / windowSize;
|
|
return 1.0 - windowT;
|
|
}
|
|
|
|
void main() {
|
|
uint gid = gl_GlobalInvocationID.x;
|
|
uint count = particleCountX * particleCountY;
|
|
if (gid >= count) {
|
|
return;
|
|
}
|
|
|
|
float easeInDuration = 0.8;
|
|
float effectFraction = clamp(phase, 0.0, easeInDuration) / easeInDuration;
|
|
|
|
uint particleX = gid % particleCountX;
|
|
float particleXFraction = float(particleX) / float(particleCountX);
|
|
float particleFraction = easeInWindow(effectFraction, particleXFraction);
|
|
|
|
Particle p = particles[gid];
|
|
|
|
p.offset += p.velocity * timeStep * particleFraction;
|
|
p.velocity.y += 80.0 * timeStep * particleFraction;
|
|
p.lifetime = max(0.0, p.lifetime - 0.6 * timeStep * particleFraction);
|
|
|
|
particles[gid] = p;
|
|
}
|