Make the number of colours a property of the background

This commit is contained in:
Gwilym Inzani 2023-02-24 08:44:47 +00:00
parent adad443e67
commit c6bac34294
15 changed files with 94 additions and 28 deletions

View file

@ -20,7 +20,11 @@ fn main(mut gba: agb::Gba) -> ! {
vram.set_background_palettes(water_tiles::PALETTES);
let mut bg = gfx.background(Priority::P0, RegularBackgroundSize::Background32x32);
let mut bg = gfx.background(
Priority::P0,
RegularBackgroundSize::Background32x32,
TileFormat::FourBpp,
);
for y in 0..20u16 {
for x in 0..30u16 {

View file

@ -58,6 +58,7 @@ fn main(mut gba: agb::Gba) -> ! {
let mut background = gfx.background(
agb::display::Priority::P0,
RegularBackgroundSize::Background32x32,
TileFormat::FourBpp,
);
for (i, &tile) in MAP_MAP.iter().enumerate() {

View file

@ -3,7 +3,7 @@
use agb::display::{
palette16::Palette16,
tiled::{RegularBackgroundSize, TileSetting, TiledMap},
tiled::{RegularBackgroundSize, TileFormat, TileSetting, TiledMap},
Priority,
};
@ -17,7 +17,11 @@ fn main(mut gba: agb::Gba) -> ! {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
])]);
let mut bg = gfx.background(Priority::P0, RegularBackgroundSize::Background32x32);
let mut bg = gfx.background(
Priority::P0,
RegularBackgroundSize::Background32x32,
TileFormat::FourBpp,
);
for y in 0..20u32 {
for x in 0..30u32 {

View file

@ -3,7 +3,9 @@
use agb::{
display::{
tiled::{RegularBackgroundSize, RegularMap, TileSetting, TiledMap, VRamManager},
tiled::{
RegularBackgroundSize, RegularMap, TileFormat, TileSetting, TiledMap, VRamManager,
},
Font, Priority,
},
include_font, include_wav,
@ -23,7 +25,11 @@ fn main(mut gba: Gba) -> ! {
let vblank_provider = agb::interrupt::VBlank::get();
let (gfx, mut vram) = gba.display.video.tiled0();
let mut bg = gfx.background(Priority::P0, RegularBackgroundSize::Background32x32);
let mut bg = gfx.background(
Priority::P0,
RegularBackgroundSize::Background32x32,
TileFormat::FourBpp,
);
init_background(&mut bg, &mut vram);

View file

@ -3,7 +3,9 @@
use agb::{
display::{
tiled::{RegularBackgroundSize, RegularMap, TileSetting, TiledMap, VRamManager},
tiled::{
RegularBackgroundSize, RegularMap, TileFormat, TileSetting, TiledMap, VRamManager,
},
Font, Priority,
},
include_font, include_wav,
@ -23,7 +25,11 @@ fn main(mut gba: Gba) -> ! {
let vblank_provider = agb::interrupt::VBlank::get();
let (gfx, mut vram) = gba.display.video.tiled0();
let mut bg = gfx.background(Priority::P0, RegularBackgroundSize::Background32x32);
let mut bg = gfx.background(
Priority::P0,
RegularBackgroundSize::Background32x32,
TileFormat::FourBpp,
);
init_background(&mut bg, &mut vram);

View file

@ -1,7 +1,10 @@
#![no_std]
#![no_main]
use agb::display::{example_logo, tiled::RegularBackgroundSize};
use agb::display::{
example_logo,
tiled::{RegularBackgroundSize, TileFormat},
};
#[agb::entry]
fn main(mut gba: agb::Gba) -> ! {
@ -10,6 +13,7 @@ fn main(mut gba: agb::Gba) -> ! {
let mut map = gfx.background(
agb::display::Priority::P0,
RegularBackgroundSize::Background32x32,
TileFormat::FourBpp,
);
example_logo::display_logo(&mut map, &mut vram);

View file

@ -3,11 +3,12 @@
use agb::{
display::{
tiled::{RegularBackgroundSize, TileSetting, TiledMap},
tiled::{RegularBackgroundSize, TileFormat, TileSetting, TiledMap},
Font, Priority,
},
include_font,
};
use modular_bitfield::private::checks::FourMod8;
use core::fmt::Write;
@ -25,7 +26,11 @@ fn main(mut gba: agb::Gba) -> ! {
let background_tile = vram.new_dynamic_tile().fill_with(0);
let mut bg = gfx.background(Priority::P0, RegularBackgroundSize::Background32x32);
let mut bg = gfx.background(
Priority::P0,
RegularBackgroundSize::Background32x32,
TileFormat::FourBpp,
);
for y in 0..20u16 {
for x in 0..30u16 {

View file

@ -4,7 +4,10 @@
use core::cell::RefCell;
use agb::{
display::{example_logo, tiled::RegularBackgroundSize},
display::{
example_logo,
tiled::{RegularBackgroundSize, TileFormat},
},
fixnum::FixedNum,
interrupt::{free, Interrupt},
};
@ -22,6 +25,7 @@ fn main(mut gba: agb::Gba) -> ! {
let mut background = gfx.background(
agb::display::Priority::P0,
RegularBackgroundSize::Background32x32,
TileFormat::FourBpp,
);
example_logo::display_logo(&mut background, &mut vram);

View file

@ -2,6 +2,7 @@
#![no_main]
use agb::display::blend::{BlendMode, Layer};
use agb::display::tiled::TileFormat;
use agb::display::{example_logo, tiled::RegularBackgroundSize, window::WinIn};
use agb::display::{HEIGHT, WIDTH};
use agb::fixnum::{num, Num, Rect, Vector2D};
@ -20,6 +21,7 @@ fn main(mut gba: agb::Gba) -> ! {
let mut map = gfx.background(
agb::display::Priority::P0,
RegularBackgroundSize::Background32x32,
TileFormat::FourBpp,
);
let mut window = gba.display.window.get();
window

View file

@ -32,7 +32,11 @@ mod tests {
fn logo_display(gba: &mut crate::Gba) {
let (gfx, mut vram) = gba.display.video.tiled0();
let mut map = gfx.background(Priority::P0, RegularBackgroundSize::Background32x32);
let mut map = gfx.background(
Priority::P0,
RegularBackgroundSize::Background32x32,
TileFormat::FourBpp,
);
display_logo(&mut map, &mut vram);

View file

@ -253,7 +253,7 @@ impl<'a, 'b> TextRenderer<'b> {
#[cfg(test)]
mod tests {
use super::*;
use crate::display::tiled::TiledMap;
use crate::display::tiled::{TileFormat, TiledMap};
const FONT: Font = crate::include_font!("examples/font/yoster.ttf", 12);
#[test_case]
@ -263,6 +263,7 @@ mod tests {
let mut bg = gfx.background(
crate::display::Priority::P0,
crate::display::tiled::RegularBackgroundSize::Background32x32,
TileFormat::FourBpp,
);
vram.set_background_palette_raw(&[

View file

@ -26,6 +26,8 @@ trait TiledMapPrivate: TiledMapTypes {
fn tiles_mut(&mut self) -> &mut [Self::TileType];
fn tiles_dirty(&mut self) -> &mut bool;
fn colours(&self) -> TileFormat;
fn background_id(&self) -> usize;
fn screenblock(&self) -> usize;
fn priority(&self) -> Priority;
@ -79,26 +81,28 @@ where
}
fn commit(&mut self, vram: &mut VRamManager) {
let new_bg_control_value = (self.priority() as u16)
| ((self.screenblock() as u16) << 8)
| (self.map_size().size_flag() << 14);
self.bg_control_register().set(new_bg_control_value);
self.update_bg_registers();
let screenblock_memory = self.screenblock_memory();
let x: TileIndex = unsafe { *self.tiles_mut().get_unchecked(0) }.into();
let x = x.format().tile_size() / TileFormat::FourBpp.tile_size();
let tile_count_divisor = self.colours().tile_size() / TileFormat::FourBpp.tile_size();
if *self.tiles_dirty() {
unsafe {
dma_copy16(
self.tiles_mut().as_ptr() as *const u16,
screenblock_memory,
self.map_size().num_tiles() / x,
self.map_size().num_tiles() / tile_count_divisor,
);
}
}
let tile_colour_flag: u16 = (tile_count_divisor == 2).into();
let new_bg_control_value = (self.priority() as u16)
| ((self.screenblock() as u16) << 8)
| (tile_colour_flag << 7)
| (self.map_size().size_flag() << 14);
self.bg_control_register().set(new_bg_control_value);
self.update_bg_registers();
vram.gc();
*self.tiles_dirty() = false;
@ -115,6 +119,8 @@ pub struct RegularMap {
priority: Priority,
size: RegularBackgroundSize,
colours: TileFormat,
scroll: Vector2D<i16>,
tiles: Vec<Tile>,
@ -154,6 +160,9 @@ impl TiledMapPrivate for RegularMap {
self.x_register().set(self.scroll.x);
self.y_register().set(self.scroll.y);
}
fn colours(&self) -> TileFormat {
self.colours
}
}
impl RegularMap {
@ -162,6 +171,7 @@ impl RegularMap {
screenblock: u8,
priority: Priority,
size: RegularBackgroundSize,
colours: TileFormat,
) -> Self {
Self {
background_id,
@ -171,6 +181,8 @@ impl RegularMap {
scroll: Default::default(),
colours,
tiles: vec![Default::default(); size.num_tiles()],
tiles_dirty: true,
}
@ -267,6 +279,9 @@ impl TiledMapPrivate for AffineMap {
fn update_bg_registers(&self) {
self.bg_affine_matrix().set(self.transform);
}
fn colours(&self) -> TileFormat {
TileFormat::EightBpp
}
}
impl AffineMap {

View file

@ -229,6 +229,7 @@ trait RegularTiledMode {
&self,
priority: Priority,
size: RegularBackgroundSize,
colours: TileFormat,
) -> MapLoan<'_, RegularMap>;
}
@ -248,6 +249,7 @@ where
&self,
priority: Priority,
size: RegularBackgroundSize,
colours: TileFormat,
) -> MapLoan<'_, RegularMap> {
let mut regular = self.regular().borrow_mut();
let new_background = regular.first_zero().unwrap();
@ -266,7 +268,13 @@ where
screenblocks.set(id, true);
}
let bg = RegularMap::new(new_background as u8, screenblock as u8 + 16, priority, size);
let bg = RegularMap::new(
new_background as u8,
screenblock as u8 + 16,
priority,
size,
colours,
);
regular.set(new_background, true);

View file

@ -2,7 +2,7 @@ use core::{cell::RefCell, marker::PhantomData};
use super::{
CreatableRegularTiledMode, MapLoan, RegularBackgroundSize, RegularMap, RegularTiledMode,
TiledMode,
TileFormat, TiledMode,
};
use crate::{
bitarray::Bitarray,
@ -30,8 +30,9 @@ impl Tiled0<'_> {
&self,
priority: Priority,
size: RegularBackgroundSize,
colours: TileFormat,
) -> MapLoan<'_, RegularMap> {
self.regular_background(priority, size)
self.regular_background(priority, size, colours)
}
}

View file

@ -3,7 +3,7 @@ use core::{cell::RefCell, marker::PhantomData};
use super::{
AffineBackgroundSize, AffineMap, AffineTiledMode, CreatableAffineTiledMode,
CreatableRegularTiledMode, MapLoan, RegularBackgroundSize, RegularMap, RegularTiledMode,
TiledMode,
TileFormat, TiledMode,
};
use crate::{
bitarray::Bitarray,
@ -38,8 +38,9 @@ impl Tiled1<'_> {
&self,
priority: Priority,
size: RegularBackgroundSize,
colours: TileFormat,
) -> MapLoan<'_, RegularMap> {
self.regular_background(priority, size)
self.regular_background(priority, size, colours)
}
pub fn affine(&self, priority: Priority, size: AffineBackgroundSize) -> MapLoan<'_, AffineMap> {