36#ifndef OPENSNES_SPRITE_H
37#define OPENSNES_SPRITE_H
46#define MAX_SPRITES 128
49#define OBJ_SIZE8_L16 0
50#define OBJ_SIZE8_L32 1
51#define OBJ_SIZE8_L64 2
52#define OBJ_SIZE16_L32 3
53#define OBJ_SIZE16_L64 4
54#define OBJ_SIZE32_L64 5
57#define OBJ_SIZE_TO_REG(size) ((size) << 5)
60#define OBJ_BASE(vram_addr) (((vram_addr) >> 13) & 0x07)
72#define OBJSEL(size, vram_addr) ((u8)(OBJ_SIZE_TO_REG(size) | OBJ_BASE(vram_addr)))
75#define OBJ_CGRAM_BASE 128
78#define OBJ_CGRAM_PAL(n) (OBJ_CGRAM_BASE + (n) * 16)
81#define PALETTE_16_SIZE 32
84#define OAM_Y_OFFSCREEN 0xE0
87#define OAM_EXT_OFFSET 512
90#define OAM_EXT_SIZE 32
93#define OAM_BUFFER_SIZE 544
111#define OBJ_SPRITE32 1
112#define OBJ_SPRITE16 2
116#define OBJ_QUEUELIST_SIZE 128
119#define MAXSPRTRF (7 * 6)
206_Static_assert(
sizeof(
t_sprites) == 16,
"t_sprites must be 16 bytes");
207_Static_assert(__builtin_offsetof(
t_sprites, oamx) == 0,
"oamx offset mismatch");
208_Static_assert(__builtin_offsetof(
t_sprites, oamy) == 2,
"oamy offset mismatch");
209_Static_assert(__builtin_offsetof(
t_sprites, oamframeid) == 4,
"oamframeid offset mismatch");
210_Static_assert(__builtin_offsetof(
t_sprites, oamattribute) == 6,
"oamattribute offset mismatch");
211_Static_assert(__builtin_offsetof(
t_sprites, oamrefresh) == 7,
"oamrefresh offset mismatch");
212_Static_assert(__builtin_offsetof(
t_sprites, oamgfxaddr) == 8,
"oamgfxaddr offset mismatch");
213_Static_assert(__builtin_offsetof(
t_sprites, oamgfxbank) == 10,
"oamgfxbank offset mismatch");
225#define OAM_SET_GFX(id, gfx) do { \
226 oambuffer[id].oamgfxaddr = (u16)(gfx); \
227 oambuffer[id].oamgfxbank = 0; \
239#define OAM_SET_GFX_BANK(id, gfx, bank) do { \
240 oambuffer[id].oamgfxaddr = (u16)(gfx); \
241 oambuffer[id].oamgfxbank = (u8)(bank); \
265#define OAM_DEFAULT_SIZE OBJ_SIZE8_L16
267#define OAM_DEFAULT_TILE_BASE 0
307 u16 paletteSize,
u8 paletteEntry,
u16 vramAddr,
u8 oamSize);
467#define METASPR_ITEM(dx, dy, tile, attr) { (dx), (dy), (tile), (attr), 0 }
470#define METASPR_TERM { -128, 0, 0, 0, 0 }
473#define metasprite_end (-128)
476#define OBJ_PAL(pal) ((pal) << 1)
479#define OBJ_PRIO(prio) ((prio) << 4)
482#define OBJ_FLIPX 0x40
485#define OBJ_FLIPY 0x80
488#define OBJ_NAMETABLE_HIGH 0x01
522 u16 baseTile,
u8 basePalette,
u8 size);
545 u16 baseTile,
u8 basePalette,
u8 size,
546 u8 flipX,
u8 flipY,
u8 width,
u8 height);
749#define OAM_ATTR(_tile, _pal, _prio, _fl) \
750 ((u8)(((_fl) & 0xC0) | \
751 (((_prio) & 0x03) << 4) | \
752 (((_pal) & 0x07) << 1) | \
753 (((_tile) >> 8) & 0x01)))
761#define OAM_XHI_MASK(_slot) \
762 ((u8)((_slot) == 0 ? 0x01 : (_slot) == 1 ? 0x04 : \
763 (_slot) == 2 ? 0x10 : 0x40))
780#define oamSetFast(_id, _x, _y, _tile, _pal, _prio, _fl) do { \
781 u16 _off = (u16)(_id) << 2; \
782 oamMemory[_off + 0] = (u8)((_x) & 0xFF); \
783 oamMemory[_off + 1] = (u8)(((_y) - 1) & 0xFF); \
784 oamMemory[_off + 2] = (u8)((_tile) & 0xFF); \
785 oamMemory[_off + 3] = OAM_ATTR(_tile, _pal, _prio, _fl); \
786 u16 _ext = 512 + ((u16)(_id) >> 2); \
787 u16 _sl = (u16)(_id) & 0x03; \
788 u8 _xhi = OAM_XHI_MASK(_sl); \
790 oamMemory[_ext] |= _xhi; \
792 oamMemory[_ext] &= ~_xhi; \
793 oam_update_flag = 1; \
806#define oamSetXYFast(_id, _x, _y) do { \
807 u16 _off = (u16)(_id) << 2; \
808 oamMemory[_off + 0] = (u8)((_x) & 0xFF); \
809 oamMemory[_off + 1] = (u8)(((_y) - 1) & 0xFF); \
810 u16 _ext = 512 + ((u16)(_id) >> 2); \
811 u16 _sl = (u16)(_id) & 0x03; \
812 u8 _xhi = OAM_XHI_MASK(_sl); \
814 oamMemory[_ext] |= _xhi; \
816 oamMemory[_ext] &= ~_xhi; \
817 oam_update_flag = 1; \
u8 palette[]
Full 256-color palette for BG and sprite layers (512 bytes)
signed short s16
16-bit signed integer (-32768 to 32767)
Definition types.h:49
unsigned short u16
16-bit unsigned integer (0 to 65535)
Definition types.h:52
unsigned char u8
8-bit unsigned integer (0 to 255)
Definition types.h:46
void oamDynamicSetSize(u16 id, u8 size)
Override the dispatched pixel size for a dynamic sprite slot.
void oamSetTile(u8 id, u16 tile)
Set sprite tile.
u16 lkup16idT[]
OAM tile IDs for 16x16 sprites - small size mode (64 entries)
void oamSetX(u8 id, u16 x)
Set sprite X position.
u8 oamDrawMeta(u8 startId, s16 x, s16 y, const MetaspriteItem *meta, u16 baseTile, u8 basePalette, u8 size)
Draw a metasprite (PVSnesLib compatible)
t_sprites oambuffer[128]
Dynamic sprite buffer (128 entries, 2048 bytes)
void oamSetSize(u16 id, u16 large)
Set sprite size (large/small)
void oamDynamicInit(const OamDynamicConfig *cfg)
Initialize the dynamic sprite engine from a config struct.
u16 lkup32oamS[]
VRAM source offsets for 32x32 sprites (16 entries)
u16 lkup16oamS[]
VRAM source offsets for 16x16 sprites (64 entries)
u8 oamDrawMetasprite(u8 startId, u16 x, u8 y, const u8 *data, u8 palette)
Draw a metasprite (legacy simple interface)
void oamInitGfxSet(u8 *tileSource, u16 tileSize, u8 *tilePalette, u16 paletteSize, u8 paletteEntry, u16 vramAddr, u8 oamSize)
Initialize sprite graphics and palette (PVSnesLib compatible)
u16 lkup8oamS[]
VRAM source offsets for 8x8 sprites (128 entries)
void oamHide(u8 id)
Hide sprite.
void oamSetXY(u8 id, u16 x, u8 y)
Set sprite position.
void oamDynamicDraw(u16 id)
Draw a dynamic sprite — engine picks the size routine.
u16 lkup16idT0[]
OAM tile IDs for 16x16 sprites - large size mode (64 entries)
void oamSet(u16 id, u16 x, u16 y, u16 tile, u16 palette, u16 priority, u16 flags)
Set sprite properties.
u16 lkup16idB[]
VRAM destination addresses for 16x16 sprites (64 entries)
void oamMetaDrawDyn(u16 id, s16 x, s16 y, const MetaspriteItem *meta, u8 *gfxptr, u8 size_class)
Draw a dynamic metasprite — engine picks the size routine.
void oamClear(void)
Clear all sprites.
void oamUpdate(void)
Copy OAM buffer to hardware.
void oamInit(u16 size, u16 tile_base)
Initialize the sprite (OAM) system.
u8 oamDrawMetaFlip(u8 startId, s16 x, s16 y, const MetaspriteItem *meta, u16 baseTile, u8 basePalette, u8 size, u8 flipX, u8 flipY, u8 width, u8 height)
Draw a metasprite with flip support.
void oamDynamicDrainQueue(void)
Block until the dynamic-sprite VRAM tile queue is empty.
void oamSetY(u8 id, u8 y)
Set sprite Y position.
u16 lkup8idB[]
VRAM destination addresses for 8x8 sprites (128 entries)
u16 lkup32idT[]
OAM tile IDs for 32x32 sprites (16 entries)
MetaspriteItem t_metasprite
PVSnesLib compatibility typedef.
Definition sprite.h:464
u16 lkup8idT[]
OAM tile IDs for 8x8 sprites (128 entries)
u16 lkup32idB[]
VRAM destination addresses for 32x32 sprites (16 entries)
void oamSetVisible(u8 id, u8 visible)
Set sprite visibility.
Configuration for the dynamic sprite engine.
Definition sprite.h:574
u16 vramLarge
Definition sprite.h:575
u16 vramSmall
Definition sprite.h:576
u16 slotSmallInit
Definition sprite.h:578
u8 sizeMode
Definition sprite.h:579
u16 slotLargeInit
Definition sprite.h:577
Dynamic sprite state structure (16 bytes, PVSnesLib compatible)
Definition sprite.h:188
u16 oamframeid
Definition sprite.h:191
u8 _pad
Definition sprite.h:196
s16 oamx
Definition sprite.h:189
u16 _reserved2
Definition sprite.h:198
s16 oamy
Definition sprite.h:190
u16 oamgfxaddr
Definition sprite.h:194
u16 _reserved1
Definition sprite.h:197
u8 oamgfxbank
Definition sprite.h:195
u8 oamattribute
Definition sprite.h:192
u8 oamrefresh
Definition sprite.h:193