stable floor cones
[gbajam22] / src / sprite.c
1 #include "sprite.h"
2 #include "gbaregs.h"
3
4
5 void spr_setup(int xtiles, int ytiles, unsigned char *pixels, unsigned char *cmap)
6 {
7         int i, j, num_tiles;
8         uint16_t *cptr, *src, *dst;
9
10         num_tiles = xtiles * ytiles;
11         dst = (uint16_t*)VRAM_LFB_OBJ_ADDR;
12         src = (uint16_t*)pixels;
13         for(i=0; i<num_tiles; i++) {
14                 /* copy every row of tile i (8x8) */
15                 for(j=0; j<8; j++) {
16                         *dst++ = src[j * 64];
17                         *dst++ = src[j * 64 + 1];
18                 }
19                 src += 2;
20
21                 if((i & 31) == 31) {
22                         src += 7 * 64;  /* skip to the next row of tiles (skip 7 rows of pixels) */
23                 }
24         }
25
26         cptr = (uint16_t*)CRAM_OBJ_ADDR;
27         for(i=0; i<16; i++) {
28                 unsigned char r = *cmap++ >> 3;
29                 unsigned char g = *cmap++ >> 3;
30                 unsigned char b = *cmap++ >> 3;
31                 *cptr++ = r | ((uint16_t)g << 5) | ((uint16_t)b << 10);
32         }
33 }
34
35 void spr_clear(void)
36 {
37         int i;
38
39         for(i=0; i<128; i++) {
40                 spr_oam_clear(0, i);
41         }
42 }
43
44 void spr_oam(uint16_t *oam, int idx, int spr, int x, int y, unsigned int flags)
45 {
46         if(!oam) oam = (uint16_t*)OAM_ADDR;
47
48         oam += idx << 2;
49
50         oam[0] = (y & 0xff) | (flags & 0xff00);
51         oam[1] = (x & 0x1ff) | ((flags >> 8) & 0xfe00);
52         oam[2] = (spr & 0x3ff) | ((flags & 3) << 10);
53 }
54
55 void spr_spr_oam(uint16_t *oam, int idx, struct sprite *spr)
56 {
57         int i;
58         struct hwsprite *s;
59
60         s = spr->hwspr;
61         for(i=0; i<spr->num_hwspr; i++) {
62                 spr_oam(oam, idx, s->id, spr->x + s->x, spr->y + s->y, s->flags);
63                 s++;
64         }
65 }
66
67 void spr_transform(uint16_t *oam, int idx, int16_t *mat)
68 {
69         if(!oam) oam = (uint16_t*)OAM_ADDR;
70
71         oam += (idx << 4) + 3;
72
73         oam[0] = *mat++;
74         oam[4] = *mat++;
75         oam[8] = *mat++;
76         oam[12] = *mat;
77 }