sgdk
|
00001 00012 #if !LEGACY_SPRITE_ENGINE 00013 00014 #ifndef _SPRITE_ENG_H_ 00015 #define _SPRITE_ENG_H_ 00016 00017 #include "vdp_tile.h" 00018 #include "vdp_spr.h" 00019 #include "pal.h" 00020 #include "pool.h" 00021 00022 00027 #define COLLISION_TYPE_NONE 0 00028 00032 #define COLLISION_TYPE_BOX 1 00033 00037 #define COLLISION_TYPE_CIRCLE 2 00038 00044 #define SPR_FLAG_INSERT_HEAD 0x4000 00045 00051 #define SPR_FLAG_DISABLE_ANIMATION_LOOP 0x2000 00052 00058 #define SPR_FLAG_DISABLE_DELAYED_FRAME_UPDATE 0x1000 00059 00063 #define SPR_FLAG_AUTO_VRAM_ALLOC 0x0800 00064 00068 #define SPR_FLAG_AUTO_TILE_UPLOAD 0x0400 00069 00073 #define SPR_FLAG_AUTO_VISIBILITY 0x0200 00074 00080 #define SPR_FLAG_FAST_AUTO_VISIBILITY 0x0100 00081 00086 #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) 00087 00092 #define SPR_MIN_DEPTH (-0x8000) 00093 00097 #define SPR_MAX_DEPTH 0x7FFF 00098 00103 typedef enum 00104 { 00105 VISIBLE, 00106 HIDDEN, 00107 AUTO_FAST, 00108 AUTO_SLOW, 00109 } SpriteVisibility; 00110 00124 typedef struct 00125 { 00126 s8 x; 00127 s8 y; 00128 u8 w; 00129 u8 h; 00130 } BoxCollision; 00131 00143 typedef struct 00144 { 00145 s8 x; 00146 s8 y; 00147 u16 ray; 00148 } CircleCollision; 00149 00170 typedef struct _collision 00171 { 00172 u8 typeHit; 00173 u8 typeAttack; 00174 union 00175 { 00176 BoxCollision box; 00177 CircleCollision circle; 00178 } hit; 00179 union 00180 { 00181 BoxCollision box; 00182 CircleCollision circle; 00183 } attack; 00184 } Collision; 00185 00203 typedef struct 00204 { 00205 u8 offsetY; // respect VDP sprite field order, may help 00206 u8 offsetYFlip; 00207 u8 size; 00208 u8 offsetX; 00209 u8 offsetXFlip; 00210 u8 numTile; 00211 } FrameVDPSprite; 00212 00228 typedef struct 00229 { 00230 u8 numSprite; 00231 u8 timer; 00232 TileSet* tileset; // TODO: have a tileset per VDP sprite --> probably not a good idea performance wise 00233 Collision* collision; // Require many DMA queue operations and fast DMA flush as well, also bring extra computing in calculating delayed update 00234 FrameVDPSprite frameVDPSprites[]; 00235 } AnimationFrame; 00236 00248 typedef struct 00249 { 00250 u8 numFrame; 00251 u8 loop; 00252 AnimationFrame** frames; 00253 } Animation; 00254 00276 typedef struct 00277 { 00278 u16 w; 00279 u16 h; 00280 Palette* palette; 00281 u16 numAnimation; 00282 Animation** animations; 00283 u16 maxNumTile; 00284 u16 maxNumSprite; 00285 } SpriteDefinition; 00286 00327 typedef struct Sprite 00328 { 00329 u16 status; 00330 u16 visibility; 00331 const SpriteDefinition* definition; 00332 void (*onFrameChange)(struct Sprite* sprite); 00333 Animation* animation; 00334 AnimationFrame* frame; 00335 s16 animInd; 00336 s16 frameInd; 00337 u16 timer; 00338 s16 x; 00339 s16 y; 00340 s16 depth; 00341 u16 attribut; 00342 u32 data; 00343 struct Sprite* prev; 00344 struct Sprite* next; 00345 } Sprite; 00346 00358 typedef void FrameChangeCallback(Sprite* sprite); 00359 00363 extern Pool* spritesPool; 00367 extern Sprite* firstSprite; 00371 extern Sprite* lastSprite; 00375 extern u16 spriteVramSize; 00376 00377 00388 void SPR_init(void); 00403 void SPR_initEx(u16 vramSize); 00411 void SPR_end(void); 00416 bool SPR_isInitialized(void); 00417 00424 void SPR_reset(void); 00425 00470 Sprite* SPR_addSpriteEx(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut, u16 flag); 00495 Sprite* SPR_addSprite(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut); 00538 Sprite* SPR_addSpriteExSafe(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut, u16 flag); 00561 Sprite* SPR_addSpriteSafe(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut); 00562 00574 void SPR_releaseSprite(Sprite* sprite); 00579 u16 SPR_getNumActiveSprite(void); 00584 u16 SPR_getUsedVDPSprite(void); 00589 u16 SPR_getFreeVRAM(void); 00594 u16 SPR_getLargestFreeVRAMBlock(void); 00595 00606 void SPR_enableVDPSpriteChecking(); 00615 void SPR_disableVDPSpriteChecking(); 00620 void SPR_defragVRAM(void); 00649 u16** SPR_loadAllFrames(const SpriteDefinition* sprDef, u16 index, u16* totalNumTile); 00650 00665 bool SPR_setDefinition(Sprite* sprite, const SpriteDefinition* spriteDef); 00670 s16 SPR_getPositionX(Sprite* sprite); 00675 s16 SPR_getPositionY(Sprite* sprite); 00687 void SPR_setPosition(Sprite* sprite, s16 x, s16 y); 00697 void SPR_setHFlip(Sprite* sprite, bool value); 00707 void SPR_setVFlip(Sprite* sprite, bool value); 00717 void SPR_setPalette(Sprite* sprite, u16 value); 00727 void SPR_setPriority(Sprite* sprite, bool value); 00732 #define SPR_setPriorityAttribut(sprite, value) _Pragma("GCC error \"This method is deprecated, use SPR_setPriority(..) instead.\"") 00733 00745 void SPR_setDepth(Sprite* sprite, s16 value); 00750 void SPR_setZ(Sprite* sprite, s16 value); 00760 void SPR_setAlwaysOnTop(Sprite* sprite); 00770 void SPR_setAlwaysAtBottom(Sprite* sprite); 00771 00783 void SPR_setAnimAndFrame(Sprite* sprite, s16 anim, s16 frame); 00793 void SPR_setAnim(Sprite* sprite, s16 anim); 00803 void SPR_setFrame(Sprite* sprite, s16 frame); 00811 void SPR_nextFrame(Sprite* sprite); 00812 00826 void SPR_setAnimationLoop(Sprite* sprite, bool value); 00836 bool SPR_getAnimationDone(Sprite* sprite); 00837 00852 bool SPR_setVRAMTileIndex(Sprite* sprite, s16 value); 00863 void SPR_setAutoTileUpload(Sprite* sprite, bool value); 00876 void SPR_setDelayedFrameUpdate(Sprite* sprite, bool value); 00892 void SPR_setFrameChangeCallback(Sprite* sprite, FrameChangeCallback* callback); 00893 00912 SpriteVisibility SPR_getVisibility(Sprite* sprite); 00930 bool SPR_isVisible(Sprite* sprite, bool recompute); 00931 00955 void SPR_setVisibility(Sprite* sprite, SpriteVisibility value); 00959 #define SPR_setAlwaysVisible(sprite, value) _Pragma("GCC error \"This method is deprecated, use SPR_setVisibility(..) instead.\"") 00960 00963 #define SPR_setNeverVisible(sprite, value) _Pragma("GCC error \"This method is deprecated, use SPR_setVisibility(..) instead.\"") 00964 00967 #define SPR_computeVisibility(sprite) _Pragma("GCC error \"This method is deprecated, use SPR_isVisible(sprite, TRUE) instead.\"") 00968 00976 void SPR_clear(void); 00986 void SPR_update(void); 00987 00992 void SPR_logProfil(void); 00997 void SPR_logSprites(void); 00998 00999 01000 #endif // _SPRITE_ENG_H_ 01001 01002 #endif