SGDK
A free and open development kit for the Sega Mega Drive
Loading...
Searching...
No Matches
sprite_eng.h
Go to the documentation of this file.
1
11
12#if !LEGACY_SPRITE_ENGINE
13
14#ifndef _SPRITE_ENG_H_
15#define _SPRITE_ENG_H_
16
17#include "vdp_tile.h"
18#include "vdp_spr.h"
19#include "pal.h"
20#include "pool.h"
21
22
27#define COLLISION_TYPE_NONE 0
32#define COLLISION_TYPE_BOX 1
37#define COLLISION_TYPE_CIRCLE 2
38
44#define SPR_FLAG_INSERT_HEAD 0x4000
51#define SPR_FLAG_DISABLE_ANIMATION_LOOP 0x2000
58#define SPR_FLAG_DISABLE_DELAYED_FRAME_UPDATE 0x1000
63#define SPR_FLAG_AUTO_VRAM_ALLOC 0x0800
68#define SPR_FLAG_AUTO_TILE_UPLOAD 0x0400
73#define SPR_FLAG_AUTO_VISIBILITY 0x0200
80#define SPR_FLAG_FAST_AUTO_VISIBILITY 0x0100
81
86#define SPR_FLAG_MASK (SPR_FLAG_INSERT_HEAD | SPR_FLAG_DISABLE_DELAYED_FRAME_UPDATE | SPR_FLAG_AUTO_VRAM_ALLOC | SPR_FLAG_AUTO_TILE_UPLOAD | SPR_FLAG_AUTO_VISIBILITY | SPR_FLAG_FAST_AUTO_VISIBILITY)
87
92#define SPR_MIN_DEPTH (-0x8000)
97#define SPR_MAX_DEPTH 0x7FFF
98
110
124typedef struct
125{
126 s8 x;
127 s8 y;
128 u8 w;
129 u8 h;
131
143typedef struct
144{
145 s8 x;
146 s8 y;
147 u16 ray;
149
170typedef struct _collision
171{
172 u8 typeHit;
173 u8 typeAttack;
174 union
175 {
176 BoxCollision box;
177 CircleCollision circle;
178 } hit;
179 union
180 {
181 BoxCollision box;
182 CircleCollision circle;
183 } attack;
184} Collision;
185
203typedef struct
204{
205 u8 offsetY; // respect VDP sprite field order, may help
206 u8 offsetYFlip;
207 u8 size;
208 u8 offsetX;
209 u8 offsetXFlip;
210 u8 numTile;
212
229typedef struct
230{
231 s8 numSprite;
232 u8 timer;
233 TileSet* tileset; // TODO: have a tileset per VDP sprite --> probably not a good idea performance wise
234 Collision* collision; // Require many DMA queue operations and fast DMA flush as well, also bring extra computing in calculating delayed update
235 FrameVDPSprite frameVDPSprites[];
237
249typedef struct
250{
251 u8 numFrame;
252 u8 loop;
253 AnimationFrame** frames;
254} Animation;
255
277typedef struct
278{
279 u16 w;
280 u16 h;
281 Palette* palette;
282 u16 numAnimation;
283 Animation** animations;
284 u16 maxNumTile;
285 u16 maxNumSprite;
287
328typedef struct Sprite
329{
330 u16 status;
331 u16 visibility;
332 const SpriteDefinition* definition;
333 void (*onFrameChange)(struct Sprite* sprite);
334 Animation* animation;
335 AnimationFrame* frame;
336 s16 animInd;
337 s16 frameInd;
338 s16 timer;
339 s16 x;
340 s16 y;
341 s16 depth;
342 u16 attribut;
343 u32 data;
344 struct Sprite* prev;
345 struct Sprite* next;
347
359typedef void FrameChangeCallback(Sprite* sprite);
360
364extern Pool* spritesPool;
368extern Sprite* firstSprite;
372extern Sprite* lastSprite;
376extern u16 spriteVramSize;
377
378
389void SPR_init(void);
404void SPR_initEx(u16 vramSize);
412void SPR_end(void);
417bool SPR_isInitialized(void);
418
425void SPR_reset(void);
426
471Sprite* SPR_addSpriteEx(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut, u16 flag);
496Sprite* SPR_addSprite(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut);
539Sprite* SPR_addSpriteExSafe(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut, u16 flag);
562Sprite* SPR_addSpriteSafe(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut);
563
575void SPR_releaseSprite(Sprite* sprite);
590u16 SPR_getFreeVRAM(void);
596
621void SPR_defragVRAM(void);
622
658u16** SPR_loadAllFramesEx(const SpriteDefinition* sprDef, u16 index, u16* totalNumTile, TransferMethod tm);
687u16** SPR_loadAllFrames(const SpriteDefinition* sprDef, u16 index, u16* totalNumTile);
703u16** SPR_loadAllIndexes(const SpriteDefinition* sprDef, u16 index, u16* totalNumTile);
726u16 SPR_loadAllTiles(const SpriteDefinition* sprDef, u16 index, u16** indexes, const TransferMethod tm);
727
742bool SPR_setDefinition(Sprite* sprite, const SpriteDefinition* spriteDef);
764void SPR_setPosition(Sprite* sprite, s16 x, s16 y);
774void SPR_setHFlip(Sprite* sprite, bool value);
784void SPR_setVFlip(Sprite* sprite, bool value);
794void SPR_setPalette(Sprite* sprite, u16 value);
804void SPR_setPriority(Sprite* sprite, bool value);
809#define SPR_setPriorityAttribut(sprite, value) _Pragma("GCC error \"This method is deprecated, use SPR_setPriority(..) instead.\"")
822void SPR_setDepth(Sprite* sprite, s16 value);
827void SPR_setZ(Sprite* sprite, s16 value);
837void SPR_setAlwaysOnTop(Sprite* sprite);
847void SPR_setAlwaysAtBottom(Sprite* sprite);
859void SPR_setAnimAndFrame(Sprite* sprite, s16 anim, s16 frame);
869void SPR_setAnim(Sprite* sprite, s16 anim);
879void SPR_setFrame(Sprite* sprite, s16 frame);
887void SPR_nextFrame(Sprite* sprite);
899void SPR_setAutoAnimation(Sprite* sprite, bool value);
906bool SPR_getAutoAnimation(Sprite* sprite);
920void SPR_setAnimationLoop(Sprite* sprite, bool value);
930bool SPR_isAnimationDone(Sprite* sprite);
945bool SPR_setVRAMTileIndex(Sprite* sprite, s16 value);
956void SPR_setAutoTileUpload(Sprite* sprite, bool value);
969void SPR_setDelayedFrameUpdate(Sprite* sprite, bool value);
986
1023bool SPR_isVisible(Sprite* sprite, bool recompute);
1024
1048void SPR_setVisibility(Sprite* sprite, SpriteVisibility value);
1052#define SPR_setAlwaysVisible(sprite, value) _Pragma("GCC error \"This method is deprecated, use SPR_setVisibility(..) instead.\"")
1056#define SPR_setNeverVisible(sprite, value) _Pragma("GCC error \"This method is deprecated, use SPR_setVisibility(..) instead.\"")
1060#define SPR_computeVisibility(sprite) _Pragma("GCC error \"This method is deprecated, use SPR_isVisible(sprite, TRUE) instead.\"")
1061
1069void SPR_clear(void);
1079void SPR_update(void);
1080
1085void SPR_logProfil(void);
1090void SPR_logSprites(void);
1091
1092
1093#endif // _SPRITE_ENG_H_
1094
1095#endif
TransferMethod
VRAM transfer method.
Definition dma.h:52
Palette support (herited from vdp_pal.h unit)
Pool object management unit.
void SPR_setPriority(Sprite *sprite, bool value)
Set sprite Priority attribut.
Definition sprite_eng.c:1043
void SPR_enableVDPSpriteChecking()
Indicate that we want to prevent adding a new sprite if there is possibly not enough hardware sprite ...
Definition sprite_eng.c:531
void SPR_setHFlip(Sprite *sprite, bool value)
Set sprite Horizontal Flip attribut.
Definition sprite_eng.c:949
void SPR_setVFlip(Sprite *sprite, bool value)
Set sprite Vertical Flip attribut.
Definition sprite_eng.c:996
void SPR_releaseSprite(Sprite *sprite)
Release the specified sprite (no more visible and release its resources).
Definition sprite_eng.c:480
bool SPR_setVRAMTileIndex(Sprite *sprite, s16 value)
Set the VRAM tile position reserved for this sprite.
Definition sprite_eng.c:1339
void SPR_init(void)
Initialize the Sprite engine with default parameters.
Definition sprite_eng.c:155
void SPR_defragVRAM(void)
Defragment allocated VRAM for sprites, that can help when sprite allocation fail (SPR_addSprite(....
Definition sprite_eng.c:542
void SPR_setAutoTileUpload(Sprite *sprite, bool value)
Enable/disable the automatic upload of sprite tiles data into VRAM.
Definition sprite_eng.c:1422
void SPR_setAnimationLoop(Sprite *sprite, bool value)
Enable/disable animation loop (default is on). When disable the sprite will stay on the last animati...
Definition sprite_eng.c:1315
bool SPR_isAnimationDone(Sprite *sprite)
Returns TRUE if the sprite reached the end of the current animation. When auto animation is enabled ...
Definition sprite_eng.c:1328
u16 ** SPR_loadAllIndexes(const SpriteDefinition *sprDef, u16 index, u16 *totalNumTile)
Same as SPR_loadAllFrames(..) but only computes the indexes table without actually loading the Sprite...
Definition sprite_eng.c:700
Sprite * SPR_addSpriteEx(const SpriteDefinition *spriteDef, s16 x, s16 y, u16 attribut, u16 flag)
Adds a new sprite with specified parameters and returns it.
Definition sprite_eng.c:329
void SPR_setAnim(Sprite *sprite, s16 anim)
Set current sprite animation.
Definition sprite_eng.c:1184
u16 ** SPR_loadAllFramesEx(const SpriteDefinition *sprDef, u16 index, u16 *totalNumTile, TransferMethod tm)
Load all frames of SpriteDefinition using DMA at specified VRAM tile index and return the indexes tab...
Definition sprite_eng.c:620
s16 SPR_getPositionX(Sprite *sprite)
Get sprite position X.
Definition sprite_eng.c:912
void SPR_logSprites(void)
Log the sprites informations (when enabled) in the KMod message window.
Definition sprite_eng.c:1835
void SPR_initEx(u16 vramSize)
Init the Sprite engine with specified advanced parameters (VRAM allocation size and decompression buf...
Definition sprite_eng.c:120
void SPR_setAutoAnimation(Sprite *sprite, bool value)
Enable/disable auto animation for the current animation (default is on).
Definition sprite_eng.c:1285
void SPR_setVisibility(Sprite *sprite, SpriteVisibility value)
Set the visibility state for this sprite.
Definition sprite_eng.c:1485
void SPR_setFrame(Sprite *sprite, s16 frame)
Set current sprite frame.
Definition sprite_eng.c:1220
s16 SPR_getPositionY(Sprite *sprite)
Get sprite position Y.
Definition sprite_eng.c:917
void SPR_setFrameChangeCallback(Sprite *sprite, FrameChangeCallback *callback)
Set the frame change event callback for this sprite.
Definition sprite_eng.c:1440
u16 SPR_getFreeVRAM(void)
Returns the current remaining free VRAM (in tile) for the sprite engine.
Definition sprite_eng.c:521
void SPR_update(void)
Update and display the active list of sprite.
Definition sprite_eng.c:1570
u16 SPR_loadAllTiles(const SpriteDefinition *sprDef, u16 index, u16 **indexes, const TransferMethod tm)
Same as SPR_loadAllFrames(..) but only perform the Sprite tile data upload process,...
Definition sprite_eng.c:777
void SPR_setAnimAndFrame(Sprite *sprite, s16 anim, s16 frame)
Set current sprite animation and frame.
Definition sprite_eng.c:1139
void FrameChangeCallback(Sprite *sprite)
Sprite frame change event callback.
Definition sprite_eng.h:359
Sprite * SPR_addSpriteSafe(const SpriteDefinition *spriteDef, s16 x, s16 y, u16 attribut)
Adds a new sprite with auto resource allocation enabled and returns it.
Definition sprite_eng.c:464
void SPR_logProfil(void)
Log the profil informations (when enabled) in the KMod message window.
Definition sprite_eng.c:1815
void SPR_setAlwaysOnTop(Sprite *sprite)
Set sprite depth so it remains above others sprite - same as SPR_setDepth(SPR_MIN_DEPTH)
Definition sprite_eng.c:1129
SpriteVisibility
Sprite visibility enumeration.
Definition sprite_eng.h:104
@ HIDDEN
Definition sprite_eng.h:106
@ AUTO_FAST
Definition sprite_eng.h:107
@ AUTO_SLOW
Definition sprite_eng.h:108
@ VISIBLE
Definition sprite_eng.h:105
u16 SPR_getLargestFreeVRAMBlock(void)
Return the current largest free VRAM block size (in tile) for the sprite engine.
Definition sprite_eng.c:526
u16 SPR_getNumActiveSprite(void)
Returns the number of active sprite (number of sprite added with SPR_addSprite(..) or SPR_addSpriteEx...
Definition sprite_eng.c:511
void SPR_clear(void)
Clear all displayed sprites.
Definition sprite_eng.c:1553
bool SPR_isInitialized(void)
FALSE if sprite cache engine is not initialized, TRUE otherwise.
Definition sprite_eng.c:190
Sprite * SPR_addSprite(const SpriteDefinition *spriteDef, s16 x, s16 y, u16 attribut)
Adds a new sprite with auto resource allocation enabled and returns it.
Definition sprite_eng.c:443
u16 SPR_getUsedVDPSprite(void)
Returns the (maximum) number of used VDP sprite from current active sprites (sum of maximum hardware ...
Definition sprite_eng.c:516
void SPR_nextFrame(Sprite *sprite)
Pass to the next sprite frame.
Definition sprite_eng.c:1253
u16 ** SPR_loadAllFrames(const SpriteDefinition *sprDef, u16 index, u16 *totalNumTile)
Same as all frames of SpriteDefinition at specified VRAM tile index and return the indexes table....
Definition sprite_eng.c:615
void SPR_setZ(Sprite *sprite, s16 value)
Same as SPR_setDepth(..)
Definition sprite_eng.c:1124
void SPR_setPalette(Sprite *sprite, u16 value)
Set sprite Palette index to use.
Definition sprite_eng.c:1080
void SPR_setDelayedFrameUpdate(Sprite *sprite, bool value)
Enable/disable the delayed frame update.
Definition sprite_eng.c:1431
bool SPR_setDefinition(Sprite *sprite, const SpriteDefinition *spriteDef)
Set the Sprite Definition.
Definition sprite_eng.c:821
Sprite * SPR_addSpriteExSafe(const SpriteDefinition *spriteDef, s16 x, s16 y, u16 attribut, u16 flag)
Adds a new sprite with specified parameters and returns it.
Definition sprite_eng.c:448
void SPR_setAlwaysAtBottom(Sprite *sprite)
Set sprite depth so it remains behind others sprite - same as SPR_setDepth(SPR_MAX_DEPTH)
Definition sprite_eng.c:1134
void SPR_disableVDPSpriteChecking()
Indicate that we allow the sprite engine to add a new sprite even if we may run out of hardware sprit...
Definition sprite_eng.c:537
void SPR_setDepth(Sprite *sprite, s16 value)
Set sprite depth (for sprite display ordering)
Definition sprite_eng.c:1102
void SPR_setPosition(Sprite *sprite, s16 x, s16 y)
Set sprite position.
Definition sprite_eng.c:922
SpriteVisibility SPR_getVisibility(Sprite *sprite)
Return the visibility state for this sprite. WARNING: this is different from SPR_isVisible(....
Definition sprite_eng.c:1448
void SPR_reset(void)
Reset the Sprite engine.
Definition sprite_eng.c:195
bool SPR_isVisible(Sprite *sprite, bool recompute)
Return the visible state for this sprite (meaningful only if AUTO visibility is enabled,...
Definition sprite_eng.c:1462
bool SPR_getAutoAnimation(Sprite *sprite)
Return TRUE if auto animation is enabled, FALSE otherwise.
Definition sprite_eng.c:1307
void SPR_end(void)
End the Sprite engine.
Definition sprite_eng.c:160
Definition sprite_eng.h:171
Sprite animation frame structure.
Definition sprite_eng.h:230
Sprite animation structure.
Definition sprite_eng.h:250
Simple Box structure for collision.
Definition sprite_eng.h:125
Simple Circle structure (can be used for collision detection)
Definition sprite_eng.h:144
Collision definition union.
Single VDP sprite info structure for sprite animation frame.
Definition sprite_eng.h:204
Palette structure contains color data.
Definition pal.h:73
Object pool allocator structure.
Definition pool.h:57
Sprite definition structure.
Definition sprite_eng.h:278
Sprite structure used by the Sprite Engine to store state for a sprite. WARNING: always use the SPR_...
Definition sprite_eng.h:329
Tile set structure which contains tiles definition. Use the unpackTileSet() method to unpack if comp...
Definition vdp_tile.h:114
unsigned long u32
Definition types.h:105
short s16
Definition types.h:84
char s8
Definition types.h:79
unsigned short u16
Definition types.h:100
unsigned char u8
Definition types.h:95
VDP Sprite support.
VDP General Tile / Tilemap operations.