mirror of
https://github.com/pmret/papermario.git
synced 2024-11-18 08:52:40 +01:00
308af519a5
* first few * more * more sounds * for now * visually separate remaining sounds * checkpoint * star power refactor * standard name * fix --------- Co-authored-by: HailSanta <Hail2Santa@gmail.com>
183 lines
5.3 KiB
C
183 lines
5.3 KiB
C
#ifndef _SPRITE_H_
|
|
#define _SPRITE_H_
|
|
|
|
#include "common.h"
|
|
|
|
#define SPR_PLAYER_COLOR_VARIATIONS 6
|
|
#define SPR_PEACH_BTL_PAL_STRIDE 4
|
|
|
|
enum SpriteIDFields {
|
|
SPRITE_ID_ANIM_MASK = 0x000000FF,
|
|
SPRITE_ID_PAL_MASK = 0x0000FF00,
|
|
SPRITE_ID_SPR_MASK = 0x00FF0000,
|
|
SPRITE_ID_BACK_FACING = 0x01000000,
|
|
SPRITE_ID_TAIL_ALLOCATE = 0x80000000,
|
|
};
|
|
|
|
enum DrawSpriteOptions {
|
|
DRAW_SPRITE_USE_PLAYER_RASTERS = 0x08000000,
|
|
DRAW_SPRITE_UPSIDE_DOWN = 0x10000000,
|
|
DRAW_SPRITE_OVERRIDE_PALETTES = 0x20000000,
|
|
DRAW_SPRITE_OVERRIDE_YAW = 0x40000000,
|
|
DRAW_SPRITE_OVERRIDE_ALPHA = 0x80000000,
|
|
};
|
|
|
|
enum {
|
|
PLAYER_SPRITE_MAIN = 0,
|
|
PLAYER_SPRITE_AUX1 = 1,
|
|
PLAYER_SPRITE_AUX2 = 2,
|
|
};
|
|
|
|
//TODO this is just a boolean isNpcSprite, using a temp enum for documenting
|
|
enum {
|
|
SPRITE_MODE_PLAYER = 0,
|
|
SPRITE_MODE_NPC = 1,
|
|
};
|
|
|
|
typedef struct SpriteComponent {
|
|
/* 0x00 */ s32 initialized;
|
|
/* 0x04 */ s32 properties; ///< AABBCCCC : AA = unused?, BB = parent, CCCC = notify value
|
|
/* 0x08 */ s16* readPos;
|
|
/* 0x0C */ f32 waitTime;
|
|
/* 0x10 */ s32 loopCounter;
|
|
/* 0x14 */ s32 curRaster;
|
|
/* 0x18 */ s32 curPalette;
|
|
/* 0x1C */ Vec3f posOffset;
|
|
/* 0x28 */ Vec3f compPos;
|
|
/* 0x34 */ Vec3i rot;
|
|
/* 0x40 */ Vec3f scale;
|
|
/* 0x4C */ s32 imgfxIdx;
|
|
} SpriteComponent; // size = 0x50
|
|
|
|
typedef struct PlayerCurrentAnimInfo {
|
|
/* 0x00 */ SpriteComponent** componentList;
|
|
/* 0x04 */ s32 animID;
|
|
/* 0x08 */ s32 notifyValue;
|
|
} PlayerCurrentAnimInfo; // size = 0xC
|
|
|
|
typedef struct SpriteAnimComponent {
|
|
/* 0x00 */ u16* cmdList;
|
|
/* 0x04 */ s16 cmdListSize;
|
|
/* 0x06 */ Vec3s compOffset;
|
|
} SpriteAnimComponent; // size = 0xC
|
|
|
|
// TODO: consider moving to 101b90_len_8f0 (sprite_cache)
|
|
typedef struct SpriteRasterCacheEntry {
|
|
/* 0x00 */ IMG_PTR image;
|
|
/* 0x04 */ u8 width;
|
|
/* 0x05 */ u8 height;
|
|
/* 0x06 */ s8 palette;
|
|
/* 0x07 */ s8 quadCacheIndex;
|
|
} SpriteRasterCacheEntry; // size = 0x8
|
|
|
|
/// Sprite data header.
|
|
typedef struct SpriteAnimData {
|
|
/* 0x00 */ SpriteRasterCacheEntry** rastersOffset;
|
|
/* 0x04 */ PAL_PTR* palettesOffset;
|
|
/* 0x08 */ s32 maxComponents;
|
|
/* 0x0C */ s32 colorVariations;
|
|
/* 0x10 */ SpriteAnimComponent** animListStart[VLA];
|
|
} SpriteAnimData; // size = 0x14
|
|
|
|
typedef struct SpriteInstance {
|
|
/* 0x00 */ s32 spriteIndex;
|
|
/* 0x04 */ SpriteComponent** componentList;
|
|
/* 0x08 */ SpriteAnimData* spriteData;
|
|
/* 0x0C */ s32 curAnimID;
|
|
/* 0x10 */ s32 notifyValue;
|
|
} SpriteInstance; // size = 0x14
|
|
|
|
typedef struct PlayerRastersHeader {
|
|
/* 0x00 */ s32 indexRanges;
|
|
/* 0x04 */ s32 loadDescriptors;
|
|
/* 0x08 */ s32 imageData;
|
|
} PlayerRastersHeader; // size = 0xC
|
|
|
|
typedef struct PlayerSpriteSet {
|
|
/// Number of cache entries.
|
|
/* 0x00 */ s32 cacheSize;
|
|
|
|
/// Maximum raster size.
|
|
/* 0x04 */ s32 rasterSize;
|
|
|
|
/// Flags saying which rasters to load into the cache in spr_init_sprites(), with each bit corresponding to the Nth
|
|
/// raster (with LSB = raster 0).
|
|
/* 0x08 */ s32 initiallyLoaded;
|
|
} PlayerSpriteSet; // size = 0xC
|
|
|
|
typedef struct PlayerSpriteCacheEntry {
|
|
/* 0x00 */ s32 lazyDeleteTime;
|
|
/* 0x04 */ s32 rasterIndex;
|
|
/* 0x08 */ s32 spriteIndex;
|
|
/* 0x0C */ IMG_PTR raster;
|
|
} PlayerSpriteCacheEntry; // size = 0x10
|
|
|
|
typedef struct Quad {
|
|
Vtx v[4];
|
|
} Quad; // size = 0x40
|
|
|
|
extern Quad spr_defaultQuad;
|
|
extern Vp SprPauseVp;
|
|
extern Vp SprPauseVpAlt;
|
|
extern Gfx D_802DF3F0[];
|
|
extern Gfx D_802DF428[];
|
|
extern Gfx D_802DF460[];
|
|
extern Gfx D_802DF490[];
|
|
extern f32 spr_animUpdateTimeScale;
|
|
extern PlayerSpriteSet spr_playerSpriteSets[7];
|
|
|
|
void imgfx_init(void);
|
|
|
|
void spr_init_sprites(s32 playerSpriteSet);
|
|
|
|
void spr_render_init(void);
|
|
|
|
void spr_update_player_raster_cache(void);
|
|
|
|
s32 spr_update_player_sprite(s32 arg0, s32 arg1, f32 timescale);
|
|
|
|
s32 spr_draw_player_sprite(s32 spriteInstanceID, s32 yaw, s32 arg2, PAL_PTR* paletteList, Matrix4f mtx);
|
|
|
|
s32 func_802DDEC4(s32 arg0);
|
|
|
|
void set_player_imgfx_comp(s32, s32, ImgFXType, s32, s32, s32, s32, s32);
|
|
|
|
void set_player_imgfx_all(s32, ImgFXType, s32, s32, s32, s32, s32);
|
|
|
|
IMG_PTR spr_get_player_raster(s32 rasterIndex, s32 playerSpriteID);
|
|
|
|
void spr_get_player_raster_info(SpriteRasterInfo* out, s32 playerSpriteID, s32 rasterIndex);
|
|
|
|
PAL_PTR* spr_get_player_palettes(s32 spriteIndex);
|
|
|
|
/// @param animID - Set MSB for tail allocation (i.e. `0x80XXYYZZ`)
|
|
s32 spr_load_npc_sprite(s32 animID, u32* extraAnimList);
|
|
|
|
s32 spr_update_sprite(s32 spriteInstanceID, s32 animID, f32 timeScale);
|
|
|
|
s32 spr_draw_npc_sprite(s32 spriteInstanceID, s32 yaw, s32 arg2, PAL_PTR* paletteList, Matrix4f mtx);
|
|
|
|
s32 spr_get_notify_value(s32 arg0);
|
|
|
|
s32 spr_free_sprite(s32 spriteInstanceID);
|
|
|
|
s32 get_npc_comp_imgfx_idx(s32, s32);
|
|
|
|
void set_npc_imgfx_comp(s32, s32, ImgFXType, s32, s32, s32, s32, s32);
|
|
|
|
void set_npc_imgfx_all(s32 arg0, ImgFXType arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6);
|
|
|
|
s32 spr_get_comp_position(s32 spriteIdx, s32 compListIdx, s32* outX, s32* outY, s32* outZ);
|
|
|
|
s32 spr_get_npc_raster_info(SpriteRasterInfo* out, s32 npcSpriteID, s32 rasterIndex);
|
|
|
|
PAL_PTR* spr_get_npc_palettes(s32 npcSpriteID);
|
|
|
|
s32 spr_get_npc_color_variations(s32 npcSpriteID);
|
|
|
|
void create_shading_palette(Matrix4f mtx, s32 uls, s32 ult, s32 lrs, s32 lrt, s32 alpha, s32);
|
|
|
|
SpriteAnimData* spr_load_sprite(s32 idx, s32 arg1, s32 arg2);
|
|
|
|
#endif
|