Мы с любовью продумали каждую деталь нашего праздника, поэтому будем рады, если вы поддержите атмосферу торжества и соблюдёте дресс-код..
function initParticles() {
var n = Math.min(C.maxCount, Math.round(W * H * C.density));
ps = [];
for (var i = 0; i < n; i++) {
ps.push(mk());
}
}
function resize() {
DPR = Math.min(window.devicePixelRatio || 1, 2);
W = window.innerWidth;
H = window.innerHeight;
cv.width = Math.round(W * DPR);
cv.height = Math.round(H * DPR);
ctx.setTransform(DPR, 0, 0, DPR, 0, 0);
initParticles();
}
function frame() {
t += 0.016;
var sc = window.pageYOffset || 0;
var d = sc - lastScroll;
lastScroll = sc;
var ad = Math.abs(d);
var buf = 110;
ctx.clearRect(0, 0, W, H);
if (ready) {
for (var i = 0; i < ps.length; i++) {
var b = ps[i];
b.head += Math.sin(t * b.turnf + b.turnp) * 0.03 +
Math.sin(t * b.turnf * 2.3 + b.turnp) * 0.015;
var ex = 0;
var ey = 0;
if (b.x < buf) {
ex = 1 - b.x / buf;
} else if (b.x > W - buf) {
ex = -(1 - (W - b.x) / buf);
}
if (b.y < buf) {
ey = 1 - b.y / buf;
} else if (b.y > H - buf) {
ey = -(1 - (H - b.y) / buf);
}
if (ex || ey) {
var toIn = Math.atan2(ey, ex);
var diff = Math.atan2(Math.sin(toIn - b.head), Math.cos(toIn - b.head));
b.head += diff * 0.06 * Math.max(Math.abs(ex), Math.abs(ey));
}
var flapRaw = Math.sin(t * b.ff + b.fp);
var flap = Math.abs(flapRaw);
var thrust = 0.55 + 0.45 * Math.max(0, flapRaw);
var glide = 0.7 + 0.3 * Math.sin(t * b.glidef + b.glidep);
if (ad > 0) {
b.boost += Math.min(ad * 0.04 * C.startle, 2.2);
b.head += (Math.random() - 0.5) * Math.min(ad * 0.008, 0.4) * C.startle;
}
b.boost *= 0.93;
var spd = b.baseSpeed * thrust * glide * (1 + b.boost);
var bob = Math.sin(t * b.bobf + b.bobp) * 0.5 + flapRaw * 0.6;
b.x += Math.cos(b.head) * spd;
b.y += Math.sin(b.head) * spd + bob;
var m = b.size * 0.42;
if (b.x < m) {
b.x = m;
b.head = Math.PI - b.head;
} else if (b.x > W - m) {
b.x = W - m;
b.head = Math.PI - b.head;
}
if (b.y < m) {
b.y = m;
b.head = -b.head;
} else if (b.y > H - m) {
b.y = H - m;
b.head = -b.head;
}
var tilt = Math.sin(b.head) * 0.18 + flapRaw * 0.06;
var sx = 0.45 + 0.55 * flap;
ctx.globalAlpha = Math.max(0, Math.min(1, b.a * C.opacity));
ctx.translate(b.x, b.y);
ctx.rotate(tilt);
ctx.scale(sx, 1);
var w = b.size;
var h = b.size / AR;
ctx.drawImage(img, -w / 2, -h / 2, w, h);
ctx.setTransform(DPR, 0, 0, DPR, 0, 0);
}
ctx.globalAlpha = 1;
}
requestAnimationFrame(frame);
}
var rt;
function onResize() {
clearTimeout(rt);
rt = setTimeout(resize, 150);
}
resize();
requestAnimationFrame(frame);
window.addEventListener("resize", onResize);
window.addEventListener("load", resize);
})();