Move the palettes to a single constant rather than being repeated

This commit is contained in:
Gwilym Kuiper 2022-10-08 23:02:54 +01:00
parent a5c86e8ce8
commit 1e759dbeca
11 changed files with 46 additions and 48 deletions

View file

@ -20,7 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Many of the places that originally disabled IRQs now use the `sync` module, reducing the chance of missed interrupts.
- HashMap iterators now implement `size_hint` which should result in slightly better generation of code using those iterators.
- Transparency of backgrounds is now set once in the toml file rather than once for every image.
- Palette generation now takes into account every single background a toml definition rather than one at a time.
- Palette generation now takes into account every single background a toml definition rather than one at a time, you can now find it in the PALETTES constant rather than in every individual image.
### Fixed
- Fixed the fast magnitude function in agb_fixnum. This is also used in fast_normalise. Previously only worked for positive (x, y).

View file

@ -127,10 +127,15 @@ pub fn include_gfx(input: TokenStream) -> TokenStream {
));
}
let palette_code =
rust_generator::generate_palette_code(&optimisation_results, &config.crate_prefix());
let module = quote! {
mod #module_name {
const _: &[u8] = include_bytes!(#include_path);
#palette_code
#(#image_code)*
}
};

View file

@ -7,19 +7,13 @@ use quote::{format_ident, quote};
use std::iter;
pub(crate) fn generate_code(
output_variable_name: &str,
pub(crate) fn generate_palette_code(
results: &Palette16OptimisationResults,
image: &Image,
image_filename: &str,
tile_size: TileSize,
crate_prefix: String,
assignment_offset: Option<usize>,
crate_prefix: &str,
) -> TokenStream {
let crate_prefix = format_ident!("{}", crate_prefix);
let output_variable_name = format_ident!("{}", output_variable_name);
let palette_data = results.optimised_palettes.iter().map(|palette| {
let palettes = results.optimised_palettes.iter().map(|palette| {
let colours = palette
.clone()
.into_iter()
@ -35,6 +29,23 @@ pub(crate) fn generate_code(
}
});
quote! {
pub const PALETTES: &[#crate_prefix::display::palette16::Palette16] = &[#(#palettes),*];
}
}
pub(crate) fn generate_code(
output_variable_name: &str,
results: &Palette16OptimisationResults,
image: &Image,
image_filename: &str,
tile_size: TileSize,
crate_prefix: String,
assignment_offset: Option<usize>,
) -> TokenStream {
let crate_prefix = format_ident!("{}", crate_prefix);
let output_variable_name = format_ident!("{}", output_variable_name);
let (tile_data, assignments) = if let Some(assignment_offset) = assignment_offset {
let mut tile_data = Vec::new();
@ -68,17 +79,13 @@ pub(crate) fn generate_code(
pub const #output_variable_name: #crate_prefix::display::tile_data::TileData = {
const _: &[u8] = include_bytes!(#image_filename);
const PALETTE_DATA: &[#crate_prefix::display::palette16::Palette16] = &[
#(#palette_data),*
];
const TILE_DATA: &[u8] = #data;
const PALETTE_ASSIGNMENT: &[u8] = &[
#(#assignments),*
];
#crate_prefix::display::tile_data::TileData::new(PALETTE_DATA, TILE_DATA, PALETTE_ASSIGNMENT)
#crate_prefix::display::tile_data::TileData::new(TILE_DATA, PALETTE_ASSIGNMENT)
};
}
}

View file

@ -19,7 +19,7 @@ fn main(mut gba: agb::Gba) -> ! {
let tileset = TileSet::new(affine_tiles::water_tiles.tiles, TileFormat::EightBpp);
vram.set_background_palettes(affine_tiles::water_tiles.palettes);
vram.set_background_palettes(affine_tiles::PALETTES);
let mut bg = gfx.background(Priority::P0, AffineBackgroundSize::Background32x32);

View file

@ -18,7 +18,7 @@ fn main(mut gba: agb::Gba) -> ! {
let tileset = TileSet::new(water_tiles::water_tiles.tiles, TileFormat::FourBpp);
vram.set_background_palettes(water_tiles::water_tiles.palettes);
vram.set_background_palettes(water_tiles::PALETTES);
let mut bg = gfx.background(Priority::P0, RegularBackgroundSize::Background32x32);

View file

@ -3,7 +3,7 @@ use super::tiled::{RegularMap, TileFormat, TileSet, TileSetting, TiledMap, VRamM
crate::include_gfx!("gfx/agb_logo.toml");
pub fn display_logo(map: &mut RegularMap, vram: &mut VRamManager) {
vram.set_background_palettes(agb_logo::test_logo.palettes);
vram.set_background_palettes(agb_logo::PALETTES);
let background_tilemap = TileSet::new(agb_logo::test_logo.tiles, TileFormat::FourBpp);

View file

@ -1,20 +1,13 @@
use crate::display::palette16::Palette16;
#[non_exhaustive]
pub struct TileData {
pub palettes: &'static [Palette16],
pub tiles: &'static [u8],
pub palette_assignments: &'static [u8],
}
impl TileData {
#[must_use]
pub const fn new(
palettes: &'static [Palette16],
tiles: &'static [u8],
palette_assignments: &'static [u8],
) -> Self {
pub const fn new(tiles: &'static [u8], palette_assignments: &'static [u8]) -> Self {
TileData {
palettes,
tiles,
palette_assignments,
}

View file

@ -8,7 +8,7 @@ use crate::sfx::Sfx;
include_gfx!("gfx/backgrounds.toml");
pub fn load_palettes(vram: &mut VRamManager) {
vram.set_background_palettes(backgrounds::stars.palettes);
vram.set_background_palettes(backgrounds::PALETTES);
}
pub(crate) fn load_help_text(
@ -101,7 +101,7 @@ fn create_background_map(map: &mut RegularMap, vram: &mut VRamManager, stars_til
pub fn show_title_screen(background: &mut RegularMap, vram: &mut VRamManager, sfx: &mut Sfx) {
background.set_scroll_pos((0i16, 0).into());
vram.set_background_palettes(backgrounds::title.palettes);
vram.set_background_palettes(backgrounds::PALETTES);
let tile_set = TileSet::new(
backgrounds::title.tiles,
agb::display::tiled::TileFormat::FourBpp,

View file

@ -785,7 +785,7 @@ fn agb_main(mut gba: agb::Gba) -> ! {
pub fn main(mut agb: agb::Gba) -> ! {
let (tiled, mut vram) = agb.display.video.tiled0();
vram.set_background_palettes(tile_sheet::background.palettes);
vram.set_background_palettes(tile_sheet::PALETTES);
let mut splash_screen = tiled.background(Priority::P0, RegularBackgroundSize::Background32x32);
let mut world_display = tiled.background(Priority::P0, RegularBackgroundSize::Background32x32);
@ -817,7 +817,7 @@ pub fn main(mut agb: agb::Gba) -> ! {
world_display.commit(&mut vram);
world_display.show();
vram.set_background_palettes(tile_sheet::background.palettes);
vram.set_background_palettes(tile_sheet::PALETTES);
let object = agb.display.object.get();
let mut mixer = agb.mixer.mixer();

View file

@ -19,20 +19,13 @@ pub fn show_splash_screen(
vram: &mut VRamManager,
) {
map.set_scroll_pos((0i16, 0i16).into());
let (tileset, palette) = match which {
SplashScreen::Start => {
let tileset = TileSet::new(splash_screens::splash.tiles, TileFormat::FourBpp);
let tileset = match which {
SplashScreen::Start => TileSet::new(splash_screens::splash.tiles, TileFormat::FourBpp),
(tileset, splash_screens::splash.palettes)
}
SplashScreen::End => {
let tileset = TileSet::new(
SplashScreen::End => TileSet::new(
splash_screens::thanks_for_playing.tiles,
TileFormat::FourBpp,
);
(tileset, splash_screens::thanks_for_playing.palettes)
}
),
};
let vblank = agb::interrupt::VBlank::get();
@ -77,7 +70,7 @@ pub fn show_splash_screen(
}
map.commit(vram);
vram.set_background_palettes(palette);
vram.set_background_palettes(splash_screens::PALETTES);
map.show();
loop {

View file

@ -2146,7 +2146,7 @@ impl<'a> Game<'a> {
}
fn update_sunrise(vram: &mut VRamManager, time: u16) {
let mut modified_palette = background::background.palettes[0].clone();
let mut modified_palette = background::PALETTES[0].clone();
let a = modified_palette.colour(0);
let b = modified_palette.colour(1);
@ -2160,7 +2160,7 @@ impl<'a> Game<'a> {
}
fn update_fade_out(vram: &mut VRamManager, time: u16) {
let mut modified_palette = background::background.palettes[0].clone();
let mut modified_palette = background::PALETTES[0].clone();
let c = modified_palette.colour(2);
@ -2216,7 +2216,7 @@ fn game_with_level(gba: &mut agb::Gba) {
loop {
let (background, mut vram) = gba.display.video.tiled0();
vram.set_background_palettes(background::background.palettes);
vram.set_background_palettes(background::PALETTES);
let tileset = TileSet::new(background::background.tiles, TileFormat::FourBpp);