mirror of
https://github.com/italicsjenga/agb.git
synced 2024-12-23 16:21:33 +11:00
Update background and foreground independentently
This commit is contained in:
parent
3941117aa7
commit
08aeb56f1e
|
@ -25,6 +25,18 @@ const TILE_BACKGROUND: MemoryMapped1DArray<u32, { 2048 * 8 }> =
|
|||
const PALETTE_BACKGROUND: MemoryMapped1DArray<u16, 256> =
|
||||
unsafe { MemoryMapped1DArray::new(0x0500_0000) };
|
||||
|
||||
#[cfg(debug_assertions)]
|
||||
const unsafe fn debug_unreachable_unchecked() -> ! {
|
||||
unreachable!();
|
||||
}
|
||||
|
||||
#[cfg(not(debug_assertions))]
|
||||
const unsafe fn debug_unreachable_unchecked() -> ! {
|
||||
use core::hint::unreachable_unchecked;
|
||||
|
||||
unreachable_unchecked();
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub enum TileFormat {
|
||||
FourBpp,
|
||||
|
@ -72,7 +84,7 @@ impl VRamState {
|
|||
if let VRamState::ReferenceCounted(count, _) = self {
|
||||
*count += 1;
|
||||
} else {
|
||||
panic!("Corrupted vram state");
|
||||
unsafe { debug_unreachable_unchecked() };
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -81,7 +93,7 @@ impl VRamState {
|
|||
*count -= 1;
|
||||
(*count, *tile_ref)
|
||||
} else {
|
||||
panic!("Corrupted vram state");
|
||||
unsafe { debug_unreachable_unchecked() };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -134,7 +146,7 @@ impl<'a> VRamManager<'a> {
|
|||
self.tilesets[ptr] = tileset;
|
||||
ptr
|
||||
}
|
||||
_ => panic!("Free pointer shouldn't point to valid data"),
|
||||
_ => unsafe { debug_unreachable_unchecked() },
|
||||
}
|
||||
} else {
|
||||
self.tilesets.push(tileset);
|
||||
|
@ -149,7 +161,7 @@ impl<'a> VRamManager<'a> {
|
|||
|
||||
match tileset {
|
||||
ArenaStorageItem::Data(_, generation) => {
|
||||
assert_eq!(
|
||||
debug_assert_eq!(
|
||||
*generation, tile_set_ref.generation,
|
||||
"Tileset generation must be the same when removing"
|
||||
);
|
||||
|
@ -162,7 +174,7 @@ impl<'a> VRamManager<'a> {
|
|||
|
||||
self.free_pointer = Some(tile_set_ref.id as usize);
|
||||
}
|
||||
_ => panic!("Already freed, probably a double free?"),
|
||||
_ => unsafe { debug_unreachable_unchecked() },
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -182,7 +194,7 @@ impl<'a> VRamManager<'a> {
|
|||
self.vram_free_pointer = Some(next_free as usize);
|
||||
}
|
||||
}
|
||||
VRamState::ReferenceCounted(_, _) => panic!("Corrupted tile reference state"),
|
||||
VRamState::ReferenceCounted(_, _) => unsafe { debug_unreachable_unchecked() },
|
||||
}
|
||||
|
||||
self.references[ptr] = VRamState::ReferenceCounted(1, tile_ref);
|
||||
|
@ -196,7 +208,7 @@ impl<'a> VRamManager<'a> {
|
|||
let tile_slice = if let ArenaStorageItem::Data(data, generation) =
|
||||
&self.tilesets[tile_set_ref.id as usize]
|
||||
{
|
||||
assert_eq!(
|
||||
debug_assert_eq!(
|
||||
*generation, tile_set_ref.generation,
|
||||
"Stale tile data requested"
|
||||
);
|
||||
|
@ -204,7 +216,7 @@ impl<'a> VRamManager<'a> {
|
|||
let tile_offset = (tile as usize) * data.format.tile_size() / 4;
|
||||
&data.tiles[tile_offset..(tile_offset + data.format.tile_size() / 4)]
|
||||
} else {
|
||||
panic!("Cannot find tile data at given reference");
|
||||
unsafe { debug_unreachable_unchecked() };
|
||||
};
|
||||
|
||||
let tile_size_in_words = TileFormat::FourBpp.tile_size() / 4;
|
||||
|
|
25
examples/the-hat-chooses-the-wizard/Cargo.lock
generated
25
examples/the-hat-chooses-the-wizard/Cargo.lock
generated
|
@ -25,6 +25,7 @@ dependencies = [
|
|||
"bare-metal",
|
||||
"bitflags",
|
||||
"hashbrown",
|
||||
"rustc-hash",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -89,12 +90,6 @@ version = "1.0.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f8fe8f5a8a398345e52358e18ff07cc17a568fbca5c6f73873d3a62056309603"
|
||||
|
||||
[[package]]
|
||||
name = "bare-metal"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f8fe8f5a8a398345e52358e18ff07cc17a568fbca5c6f73873d3a62056309603"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.3.2"
|
||||
|
@ -103,9 +98,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
|||
|
||||
[[package]]
|
||||
name = "bytemuck"
|
||||
version = "1.7.3"
|
||||
version = "1.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "439989e6b8c38d1b6570a384ef1e49c8848128f5a97f3914baef02920842712f"
|
||||
checksum = "0e851ca7c24871e7336801608a4797d7376545b6928a10d32d75685687141ead"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
|
@ -248,15 +243,15 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.9.0"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5"
|
||||
checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9"
|
||||
|
||||
[[package]]
|
||||
name = "png"
|
||||
version = "0.17.4"
|
||||
version = "0.17.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "02cd7d51cea7e2fa6bbcb8af5fbcad15b871451bfc2d20ed72dff2f4ae072a84"
|
||||
checksum = "dc38c0ad57efb786dd57b9864e5b18bae478c00c824dc55a38bbc9da95dde3ba"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"crc32fast",
|
||||
|
@ -318,6 +313,12 @@ dependencies = [
|
|||
"getrandom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustc-hash"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.9"
|
||||
|
|
|
@ -285,8 +285,11 @@ impl<'a, 'b> Map<'a, 'b> {
|
|||
self.foreground.commit();
|
||||
}
|
||||
|
||||
pub fn init(&mut self, vram: &mut VRamManager) {
|
||||
pub fn init_background(&mut self, vram: &mut VRamManager) {
|
||||
self.background.init(vram, self.position.floor());
|
||||
}
|
||||
|
||||
pub fn init_foreground(&mut self, vram: &mut VRamManager) {
|
||||
self.foreground.init(vram, self.position.floor());
|
||||
}
|
||||
}
|
||||
|
@ -874,7 +877,13 @@ fn main(mut agb: agb::Gba) -> ! {
|
|||
agb::input::ButtonController::new(),
|
||||
);
|
||||
|
||||
level.background.init(&mut vram);
|
||||
level.background.init_background(&mut vram);
|
||||
music_box.before_frame(&mut mixer);
|
||||
mixer.frame();
|
||||
vblank.wait_for_vblank();
|
||||
mixer.after_vblank();
|
||||
|
||||
level.background.init_foreground(&mut vram);
|
||||
|
||||
for _ in 0..60 {
|
||||
music_box.before_frame(&mut mixer);
|
||||
|
|
Loading…
Reference in a new issue