Basic window
This commit is contained in:
parent
61b0b72259
commit
7599fea8c9
1
.idea/nesrust.iml
generated
1
.idea/nesrust.iml
generated
@ -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
44
Cargo.lock
generated
@ -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"
|
||||||
|
@ -8,4 +8,5 @@ edition = "2021"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
core = { path = "../core" }
|
core = { path = "../core" }
|
||||||
uitlk = { path = "../uitlk" }
|
uitlk = { path = "../uitlk" }
|
||||||
|
sdl2 = "0.37.0"
|
||||||
simplelog = { version = "^0.12.0", features = ["paris"] }
|
simplelog = { version = "^0.12.0", features = ["paris"] }
|
@ -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
33
ui/src/renderer.rs
Normal 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(())
|
||||||
|
}
|
||||||
|
}
|
@ -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"
|
@ -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 {}
|
||||||
|
@ -1,11 +1,3 @@
|
|||||||
use sdl3::rect::Rect;
|
|
||||||
|
|
||||||
struct UIMenu {
|
struct UIMenu {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl UIMenu {
|
|
||||||
fn test() {
|
|
||||||
let rect = Rect::new(50, 50, 100, 100);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user