use plurimus::core::TerminalWidget;
use plurimus::core::raster::HalfblockGrid;
use plurimus::core::ratatui_core::buffer::Buffer;
use plurimus::core::ratatui_core::layout::Rect;
use plurimus::core::ratatui_core::style::Color;
pub struct Waveform {
phase: u16,
}
impl Waveform {
pub const fn new(phase: u16) -> Self {
Self { phase }
}
const fn height(&self, column: u16, subcells: u16) -> u16 {
let raw = column.wrapping_mul(5).wrapping_add(self.phase) % 32;
raw * subcells / 32
}
}
impl TerminalWidget for Waveform {
fn render(&self, area: Rect, buffer: &mut Buffer) {
let mut grid = HalfblockGrid::new(area);
let subcells = grid.subcell_area();
for column in 0..subcells.width {
let height = self.height(column, subcells.height);
for step in 0..height {
let sub_y = subcells.bottom() - 1 - step;
let lit = 80 + u8::try_from(step * 5).unwrap_or(u8::MAX).min(160);
grid.set(subcells.x + column, sub_y, Color::Rgb(40, lit, 200));
}
}
grid.resolve_into(buffer);
}
}