diff --git a/snes-frontend/src/emu_ui/debug/ppu_graphics.rs b/snes-frontend/src/emu_ui/debug/ppu_graphics.rs index 6e7e077..47fef41 100644 --- a/snes-frontend/src/emu_ui/debug/ppu_graphics.rs +++ b/snes-frontend/src/emu_ui/debug/ppu_graphics.rs @@ -223,7 +223,7 @@ fn paint_texture(ui: &mut Ui, texture: &mut Option, framebuffer: if let Some(txt) = texture { txt.set( ColorImage::from_rgba_premultiplied([width, height], framebuffer), - TextureOptions::default(), + TextureOptions::LINEAR, ); let (whole_rect, _) = ui.allocate_exact_size(Vec2::from([(width * 2) as f32, (height * 2) as f32]), egui::Sense::focusable_noninteractive()); diff --git a/snes-frontend/src/emu_ui/game.rs b/snes-frontend/src/emu_ui/game.rs index 2ed9760..4e9fabc 100644 --- a/snes-frontend/src/emu_ui/game.rs +++ b/snes-frontend/src/emu_ui/game.rs @@ -1,4 +1,4 @@ -use eframe::egui; +use eframe::egui::{self, Pos2, Rect}; use eframe::{egui::Context, epaint::ColorImage}; use eframe::egui::{TextureOptions, Ui}; use eframe::epaint::{Vec2, TextureHandle}; @@ -12,11 +12,12 @@ pub fn build_game_window( ctx: &egui::Context, game_tv_texture: &mut Option, framebuffer: &[u8], + current_res: (u16, u16), ) { egui::Window::new("TV") .collapsible(false) .show(ctx, |ui| { - paint_game_texture(ui, game_tv_texture, framebuffer); + paint_game_texture(ui, game_tv_texture, framebuffer, current_res); }); } @@ -33,21 +34,34 @@ pub fn initialize_game_texture(ctx: &Context, game_tv_texture: &mut Option, framebuffer: &[u8]) { +fn paint_game_texture(ui: &mut Ui, texture: &mut Option, framebuffer: &[u8], current_res: (u16, u16)) { if let Some(txt) = texture { txt.set( ColorImage::from_rgba_premultiplied([MAX_TV_WIDTH, MAX_TV_HEIGHT], framebuffer), - TextureOptions::default(), + TextureOptions::LINEAR, ); let (whole_rect, _) = ui.allocate_exact_size( Vec2::from([(MAX_TV_WIDTH) as f32, (MAX_TV_HEIGHT) as f32]), egui::Sense::focusable_noninteractive(), ); + let current_resolution_scale = calculate_resolution_scale(current_res); egui::Image::new(( txt.id(), txt.size_vec2(), )) + .texture_options(TextureOptions::LINEAR) + .uv(Rect::from_two_pos( + Pos2::new(0.0,0.0), + Pos2::new(current_resolution_scale.0, current_resolution_scale.1)) + ) .paint_at(ui, whole_rect); } } + +fn calculate_resolution_scale(current_res: (u16, u16)) -> (f32, f32) { + ( + current_res.0 as f32 / MAX_TV_WIDTH as f32, + current_res.1 as f32 / MAX_TV_HEIGHT as f32, + ) +} diff --git a/snes-frontend/src/main.rs b/snes-frontend/src/main.rs index 5d70ef1..66506f8 100644 --- a/snes-frontend/src/main.rs +++ b/snes-frontend/src/main.rs @@ -30,6 +30,7 @@ impl eframe::App for SnesEmulatorApp { ctx, &mut self.state.game_tv_texture, self.emulator.bus.ppu.framebuffer(), + self.emulator.bus.ppu.registers.get_current_res(), ); emu_ui::debug::build_all_debug_options(ctx, &mut self.state.debug_options, &mut self.state.emulation_state, &mut self.emulator); if !self.state.emulation_state.is_paused {