paint method
Performs direct rendering modifications to the relative buffer.
Implementation
@override
void paint(Buffer buffer, Rect area, Style baseStyle) {
final trigger = triggerPoint;
if (trigger == null || !isVisible) return;
final p = progress;
final W = area.width;
final H = area.height;
if (W <= 0 || H <= 0) return;
// Compensate for 2:1 character cell aspect ratio when computing boundaries
final corners = [
const Point<double>(0, 0),
Point<double>(W - 1.0, 0),
Point<double>(0, H - 1.0),
Point<double>(W - 1.0, H - 1.0),
];
double maxDistance = 1.0;
for (final corner in corners) {
final dx = corner.x - trigger.x;
final dy = (corner.y - trigger.y) * 2.0;
final dist = sqrt(dx * dx + dy * dy);
if (dist > maxDistance) {
maxDistance = dist;
}
}
final waveRadius = p * maxDistance;
for (var y = 0; y < H; y++) {
for (var x = 0; x < W; x++) {
final cell = buffer.getCell(x, y);
if (cell == null) continue;
final dx = x - trigger.x;
final dy = (y - trigger.y) * 2.0; // Aspect ratio adjustment
final d = sqrt(dx * dx + dy * dy);
if (d <= waveRadius) {
final radialFactor = (1.0 - (d / (maxDistance * 1.2))).clamp(
0.0,
1.0,
);
final fadeFactor = radialFactor * (1.0 - p) + p;
final originalBg =
cell.style.background ?? baseStyle.background ?? Colors.black;
final blendedBg = interpolateColor(
originalBg,
rippleColor,
fadeFactor,
);
cell.style = cell.style.merge(Style(background: blendedBg));
}
}
}
}