#![feature(int_to_from_bytes)]
use kiss2d::{Canvas, Font, Key, meter::Meter};
use kiss2d::clrs::*;
use std::time::{Instant, Duration};
const WIDTH: usize = 1280;
const HEIGHT: usize = 720;
static TITLE: &str = "Noise Test - Press ESC to exit";
static FONT_DATA: &[u8] = include_bytes!("Roboto-Regular.ttf");
struct Noise {
seed: u32,
}
impl Noise {
fn new() -> Self {
Self { seed: 0xBEEF }
}
fn take(&mut self) -> u32 {
let mut noise = self.seed;
noise >>= 3;
noise ^= self.seed;
let carry = noise & 1;
self.seed >>= 1;
self.seed |= carry << 30;
noise >> 1
}
}
fn main() -> minifb::Result<()> {
let mut canvas = Canvas::new(TITLE, WIDTH, HEIGHT)?;
let font = Font::from_bytes(FONT_DATA).expect("Error constructing Font");
let mut time = Instant::now();
let mut frame = 0;
let mut text = String::new();
let mut meter = Meter::new();
let mut noise = Noise::new();
while canvas.is_open() && !canvas.is_keydown(Key::Escape) {
let elapsed = time.elapsed();
frame += 1;
if elapsed >= Duration::from_secs(1) {
let n = duration_to_secs(elapsed) / frame as f32;
text = format!("FPS: {}\nms: {:?}", frame, secs_to_duration(n));
time += elapsed;
frame = 0;
}
for i in canvas.buffer_mut().iter_mut() {
let n = noise.take() & 0b01_1111;
*i = n << 16 | n << 8 | n;
}
meter.render(&mut canvas, 0, 0);
canvas.text(&font, 18.0, (70.0, 0.0), WHITE, &text);
canvas.circle((80, 80), 30, MAROON);
for i in 0..400 {
canvas.line((400, i * 2), (400 - i, 200 + i % 10), AQUA);
}
canvas.udpate();
if let Some(mouse) = canvas.mouse_pos() {
let mouse = (mouse.0 as isize, mouse.1 as isize);
let center = (WIDTH as isize / 2, HEIGHT as isize / 2);
canvas.line(center, mouse, RED);
}
canvas.keys(|t| match t {
Key::W => println!("holding w!"),
Key::T => println!("holding t!"),
_ => (),
});
canvas.redraw()?;
}
Ok(())
}
pub fn duration_to_secs(duration: Duration) -> f32 {
duration.as_secs() as f32 + (duration.subsec_nanos() as f32 / 1.0e9)
}
pub fn secs_to_duration(secs: f32) -> Duration {
Duration::new(secs as u64, ((secs % 1.0) * 1.0e9) as u32)
}