refactoring stuff

This commit is contained in:
kirjavascript 2022-06-21 00:23:17 +01:00
parent ddc219483e
commit 840cc36d16
7 changed files with 147 additions and 104 deletions

View file

@ -3,20 +3,22 @@ use crate::widgets;
use instant::Instant;
use std::collections::VecDeque;
pub struct Frontend {
pub struct App {
emu: Megadrive,
fullscreen: bool,
debug: crate::debug::Debug,
game_state: GameState,
pub fullscreen: bool,
test_vec: VecDeque<u64>,
}
impl Default for Frontend {
impl Default for App {
fn default() -> Self {
let buf: Vec<u8> = include_bytes!("/home/cake/sonic/roms/s1p.bin").to_vec();
Self {
emu: Megadrive::new(buf),
fullscreen: false,
debug: Default::default(),
game_state: Default::default(),
fullscreen: false,
test_vec: VecDeque::with_capacity(60),
}
}
@ -61,7 +63,7 @@ impl GameState {
}
}
impl Frontend {
impl App {
pub fn new(cc: &eframe::CreationContext<'_>) -> Self {
cc.egui_ctx.set_visuals(egui::Visuals {
dark_mode: true,
@ -89,7 +91,7 @@ impl Frontend {
}
}
impl eframe::App for Frontend {
impl eframe::App for App {
fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
if self.game_state.running {
@ -111,8 +113,6 @@ impl eframe::App for Frontend {
}
}
// main layout
if self.fullscreen {
egui::CentralPanel::default()
.frame(egui::containers::Frame::none())
@ -125,30 +125,12 @@ impl eframe::App for Frontend {
return
}
// TODO menu module
egui::TopBottomPanel::top("top_panel").show(ctx, |ui| {
egui::menu::bar(ui, |ui| {
ui.menu_button("File", |ui| {
if ui.button("Quit").clicked() {
frame.quit();
}
});
ui.menu_button("Window", |ui| {
if ui.button("Auto-arrange").clicked() {
ui.ctx().memory().reset_areas();
ui.close_menu();
}
if ui.button("Fullscreen").clicked() {
self.fullscreen = true;
ui.close_menu();
}
});
// *ui.ctx().memory() = Default::default();
});
ui.add(crate::widgets::menu(&mut self.fullscreen, frame));
});
// game window
egui::Window::new("screen")
.min_height(100.)
.show(ctx, |ui| {
@ -158,76 +140,11 @@ impl eframe::App for Frontend {
}
});
egui::Window::new("palette")
.show(ctx, |ui| {
let pixels = self.emu.core.mem.vdp.cram_rgb.iter()
.map(|&(r, g, b)| egui::Color32::from_rgb(r, g, b))
.collect();
let texture: &egui::TextureHandle = &ui.ctx().load_texture(
"palette",
egui::ColorImage {
size: [16, 4],
pixels,
},
egui::TextureFilter::Nearest
);
let img = egui::Image::new(texture, texture.size_vec2() * 20.);
crate::debug::palette::palette_window(&ctx, &self.emu);
ui.add(img);
});
egui::Window::new("vram")
.show(ctx, |ui| {
// TODO gui palette toggle
const width: usize = 16;
const height: usize = 128;
const pixel_qty: usize = (width * 8) * (height * 8);
// TODO use retained buffer
let mut pixels: [egui::Color32; pixel_qty] = [ egui::Color32::from_rgb(0, 0, 0); pixel_qty];
for x_tile in 0..width {
for y_tile in 0..height {
let offset = x_tile + (y_tile * width);
let vram_offset = offset * 32;
let mut view_offset = (x_tile * 8) + (y_tile * 8 * (width * 8));
let mut count = 0;
for duxel in &self.emu.core.mem.vdp.VRAM[vram_offset..vram_offset+32] {
let pixel = (*duxel & 0xF0) >> 4;
let (r, g, b) = self.emu.core.mem.vdp.cram_rgb[pixel as usize];
pixels[view_offset] = egui::Color32::from_rgb(r, g, b);
view_offset += 1;
let pixel = *duxel & 0xF;
let (r, g, b) = self.emu.core.mem.vdp.cram_rgb[pixel as usize];
pixels[view_offset] = egui::Color32::from_rgb(r, g, b);
view_offset += 1;
count += 2;
if view_offset % 8 == 0 {
view_offset += (width-1) * 8;
}
}
}
}
let texture: &egui::TextureHandle = &ui.ctx().load_texture(
"vram",
egui::ColorImage {
size: [width*8, height*8],
pixels: pixels.to_vec(),
},
egui::TextureFilter::Nearest
);
let img = egui::Image::new(texture, texture.size_vec2() * 2.);
ui.add(img);
});
self.debug.vram.render(&ctx, &self.emu);
egui::CentralPanel::default().show(ctx, |ui| {
egui::warn_if_debug_build(ui);
// ctx.inspection_ui(ui);

83
frontend/src/debug/mod.rs Normal file
View file

@ -0,0 +1,83 @@
pub mod palette;
// pub fn vram(ctx: &egui::Context, ui: &egui::Ui, emu: &mut emu::Megadrive) {
// }
pub struct Debug {
pub vram: VRAM,
}
impl Default for Debug {
fn default() -> Self {
Self {
vram: Default::default(),
}
}
}
pub struct VRAM {
}
impl Default for VRAM {
fn default() -> Self {
Self {
}
}
}
impl VRAM {
pub fn render(&self, ctx: &egui::Context, emu: &emu::Megadrive) {
egui::Window::new("vram")
.vscroll(true)
.show(ctx, |ui| {
ui.group(|ui| {
ui.label("Within a frame");
ui.label("Within a frame");
});
// TODO gui palette toggle
const width: usize = 16;
const height: usize = 128;
const pixel_qty: usize = (width * 8) * (height * 8);
// TODO use retained buffer
// TODO: widget local state
let mut pixels: [egui::Color32; pixel_qty] = [ egui::Color32::from_rgb(0, 0, 0); pixel_qty];
for x_tile in 0..width {
for y_tile in 0..height {
let offset = x_tile + (y_tile * width);
let vram_offset = offset * 32;
let mut view_offset = (x_tile * 8) + (y_tile * 8 * (width * 8));
for duxel in &emu.core.mem.vdp.VRAM[vram_offset..vram_offset+32] {
let pixel = (*duxel & 0xF0) >> 4;
let (r, g, b) = emu.core.mem.vdp.cram_rgb[pixel as usize];
pixels[view_offset] = egui::Color32::from_rgb(r, g, b);
view_offset += 1;
let pixel = *duxel & 0xF;
let (r, g, b) = emu.core.mem.vdp.cram_rgb[pixel as usize];
pixels[view_offset] = egui::Color32::from_rgb(r, g, b);
view_offset += 1;
if view_offset % 8 == 0 {
view_offset += (width-1) * 8;
}
}
}
}
let texture: &egui::TextureHandle = &ui.ctx().load_texture(
"vram",
egui::ColorImage {
size: [width*8, height*8],
pixels: pixels.to_vec(),
},
egui::TextureFilter::Nearest
);
let img = egui::Image::new(texture, texture.size_vec2() * 2.);
ui.add(img);
});
}
}

View file

@ -0,0 +1,19 @@
pub fn palette_window(ctx: &egui::Context, emu: &emu::Megadrive) {
egui::Window::new("palette")
.show(ctx, |ui| {
let pixels = emu.core.mem.vdp.cram_rgb.iter()
.map(|&(r, g, b)| egui::Color32::from_rgb(r, g, b))
.collect();
let texture: &egui::TextureHandle = &ui.ctx().load_texture(
"palette",
egui::ColorImage {
size: [16, 4],
pixels,
},
egui::TextureFilter::Nearest
);
let img = egui::Image::new(texture, texture.size_vec2() * 20.);
ui.add(img);
});
}

View file

@ -1,12 +1,10 @@
#![warn(clippy::all, rust_2018_idioms)]
mod app;
mod debug;
mod input;
mod widgets;
pub use app::Frontend;
// ----------------------------------------------------------------------------
// When compiling for web:
pub use app::App;
#[cfg(target_arch = "wasm32")]
use eframe::wasm_bindgen::{self, prelude::*};
@ -14,15 +12,15 @@ use eframe::wasm_bindgen::{self, prelude::*};
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen]
pub fn start(canvas_id: &str) -> Result<(), eframe::wasm_bindgen::JsValue> {
// Make sure panics are logged using `console.error`.
// make sure panics are logged using `console.error`
console_error_panic_hook::set_once();
// Redirect tracing to console.log and friends:
// redirect tracing to console.log and friends
tracing_wasm::set_as_global_default();
eframe::start_web(
canvas_id,
Default::default(),
Box::new(|cc| Box::new(Frontend::new(cc)))
Box::new(|cc| Box::new(App::new(cc)))
)
}

View file

@ -11,6 +11,6 @@ fn main() {
eframe::run_native(
"trueLMAO",
native_options,
Box::new(|cc| Box::new(frontend::Frontend::new(cc))),
Box::new(|cc| Box::new(frontend::App::new(cc))),
);
}

View file

@ -0,0 +1,24 @@
pub fn menu<'a>(fullscreen: &'a mut bool, frame: &'a mut eframe::Frame) ->
impl egui::Widget + 'a
{
move |ui: &mut egui::Ui| {
egui::menu::bar(ui, |ui| {
ui.menu_button("File", |ui| {
if ui.button("Quit").clicked() {
frame.quit();
}
});
ui.menu_button("Window", |ui| {
if ui.button("Auto-arrange").clicked() {
ui.ctx().memory().reset_areas();
ui.close_menu();
}
if ui.button("Fullscreen").clicked() {
*fullscreen = true;
ui.close_menu();
}
});
}).response
}
}

View file

@ -1,5 +1,7 @@
pub mod viewport;
pub use viewport::*;
pub mod menu;
pub use menu::*;
// misc;