Basic window

This commit is contained in:
FyloZ 2025-06-17 10:59:02 -04:00
parent 61b0b72259
commit 7599fea8c9
8 changed files with 123 additions and 125 deletions

1
.idea/nesrust.iml generated
View File

@ -6,6 +6,7 @@
<sourceFolder url="file://$MODULE_DIR$/core/src" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/core/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/ui/src" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/ui/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/uitlk/src" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/core/core/target" /> <excludeFolder url="file://$MODULE_DIR$/core/core/target" />
<excludeFolder url="file://$MODULE_DIR$/core/target" /> <excludeFolder url="file://$MODULE_DIR$/core/target" />
<excludeFolder url="file://$MODULE_DIR$/target" /> <excludeFolder url="file://$MODULE_DIR$/target" />

44
Cargo.lock generated
View File

@ -2,17 +2,29 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 4 version = 4
[[package]]
name = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "2.8.0" version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36"
[[package]]
name = "cfg-if"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
[[package]] [[package]]
name = "core" name = "core"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"bitflags", "bitflags 2.8.0",
"simplelog", "simplelog",
"strum", "strum",
] ]
@ -108,22 +120,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
[[package]] [[package]]
name = "sdl3" name = "sdl2"
version = "0.14.14" version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e55f9adf2ac7e868746564d885f677fa797106f7c5deffa348dad3ef6e659300" checksum = "3b498da7d14d1ad6c839729bd4ad6fc11d90a57583605f3b4df2cd709a9cd380"
dependencies = [ dependencies = [
"bitflags", "bitflags 1.3.2",
"lazy_static", "lazy_static",
"libc", "libc",
"sdl3-sys", "sdl2-sys",
] ]
[[package]] [[package]]
name = "sdl3-sys" name = "sdl2-sys"
version = "0.4.3+SDL3-3.2.2" version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb7ecf5e5f416b2e6408ebe1825ded6bdcac3b8c79e429aada3c79efc675e80d" checksum = "951deab27af08ed9c6068b7b0d05a93c91f0a8eb16b6b816a5e73452a43521d3"
dependencies = [
"cfg-if",
"libc",
"version-compare",
]
[[package]] [[package]]
name = "serde" name = "serde"
@ -237,6 +254,7 @@ name = "ui"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"core", "core",
"sdl2",
"simplelog", "simplelog",
"uitlk", "uitlk",
] ]
@ -245,7 +263,7 @@ dependencies = [
name = "uitlk" name = "uitlk"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"sdl3", "sdl2",
] ]
[[package]] [[package]]
@ -254,6 +272,12 @@ version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
[[package]]
name = "version-compare"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29"
[[package]] [[package]]
name = "winapi-util" name = "winapi-util"
version = "0.1.9" version = "0.1.9"

View File

@ -8,4 +8,5 @@ edition = "2021"
[dependencies] [dependencies]
core = { path = "../core" } core = { path = "../core" }
uitlk = { path = "../uitlk" } uitlk = { path = "../uitlk" }
simplelog = { version = "^0.12.0", features = ["paris"] } sdl2 = "0.37.0"
simplelog = { version = "^0.12.0", features = ["paris"] }

View File

@ -1,14 +1,22 @@
use core::system::System; extern crate sdl2;
use core::Clock; mod renderer;
use crate::renderer::Renderer;
use sdl2::event::Event;
use sdl2::rect::Point;
use simplelog::*; use simplelog::*;
use std::fs::File; use std::fs::File;
use std::thread::sleep;
use std::time::Duration; use std::time::Duration;
use uitlk::UIWindow;
const ROM_PATH: &'static str = "./roms/dk.nes"; 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![ CombinedLogger::init(vec![
TermLogger::new( TermLogger::new(
LevelFilter::Info, LevelFilter::Info,
@ -24,19 +32,48 @@ fn main() {
]) ])
.unwrap(); .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(); let window = video_subsystem
// system.insert_rom(ROM_PATH).expect("Failed to insert ROM"); .window("NesRust", WINDOW_WIDTH, WINDOW_HEIGHT)
loop { .position_centered()
// system.cycle(); .opengl()
if window.poll_events() { .build()
break; .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(); // Main loop
window.wait();
} }
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();
// }
} }

33
ui/src/renderer.rs Normal file
View File

@ -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<Renderer, String> {
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(())
}
}

View File

@ -6,4 +6,4 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
sdl3 = "0.14.14" sdl2 = "0.37.0"

View File

@ -1,93 +1,3 @@
mod menu; 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 {} pub trait UIComponent {}

View File

@ -1,11 +1,3 @@
use sdl3::rect::Rect;
struct UIMenu { struct UIMenu {
} }
impl UIMenu {
fn test() {
let rect = Rect::new(50, 50, 100, 100);
}
}