mirror of
https://github.com/exoticorn/microw8.git
synced 2026-01-20 11:16:42 +01:00
60 lines
1.8 KiB
Rust
60 lines
1.8 KiB
Rust
use std::time::Instant;
|
|
use uw8_window::WindowConfig;
|
|
|
|
fn main() {
|
|
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
|
|
|
|
let mut args = pico_args::Arguments::from_env();
|
|
|
|
let mut framebuffer = vec![0u8; 320 * 240];
|
|
let mut start_time = Instant::now();
|
|
|
|
let mut palette = vec![0u32; 256];
|
|
for i in 0..256 {
|
|
let v = i & 15;
|
|
let r = ((i >> 2) & 12) * v;
|
|
let g = ((i >> 3) & 12) * v;
|
|
let b = ((i >> 4) & 12) * v;
|
|
palette[i as usize] = r + (g << 8) + (b << 16);
|
|
}
|
|
|
|
let mut fps_start = Instant::now();
|
|
let mut fps_counter = 0;
|
|
|
|
let mut window_config = WindowConfig::default();
|
|
window_config.parse_arguments(&mut args);
|
|
|
|
let mut window = uw8_window::Window::new(window_config).unwrap();
|
|
|
|
while window.is_open() {
|
|
let input = window.begin_frame();
|
|
if input.reset {
|
|
start_time = Instant::now();
|
|
}
|
|
draw_frame(&mut framebuffer, start_time.elapsed().as_secs_f32());
|
|
window.end_frame(&framebuffer, bytemuck::cast_slice(&palette), Instant::now());
|
|
|
|
fps_counter += 1;
|
|
let elapsed = fps_start.elapsed().as_secs_f32();
|
|
if elapsed >= 1.0 {
|
|
println!("{:.1} fps", fps_counter as f32 / elapsed);
|
|
fps_start = Instant::now();
|
|
fps_counter = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
fn draw_frame(framebuffer: &mut [u8], time: f32) {
|
|
for x in 0..320 {
|
|
let xr = x as f32 - 160.0;
|
|
for y in 0..240 {
|
|
let yr = y as f32 - 120.0;
|
|
let f = 8192.0 / (xr * xr + yr * yr);
|
|
let u = xr * f + 512.0 + time * 32.0;
|
|
let v = yr * f + time * 29.0;
|
|
let c = (u.floor() as i32 ^ v.floor() as i32) as u32;
|
|
framebuffer[x + y * 320] = c as u8;
|
|
}
|
|
}
|
|
}
|