diff --git a/.idea/nesrust.iml b/.idea/nesrust.iml index 8632646..72d97fe 100644 --- a/.idea/nesrust.iml +++ b/.idea/nesrust.iml @@ -6,6 +6,7 @@ + diff --git a/Cargo.lock b/Cargo.lock index 3665943..abc75e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,17 +2,29 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + [[package]] name = "core" version = "0.1.0" dependencies = [ - "bitflags", + "bitflags 2.8.0", "simplelog", "strum", ] @@ -108,22 +120,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] -name = "sdl3" -version = "0.14.14" +name = "sdl2" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e55f9adf2ac7e868746564d885f677fa797106f7c5deffa348dad3ef6e659300" +checksum = "3b498da7d14d1ad6c839729bd4ad6fc11d90a57583605f3b4df2cd709a9cd380" dependencies = [ - "bitflags", + "bitflags 1.3.2", "lazy_static", "libc", - "sdl3-sys", + "sdl2-sys", ] [[package]] -name = "sdl3-sys" -version = "0.4.3+SDL3-3.2.2" +name = "sdl2-sys" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb7ecf5e5f416b2e6408ebe1825ded6bdcac3b8c79e429aada3c79efc675e80d" +checksum = "951deab27af08ed9c6068b7b0d05a93c91f0a8eb16b6b816a5e73452a43521d3" +dependencies = [ + "cfg-if", + "libc", + "version-compare", +] [[package]] name = "serde" @@ -237,6 +254,7 @@ name = "ui" version = "0.1.0" dependencies = [ "core", + "sdl2", "simplelog", "uitlk", ] @@ -245,7 +263,7 @@ dependencies = [ name = "uitlk" version = "0.1.0" dependencies = [ - "sdl3", + "sdl2", ] [[package]] @@ -254,6 +272,12 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +[[package]] +name = "version-compare" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" + [[package]] name = "winapi-util" version = "0.1.9" diff --git a/ui/Cargo.toml b/ui/Cargo.toml index 41f6e02..0511452 100644 --- a/ui/Cargo.toml +++ b/ui/Cargo.toml @@ -8,4 +8,5 @@ edition = "2021" [dependencies] core = { path = "../core" } uitlk = { path = "../uitlk" } -simplelog = { version = "^0.12.0", features = ["paris"] } \ No newline at end of file +sdl2 = "0.37.0" +simplelog = { version = "^0.12.0", features = ["paris"] } diff --git a/ui/src/main.rs b/ui/src/main.rs index 6a32f14..c42f5dd 100644 --- a/ui/src/main.rs +++ b/ui/src/main.rs @@ -1,14 +1,22 @@ -use core::system::System; -use core::Clock; +extern crate sdl2; +mod renderer; + +use crate::renderer::Renderer; +use sdl2::event::Event; +use sdl2::rect::Point; use simplelog::*; use std::fs::File; -use std::thread::sleep; use std::time::Duration; -use uitlk::UIWindow; const ROM_PATH: &'static str = "./roms/dk.nes"; -fn main() { +const NES_WIDTH: u32 = 256; +const NES_HEIGHT: u32 = 240; +const WINDOW_SCALE: u32 = 3; +const WINDOW_WIDTH: u32 = NES_WIDTH * WINDOW_SCALE; +const WINDOW_HEIGHT: u32 = NES_HEIGHT * WINDOW_SCALE; + +fn main() -> Result<(), String> { CombinedLogger::init(vec![ TermLogger::new( LevelFilter::Info, @@ -24,19 +32,48 @@ fn main() { ]) .unwrap(); - let mut window = UIWindow::new("NesRust", 800, 600, 60); + let sdl_context = sdl2::init()?; + let video_subsystem = sdl_context.video()?; - // let mut system = System::new(); - // system.insert_rom(ROM_PATH).expect("Failed to insert ROM"); - loop { - // system.cycle(); - if window.poll_events() { - break; + let window = video_subsystem + .window("NesRust", WINDOW_WIDTH, WINDOW_HEIGHT) + .position_centered() + .opengl() + .build() + .map_err(|e| e.to_string())?; + + let mut renderer = Renderer::new(window, WINDOW_SCALE)?; + + let mut event_pump = sdl_context.event_pump()?; + 'running: loop { + for event in event_pump.poll_iter() { + match event { + Event::Quit { .. } => break 'running, + _ => {} + } } - // TODO: System loop + renderer.draw(&Point::new(1, 1))?; + ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 60)); - window.render(); - window.wait(); + // Main loop } + + Ok(()) + + // let mut window = UIWindow::new("NesRust", 800, 600, 60); + // + // // let mut system = System::new(); + // // system.insert_rom(ROM_PATH).expect("Failed to insert ROM"); + // loop { + // // system.cycle(); + // if window.poll_events() { + // break; + // } + // + // // TODO: System loop + // + // window.render(); + // window.wait(); + // } } diff --git a/ui/src/renderer.rs b/ui/src/renderer.rs new file mode 100644 index 0000000..6ea876e --- /dev/null +++ b/ui/src/renderer.rs @@ -0,0 +1,33 @@ +use sdl2::pixels::Color; +use sdl2::rect::{Point, Rect}; +use sdl2::render::WindowCanvas; +use sdl2::video::Window; + +pub struct Renderer { + canvas: WindowCanvas, + scale: u32, +} + +impl Renderer { + pub fn new(window: Window, scale: u32) -> Result { + let canvas = window.into_canvas().build().map_err(|e| e.to_string())?; + Ok(Renderer { canvas, scale }) + } + + pub fn draw(&mut self, point: &Point) -> Result<(), String> { + self.canvas.set_draw_color(Color::BLACK); + self.canvas.clear(); + + self.canvas.set_draw_color(Color::GREEN); + self.canvas.fill_rect(Rect::new( + point.x() * self.scale as i32, + point.y() * self.scale as i32, + self.scale, + self.scale, + ))?; + + self.canvas.present(); + + Ok(()) + } +} diff --git a/uitlk/Cargo.toml b/uitlk/Cargo.toml index 95f697d..5840641 100644 --- a/uitlk/Cargo.toml +++ b/uitlk/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -sdl3 = "0.14.14" \ No newline at end of file +sdl2 = "0.37.0" \ No newline at end of file diff --git a/uitlk/src/lib.rs b/uitlk/src/lib.rs index 67d3108..6f13338 100644 --- a/uitlk/src/lib.rs +++ b/uitlk/src/lib.rs @@ -1,93 +1,3 @@ mod menu; -use sdl3::event::Event; -use sdl3::keyboard::Keycode; -use sdl3::pixels::{Color, PixelFormat, PixelMasks}; -use sdl3::rect::Rect; -use sdl3::render::{FRect, WindowCanvas}; -use sdl3::surface::Surface; -use sdl3::sys::pixels::{SDL_PixelFormat, SDL_PIXELFORMAT_ARGB8888}; -use sdl3::EventPump; -use std::time::Duration; - -pub struct UIWindow { - title: &'static str, - width: u32, - height: u32, - refresh_rate: u32, - canvas: WindowCanvas, - event_pump: EventPump, -} - -impl UIWindow { - pub fn new(title: &'static str, width: u32, height: u32, refresh_rate: u32) -> Self { - let sdl_context = sdl3::init().unwrap(); - let video_subsystem = sdl_context.video().unwrap(); - - let window = video_subsystem - .window(title, width, height) - .position_centered() - .build() - .unwrap(); - - let canvas = window.into_canvas(); - let event_pump = sdl_context.event_pump().unwrap(); - - Self { - title, - width, - height, - refresh_rate, - canvas, - event_pump, - } - } - - pub fn render(&mut self) { - self.canvas.set_draw_color(Color::RGB(0, 0, 0)); - self.canvas.clear(); - - // let test = unsafe { PixelFormat::from_ll(SDL_PIXELFORMAT_ARGB8888) }; - let test = PixelFormat::try_from(SDL_PIXELFORMAT_ARGB8888).unwrap(); - - let texture_creator = self.canvas.texture_creator(); - let mut texture = texture_creator - .create_texture_static( - test, - 2, - 1, - ) - .unwrap(); - let color_buffer = vec![0x0, 0x0, 0xff, 0xff, 0x0, 0xff, 0x0, 0xff]; - texture.update(None, &color_buffer, 4).unwrap(); - - self.canvas.copy(&texture, None, Rect::new(10, 10, 50, 50)).unwrap(); - - self.canvas.present(); - } - - /// Poll and processes events. - /// - /// # Returns - /// `true` if there was a "Quit" event (meaning the user want to close the window) - pub fn poll_events(&mut self) -> bool { - for event in self.event_pump.poll_iter() { - match event { - Event::Quit { .. } - | Event::KeyDown { - keycode: Some(Keycode::Escape), - .. - } => return true, - _ => {} - } - } - - false - } - - pub fn wait(&self) { - ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / self.refresh_rate)); - } -} - pub trait UIComponent {} diff --git a/uitlk/src/menu.rs b/uitlk/src/menu.rs index b22cb20..aef3c46 100644 --- a/uitlk/src/menu.rs +++ b/uitlk/src/menu.rs @@ -1,11 +1,3 @@ -use sdl3::rect::Rect; - struct UIMenu { } - -impl UIMenu { - fn test() { - let rect = Rect::new(50, 50, 100, 100); - } -} \ No newline at end of file