sprite limit bugfixes; still not perfect

This commit is contained in:
kirjavascript 2021-06-06 14:07:22 +01:00
parent 07b0bda88e
commit 106c173ecf
3 changed files with 17 additions and 15 deletions

View file

@ -34,7 +34,7 @@ fn main() {
// let buf: Vec<u8> = include_bytes!("./roms/DisableRegTestROM.bin").to_vec();
// let buf: Vec<u8> = include_bytes!("../../notes/pc.md").to_vec();
// let buf: Vec<u8> = include_bytes!("/home/cake/Genesis/Toy Story (U) [!].bin").to_vec();
let buf: Vec<u8> = include_bytes!("/home/cake/sonic/roms/s1.bin").to_vec();
let buf: Vec<u8> = include_bytes!("/home/cake/sonic/roms/s2.bin").to_vec();
let mut emu = Megadrive::new(buf);

View file

@ -128,6 +128,8 @@ impl Gfx {
}
}
//
pub fn draw_sprite_line<'a>(
emu: &'a mut Megadrive,
mut line_high: &'a mut [u8],
@ -135,17 +137,11 @@ impl Gfx {
screen_y: usize,
screen_width: usize,
) {
let max_sprites = if screen_width == 320 { 20 } else { 16 };
let mut pixel_quota = if screen_width == 320 { 320 } else { 256 };
let mut line_low = emu.gfx.line_slice(screen_y);
let sprites = emu.core.mem.vdp.sprites(screen_y);
'draw_sprites: for (i, sprite) in sprites.iter().rev().enumerate() {
if i >= max_sprites {
break;
}
for sprite in sprites.iter().rev() {
let target = if sprite.priority == 0 { &mut line_low } else { &mut line_high };
let sprite_y = screen_y as isize - sprite.y_coord();
let tiles = &emu.core.mem.vdp.VRAM[sprite.tile..];
@ -181,11 +177,6 @@ impl Gfx {
}
}
}
pixel_quota -= 1;
if pixel_quota == 0 {
break 'draw_sprites;
}
}
}
}

View file

@ -141,8 +141,13 @@ impl VDP {
pub fn sprites(&self, screen_y: usize) -> Vec<Sprite> {
let cell40 = self.screen_width() == 320;
let mask = if cell40 { 0x7F } else { 0x7E };
// max_sprites for screen: if cell40 { 80 } else { 64 }
let max_sprites = if cell40 { 20 } else { 16 };
let mut pixel_quota = if cell40 { 320 } else { 256 };
let addr = ((self.registers[5] as usize) & mask) << 9;
let mut index = 0usize;
let mut sprites = vec![];
loop {
@ -153,13 +158,18 @@ impl VDP {
let y_pos = ((sprite[0] as usize) << 8) | sprite[1] as usize;
let height = (sprite[2] as usize & 3) + 1;
if sprite_screen_y >= y_pos && sprite_screen_y < y_pos + (height * 8) {
let width = (sprite[2] as usize >> 2) + 1;
let mut width = (sprite[2] as usize >> 2) + 1;
let priority = sprite[4] as usize >> 7;
let palette = sprite[4] as usize >> 5 & 3;
let v_flip = sprite[4] as usize >> 4 & 1 == 1;
let h_flip = sprite[4] as usize >> 3 & 1 == 1;
let tile = (((sprite[4] as usize & 7) << 8) | sprite[5] as usize) * 0x20;
let x_pos = ((sprite[6] as usize) << 8) | sprite[7] as usize;
let quota = width * 8;
if quota > pixel_quota {
width = pixel_quota / 8;
}
sprites.push(Sprite {
y_pos,
width,
@ -171,12 +181,13 @@ impl VDP {
tile,
x_pos,
});
pixel_quota -= width * 8;
}
index = next;
if index == 0 || sprites.len() == if cell40 { 80 } else { 64 } {
if pixel_quota <= 0 || index == 0 || sprites.len() == max_sprites {
break;
}
}