From 0c7265cf0de9d4ec95d28c5e103c00a63f4a1697 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 18 May 2021 16:40:24 +0200 Subject: Proof of concept of UXN on the GBA --- src/sprites.h | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/sprites.h (limited to 'src/sprites.h') diff --git a/src/sprites.h b/src/sprites.h new file mode 100644 index 0000000..a64b784 --- /dev/null +++ b/src/sprites.h @@ -0,0 +1,79 @@ +#ifndef GBAEXP_SPRITES_H +#define GBAEXP_SPRITES_H + +#include "common.h" + +typedef struct Sprite { + // A unique sprite identifier. + size_t id; + // The number of tiles for a single sprite frame. + size_t n_tiles; + // The starting tile of this sprite. + size_t tile_start; + // The associated palette bank for this sprite. + size_t pal_bank; +} Sprite; + + +#define NUM_SPRITES 128 +Sprite sprites[NUM_SPRITES]; + +// Keeping track of unique sprites and current sprite memory pointer using +// global singletons. +size_t sprite_counter = 0; +size_t sprite_tile_counter = 0; +u32 *sprite_memory = NULL; + +// Loads the sprite data into video memory and initialize the Sprite structure. +size_t +load_sprite_data(u32 *sprite_data, size_t n_tiles, size_t n_frames) { + memcpy(sprite_memory, sprite_data, 8 * n_tiles * n_frames * sizeof(u32)); + sprite_memory += 8 * n_tiles * n_frames; + Sprite sprite = { + .id = sprite_counter, + .n_tiles = n_tiles, + .tile_start = sprite_tile_counter, + }; + sprite_tile_counter += n_tiles * n_frames; + sprites[sprite_counter] = sprite; + return sprite_counter++; +} + +size_t +load_packed_sprite_data(u32 *sprite_data, size_t n_tiles, size_t n_frames) { + unpack_tiles(sprite_data, sprite_memory, n_tiles * n_frames); + sprite_memory += 8 * n_tiles * n_frames; + Sprite sprite = { + .id = sprite_counter, + .n_tiles = n_tiles, + .tile_start = sprite_tile_counter, + }; + sprite_tile_counter += n_tiles * n_frames; + sprites[sprite_counter] = sprite; + return sprite_counter++; +} + +void +init_sprites(size_t starting_tile) { + // Initialize all attributes by disabling rendering. If we don't do this, + // glitches may appear. + for (size_t i = 0; i < 128; ++i) { + OBJ_ATTR_0(i) = (1 << 9); + } + + sprite_counter = 0; + // Prepare global sprite_memory address. + sprite_memory = &TILE_MEM[4][starting_tile]; + sprite_tile_counter = starting_tile; +} + +void +init_sprite_pal(size_t starting_index, Color col) { + // Add colors to the sprite color palette. Tiles with color number 0 are + // treated as transparent. + for (size_t i = 0; i < 16; ++i) { + PAL_BUFFER_SPRITES[i + starting_index] = col; + } +} + +#endif // GBAEXP_SPRITES_H -- cgit v1.2.1