function drawScene(time) {
ctx.fillStyle = 'rgb(' + colors.base.join(',') + ')';
ctx.fillRect(0, 0, width, height);
var lead = trail[0];
var middle = trail[3];
var tail = trail[6];
var leadX = lead.x - 0.5;
var leadY = lead.y - 0.5;
var middleX = middle.x - 0.5;
var middleY = middle.y - 0.5;
var tailX = tail.x - 0.5;
var tailY = tail.y - 0.5;
/* Мягкое розовое свечение слева */
drawBlob(
-0.02 + tailX * 0.035,
0.20 + tailY * 0.025,
0.43,
0.58,
-0.24,
colors.rose,
0.72
);
/* Главная фиолетовая область */
drawBlob(
0.57 + middleX * 0.045,
0.38 + middleY * 0.035,
0.34 + pointerSpeed * 0.018,
0.61 + pointerSpeed * 0.018,
0.13 + pointerSpeed * 0.045,
colors.violet,
0.60
);
/* Нижний фиолетовый перелив */
drawBlob(
0.72 + leadX * 0.030,
0.67 + leadY * 0.025,
0.22,
0.42,
-0.16,
colors.violet,
0.25
);
/* Светлая центральная зона */
drawBlob(
0.31 - middleX * 0.025,
0.88 - middleY * 0.030,
0.48,
0.45,
0.08,
colors.white,
0.78
);
/* Лёгкий розовый оттенок снизу */
drawBlob(
0.76 + tailX * 0.020,
0.90 - tailY * 0.018,
0.22,
0.30,
-0.18,
colors.rose,
0.35
);
/*
* Очень мягкая реакция на курсор.
* Только два широких пятна — без кругов и резкого следа.
*/
if (pointerActive && !reducedMotion) {
var direction = Math.atan2(
lead.y - tail.y,
lead.x - tail.x
);
var wakeX = Math.min(0.84, lead.x);
var wakeMiddleX = Math.min(0.83, middle.x);
drawBlob(
wakeMiddleX,
middle.y,
0.19 + pointerSpeed * 0.07,
0.105,
direction,
colors.rose,
0.028 + pointerSpeed * 0.018
);
drawBlob(
wakeX,
lead.y,
0.15 + pointerSpeed * 0.055,
0.085,
direction,
colors.violet,
0.025 + pointerSpeed * 0.020
);
}
/*
* Аккуратное завершение градиента справа.
* После фиолетовой области остаётся полоса базового фона.
*/
var rightCut = ctx.createLinearGradient(
width * 0.83,
0,
width,
0
);
rightCut.addColorStop(0, rgba(colors.base, 0));
rightCut.addColorStop(0.42, rgba(colors.base, 0.54));
rightCut.addColorStop(0.72, rgba(colors.base, 0.93));
rightCut.addColorStop(1, rgba(colors.base, 1));
ctx.fillStyle = rightCut;
ctx.fillRect(
width * 0.83,
0,
width * 0.17,
height
);
}