sprite limiting

This commit is contained in:
kirjavascript 2021-06-04 21:44:35 +01:00
parent c8f523d935
commit 07b0bda88e
4 changed files with 19 additions and 11 deletions

View file

@ -33,8 +33,8 @@ fn main() {
let app = app::App::default();
// 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/Ristar (UE) (Aug 1994) [!].bin").to_vec();
let buf: Vec<u8> = include_bytes!("/home/cake/sonic/roms/s2.bin").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 mut emu = Megadrive::new(buf);

View file

@ -132,16 +132,20 @@ impl Gfx {
emu: &'a mut Megadrive,
mut line_high: &'a mut [u8],
cram_rgb: &[(u8, u8, u8); 64],
sprites: &Vec<crate::vdp::Sprite>,
screen_y: usize,
screen_width: usize,
) {
// let max_sprites = if screen_width == 320 { 20 } else { 16 };
// let max_pixels = if screen_width == 320 { 320 } else { 256 };
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);
for sprite in sprites.iter().rev() {
let sprites = emu.core.mem.vdp.sprites(screen_y);
'draw_sprites: for (i, sprite) in sprites.iter().rev().enumerate() {
if i >= max_sprites {
break;
}
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..];
@ -177,6 +181,11 @@ impl Gfx {
}
}
}
pixel_quota -= 1;
if pixel_quota == 0 {
break 'draw_sprites;
}
}
}
}

View file

@ -115,12 +115,14 @@ impl Megadrive {
let (plane_a, plane_b) = self.core.mem.vdp.nametables();
let (hscroll_a, hscroll_b) = self.core.mem.vdp.hscroll(screen_y);
let screen_width = self.core.mem.vdp.screen_width();
let sprites = self.core.mem.vdp.sprites(screen_y);
let cram_rgb = self.core.mem.vdp.cram_rgb();
// TODO: use slices for RGB copy
// TODO: move clear_screen here
// TODO: try rendering with PIXI / web perf
// TODO: remove parts to hit 60
// 0xFE is an invalid MD colour we use as a marker
const MARKER: u8 = 0xFE;
@ -160,7 +162,6 @@ impl Megadrive {
self,
&mut line_high,
&cram_rgb,
&sprites,
screen_y,
screen_width,
);

View file

@ -26,9 +26,7 @@ pub fn gamepad_p1(value: usize) {
unsafe { EMU.core.mem.io.gamepad[0].set(value) }
}
// lazy_mut! {
// static mut CANVAS: [u8; 320 * 240 * 4] = [0; 320 * 240 * 4];
// }
// static mut CANVAS: [u8; 320 * 240 * 4] = [0; 320 * 240 * 4];
// #[wasm_bindgen]
// pub fn canvas() -> *const u8 {