diff options
author | Bad Diode <bd@badd10de.dev> | 2021-05-18 16:40:24 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-05-18 16:40:24 +0200 |
commit | 0c7265cf0de9d4ec95d28c5e103c00a63f4a1697 (patch) | |
tree | 4a1145e849e078395430a8d718c4bd69a06fb29f /src/sprites.h | |
download | uxngba-0c7265cf0de9d4ec95d28c5e103c00a63f4a1697.tar.gz uxngba-0c7265cf0de9d4ec95d28c5e103c00a63f4a1697.zip |
Proof of concept of UXN on the GBA
Diffstat (limited to 'src/sprites.h')
-rw-r--r-- | src/sprites.h | 79 |
1 files changed, 79 insertions, 0 deletions
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 @@ | |||
1 | #ifndef GBAEXP_SPRITES_H | ||
2 | #define GBAEXP_SPRITES_H | ||
3 | |||
4 | #include "common.h" | ||
5 | |||
6 | typedef struct Sprite { | ||
7 | // A unique sprite identifier. | ||
8 | size_t id; | ||
9 | // The number of tiles for a single sprite frame. | ||
10 | size_t n_tiles; | ||
11 | // The starting tile of this sprite. | ||
12 | size_t tile_start; | ||
13 | // The associated palette bank for this sprite. | ||
14 | size_t pal_bank; | ||
15 | } Sprite; | ||
16 | |||
17 | |||
18 | #define NUM_SPRITES 128 | ||
19 | Sprite sprites[NUM_SPRITES]; | ||
20 | |||
21 | // Keeping track of unique sprites and current sprite memory pointer using | ||
22 | // global singletons. | ||
23 | size_t sprite_counter = 0; | ||
24 | size_t sprite_tile_counter = 0; | ||
25 | u32 *sprite_memory = NULL; | ||
26 | |||
27 | // Loads the sprite data into video memory and initialize the Sprite structure. | ||
28 | size_t | ||
29 | load_sprite_data(u32 *sprite_data, size_t n_tiles, size_t n_frames) { | ||
30 | memcpy(sprite_memory, sprite_data, 8 * n_tiles * n_frames * sizeof(u32)); | ||
31 | sprite_memory += 8 * n_tiles * n_frames; | ||
32 | Sprite sprite = { | ||
33 | .id = sprite_counter, | ||
34 | .n_tiles = n_tiles, | ||
35 | .tile_start = sprite_tile_counter, | ||
36 | }; | ||
37 | sprite_tile_counter += n_tiles * n_frames; | ||
38 | sprites[sprite_counter] = sprite; | ||
39 | return sprite_counter++; | ||
40 | } | ||
41 | |||
42 | size_t | ||
43 | load_packed_sprite_data(u32 *sprite_data, size_t n_tiles, size_t n_frames) { | ||
44 | unpack_tiles(sprite_data, sprite_memory, n_tiles * n_frames); | ||
45 | sprite_memory += 8 * n_tiles * n_frames; | ||
46 | Sprite sprite = { | ||
47 | .id = sprite_counter, | ||
48 | .n_tiles = n_tiles, | ||
49 | .tile_start = sprite_tile_counter, | ||
50 | }; | ||
51 | sprite_tile_counter += n_tiles * n_frames; | ||
52 | sprites[sprite_counter] = sprite; | ||
53 | return sprite_counter++; | ||
54 | } | ||
55 | |||
56 | void | ||
57 | init_sprites(size_t starting_tile) { | ||
58 | // Initialize all attributes by disabling rendering. If we don't do this, | ||
59 | // glitches may appear. | ||
60 | for (size_t i = 0; i < 128; ++i) { | ||
61 | OBJ_ATTR_0(i) = (1 << 9); | ||
62 | } | ||
63 | |||
64 | sprite_counter = 0; | ||
65 | // Prepare global sprite_memory address. | ||
66 | sprite_memory = &TILE_MEM[4][starting_tile]; | ||
67 | sprite_tile_counter = starting_tile; | ||
68 | } | ||
69 | |||
70 | void | ||
71 | init_sprite_pal(size_t starting_index, Color col) { | ||
72 | // Add colors to the sprite color palette. Tiles with color number 0 are | ||
73 | // treated as transparent. | ||
74 | for (size_t i = 0; i < 16; ++i) { | ||
75 | PAL_BUFFER_SPRITES[i + starting_index] = col; | ||
76 | } | ||
77 | } | ||
78 | |||
79 | #endif // GBAEXP_SPRITES_H | ||