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$/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/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.
|
||||
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"
|
||||
|
@ -8,4 +8,5 @@ edition = "2021"
|
||||
[dependencies]
|
||||
core = { path = "../core" }
|
||||
uitlk = { path = "../uitlk" }
|
||||
sdl2 = "0.37.0"
|
||||
simplelog = { version = "^0.12.0", features = ["paris"] }
|
@ -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())?;
|
||||
|
||||
// TODO: System loop
|
||||
let mut renderer = Renderer::new(window, WINDOW_SCALE)?;
|
||||
|
||||
window.render();
|
||||
window.wait();
|
||||
let mut event_pump = sdl_context.event_pump()?;
|
||||
'running: loop {
|
||||
for event in event_pump.poll_iter() {
|
||||
match event {
|
||||
Event::Quit { .. } => break 'running,
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
renderer.draw(&Point::new(1, 1))?;
|
||||
::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 60));
|
||||
|
||||
// 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();
|
||||
// }
|
||||
}
|
||||
|
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
|
||||
|
||||
[dependencies]
|
||||
sdl3 = "0.14.14"
|
||||
sdl2 = "0.37.0"
|
@ -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 {}
|
||||
|
@ -1,11 +1,3 @@
|
||||
use sdl3::rect::Rect;
|
||||
|
||||
struct UIMenu {
|
||||
|
||||
}
|
||||
|
||||
impl UIMenu {
|
||||
fn test() {
|
||||
let rect = Rect::new(50, 50, 100, 100);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user