aboutsummaryrefslogtreecommitdiffstats
path: root/src/sprites.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-05-18 16:40:24 +0200
committerBad Diode <bd@badd10de.dev>2021-05-18 16:40:24 +0200
commit0c7265cf0de9d4ec95d28c5e103c00a63f4a1697 (patch)
tree4a1145e849e078395430a8d718c4bd69a06fb29f /src/sprites.h
downloaduxngba-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.h79
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
6typedef 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
19Sprite sprites[NUM_SPRITES];
20
21// Keeping track of unique sprites and current sprite memory pointer using
22// global singletons.
23size_t sprite_counter = 0;
24size_t sprite_tile_counter = 0;
25u32 *sprite_memory = NULL;
26
27// Loads the sprite data into video memory and initialize the Sprite structure.
28size_t
29load_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
42size_t
43load_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
56void
57init_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
70void
71init_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