From 8ef947d54a4b70a2cf2436cc0d44a77bbc54745b Mon Sep 17 00:00:00 2001 From: Alex Janka Date: Wed, 8 Feb 2023 11:12:08 +1100 Subject: [PATCH] draw objects behind bg/window --- src/processor/gpu.rs | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/processor/gpu.rs b/src/processor/gpu.rs index ce9bb3e..91324d5 100644 --- a/src/processor/gpu.rs +++ b/src/processor/gpu.rs @@ -304,11 +304,11 @@ impl CPU { } fn render_scanline(&mut self, scanline: u8, lcdc: &LCDC) { + let bg_palette = byte_to_palette(self.memory.get(0xFF47)); if lcdc.bg_window_enable { - let palette = byte_to_palette(self.memory.get(0xFF47)); - self.render_scanline_bg(scanline, lcdc, palette); + self.render_scanline_bg(scanline, lcdc, bg_palette); if lcdc.window_enable { - self.render_scanline_window(scanline, lcdc, palette); + self.render_scanline_window(scanline, lcdc, bg_palette); } } else { for x in 0..WIDTH { @@ -317,7 +317,7 @@ impl CPU { } } if lcdc.obj_enable { - self.render_scanline_obj(scanline, lcdc); + self.render_scanline_obj(scanline, lcdc, bg_palette); } } @@ -350,10 +350,10 @@ impl CPU { } } - fn render_scanline_obj(&mut self, scanline: u8, lcdc: &LCDC) { + fn render_scanline_obj(&mut self, scanline: u8, lcdc: &LCDC, bg_palette: Palette) { let objs = self.parse_oam(scanline, &lcdc.obj_size); for object in objs { - self.render_object(scanline, object, &lcdc.obj_size); + self.render_object(scanline, object, &lcdc.obj_size, bg_palette); } } @@ -386,7 +386,13 @@ impl CPU { objs } - fn render_object(&mut self, scanline: u8, object: Object, obj_size: &ObjSize) { + fn render_object( + &mut self, + scanline: u8, + object: Object, + obj_size: &ObjSize, + bg_palette: Palette, + ) { let mut object_row = scanline - object.y; if object.flags.y_flip { object_row = obj_size.get_height() - (object_row + 1); @@ -408,7 +414,12 @@ impl CPU { } let x_coord = x_coord_uncorrected - 8; if x_coord < WIDTH { - self.gpu.buffer[(scanline as usize * WIDTH) + x_coord] = colour.to_rgb(); + let buffer_index = (scanline as usize * WIDTH) + x_coord; + if !object.flags.behind_bg_and_window + || self.gpu.buffer[buffer_index] == bg_palette.zero.to_rgb() + { + self.gpu.buffer[buffer_index] = colour.to_rgb(); + } } } }