mirror of
https://github.com/kirjavascript/trueLMAO.git
synced 2024-06-02 19:47:21 -04:00
sprite limit bugfixes; still not perfect
This commit is contained in:
parent
07b0bda88e
commit
106c173ecf
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue