mirror of
https://github.com/kirjavascript/trueLMAO.git
synced 2024-05-20 05:10:21 -04:00
refactoring stuff
This commit is contained in:
parent
ddc219483e
commit
840cc36d16
|
@ -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
83
frontend/src/debug/mod.rs
Normal 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);
|
||||
});
|
||||
}
|
||||
}
|
19
frontend/src/debug/palette.rs
Normal file
19
frontend/src/debug/palette.rs
Normal 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);
|
||||
});
|
||||
}
|
|
@ -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)))
|
||||
)
|
||||
}
|
||||
|
|
|
@ -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))),
|
||||
);
|
||||
}
|
||||
|
|
24
frontend/src/widgets/menu.rs
Normal file
24
frontend/src/widgets/menu.rs
Normal 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
|
||||
}
|
||||
}
|
|
@ -1,5 +1,7 @@
|
|||
pub mod viewport;
|
||||
pub use viewport::*;
|
||||
pub mod menu;
|
||||
pub use menu::*;
|
||||
|
||||
// misc;
|
||||
|
||||
|
|
Loading…
Reference in a new issue