|
|
|
|
@@ -7,32 +7,32 @@ extern HeapNode heap_generalHead;
|
|
|
|
|
extern HeapNode heap_spriteHead;
|
|
|
|
|
|
|
|
|
|
BSS s32 D_802DF520; // unused?
|
|
|
|
|
BSS s32 spr_allocateBtlComponentsOnWorldHeap;
|
|
|
|
|
BSS bool SpriteUseGeneralHeap;
|
|
|
|
|
BSS s32 D_802DF528[2]; // unused?
|
|
|
|
|
BSS s32 MaxLoadedSpriteInstanceID;
|
|
|
|
|
BSS s32 D_802DF534[3]; // unused?
|
|
|
|
|
BSS s32 D_802DF540;
|
|
|
|
|
BSS s32 CurSpriteImgFX;
|
|
|
|
|
BSS s32 D_802DF544; // unused?
|
|
|
|
|
BSS SpriteAnimData* spr_playerSprites[13];
|
|
|
|
|
BSS s32 D_802DF57C;
|
|
|
|
|
BSS s32 spr_playerMaxComponents;
|
|
|
|
|
BSS SpriteAnimData* PlayerSprites[13];
|
|
|
|
|
BSS s32 CurPlayerSpriteIndex;
|
|
|
|
|
BSS s32 MaxPlayerSpriteComponents;
|
|
|
|
|
BSS s32 D_802DF584; // unused?
|
|
|
|
|
BSS PlayerCurrentAnimInfo spr_playerCurrentAnimInfo[3];
|
|
|
|
|
BSS PlayerCurrentAnimInfo CurPlayerAnimInfo[3];
|
|
|
|
|
BSS s32 D_802DF5AC; // unused?
|
|
|
|
|
BSS SpriteAnimData* NpcSpriteData[MAX_SPRITE_ID];
|
|
|
|
|
BSS u8 NpcSpriteInstanceCount[MAX_SPRITE_ID];
|
|
|
|
|
BSS s32 D_802DFA44; // unused?
|
|
|
|
|
BSS SpriteInstance SpriteInstances[51];
|
|
|
|
|
BSS Quad* D_802DFE44;
|
|
|
|
|
BSS s32 D_802DFE48[22];
|
|
|
|
|
BSS s32 D_802DFEA0[3];
|
|
|
|
|
BSS Quad* SpriteQuadCache;
|
|
|
|
|
BSS s32 SpriteQuadCacheInfo[22]; // upper bytes: width, height; lower 16 bits: time left
|
|
|
|
|
BSS s32 SpriteCurBaseRot[3];
|
|
|
|
|
BSS s32 SpriteUpdateNotifyValue;
|
|
|
|
|
|
|
|
|
|
SpriteComponent** spr_allocate_components(s32);
|
|
|
|
|
void spr_load_npc_extra_anims(SpriteAnimData*, u32*);
|
|
|
|
|
void spr_init_player_raster_cache(s32 cacheSize, s32 maxRasterSize);
|
|
|
|
|
|
|
|
|
|
Quad spr_defaultQuad = {
|
|
|
|
|
Quad SpriteQuadTemplate = {
|
|
|
|
|
{
|
|
|
|
|
{{{ -16, 56, 0 }, false, { 0, 0 }, { 240, 240, 240, 255 }}},
|
|
|
|
|
{{{ 16, 56, 0 }, false, { 1024, 0 }, { 120, 120, 120, 255 }}},
|
|
|
|
|
@@ -41,19 +41,19 @@ Quad spr_defaultQuad = {
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Vp SprPauseVp = {{
|
|
|
|
|
Vp SpritePauseVp = {{
|
|
|
|
|
{ 640, 480, 511, 0 },
|
|
|
|
|
{ 640, 480, 511, 0 },
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Vp SprPauseVpAlt = {{
|
|
|
|
|
Vp SpritePauseVpAlt = {{
|
|
|
|
|
{ 640, 480, 511, 0 },
|
|
|
|
|
{ 640, 480, 512, 0 },
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Gfx D_802DF3F0[] = {
|
|
|
|
|
Gfx OpaqueSpriteGfx[] = {
|
|
|
|
|
gsSPClearGeometryMode(G_CULL_BOTH | G_LIGHTING),
|
|
|
|
|
gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
|
|
|
|
|
gsSPTexture(-1, -1, 0, G_TX_RENDERTILE, G_ON),
|
|
|
|
|
@@ -63,7 +63,7 @@ Gfx D_802DF3F0[] = {
|
|
|
|
|
gsSPEndDisplayList(),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Gfx D_802DF428[] = {
|
|
|
|
|
Gfx TranslucentSpriteGfx[] = {
|
|
|
|
|
gsSPClearGeometryMode(G_CULL_BOTH | G_LIGHTING),
|
|
|
|
|
gsDPSetCombineMode(PM_CC_02, PM_CC_02),
|
|
|
|
|
gsSPTexture(-1, -1, 0, G_TX_RENDERTILE, G_ON),
|
|
|
|
|
@@ -73,7 +73,7 @@ Gfx D_802DF428[] = {
|
|
|
|
|
gsSPEndDisplayList(),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Gfx D_802DF460[] = {
|
|
|
|
|
Gfx OpaqueShadedSpriteGfx[] = {
|
|
|
|
|
gsSPClearGeometryMode(G_CULL_BOTH | G_LIGHTING),
|
|
|
|
|
gsSPTexture(-1, -1, 0, G_TX_RENDERTILE, G_ON),
|
|
|
|
|
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
|
|
|
|
|
@@ -82,7 +82,7 @@ Gfx D_802DF460[] = {
|
|
|
|
|
gsSPEndDisplayList(),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Gfx D_802DF490[] = {
|
|
|
|
|
Gfx TranslucentShadedSpriteGfx[] = {
|
|
|
|
|
gsSPClearGeometryMode(G_CULL_BOTH | G_LIGHTING),
|
|
|
|
|
gsSPTexture(-1, -1, 0, G_TX_RENDERTILE, G_ON),
|
|
|
|
|
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH),
|
|
|
|
|
@@ -91,7 +91,7 @@ Gfx D_802DF490[] = {
|
|
|
|
|
gsSPEndDisplayList(),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
f32 spr_animUpdateTimeScale = 1.0f;
|
|
|
|
|
f32 SpriteAnimUpdateTimescale = 1.0f;
|
|
|
|
|
|
|
|
|
|
#define MARIO_SPRITE_COMMON_BITS \
|
|
|
|
|
1 << SPR_Mario1 \
|
|
|
|
|
@@ -118,7 +118,7 @@ f32 spr_animUpdateTimeScale = 1.0f;
|
|
|
|
|
|
|
|
|
|
// TODO(player raster splat header generation):
|
|
|
|
|
// - macroify rasterSize based on the biggest raster
|
|
|
|
|
PlayerSpriteSet spr_playerSpriteSets[] = {
|
|
|
|
|
PlayerSpriteSet PlayerSpriteSets[] = {
|
|
|
|
|
[PLAYER_SPRITES_MARIO_WORLD] { 6, 0x700, MARIO_SPRITE_WORLD_BITS },
|
|
|
|
|
[PLAYER_SPRITES_MARIO_REFLECT_FLOOR] { 18, 0x700, MARIO_SPRITE_WORLD_BITS },
|
|
|
|
|
[PLAYER_SPRITES_COMBINED_EPILOGUE] { 10, 0x900, MARIO_SPRITE_WORLD_BITS | PEACH_SPRITE_BITS },
|
|
|
|
|
@@ -131,25 +131,25 @@ PlayerSpriteSet spr_playerSpriteSets[] = {
|
|
|
|
|
void spr_init_quad_cache(void) {
|
|
|
|
|
s32 i;
|
|
|
|
|
|
|
|
|
|
D_802DFE44 = _heap_malloc(&heap_spriteHead, ARRAY_COUNT(D_802DFE48) * sizeof(*D_802DFE44));
|
|
|
|
|
SpriteQuadCache = _heap_malloc(&heap_spriteHead, ARRAY_COUNT(SpriteQuadCacheInfo) * sizeof(*SpriteQuadCache));
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(D_802DFE48); i++) {
|
|
|
|
|
D_802DFE48[i] = -1;
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(SpriteQuadCacheInfo); i++) {
|
|
|
|
|
SpriteQuadCacheInfo[i] = -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Quad* spr_get_cached_quad(s32 quadIndex) {
|
|
|
|
|
s32* temp_v1 = &D_802DFE48[quadIndex];
|
|
|
|
|
s32* temp_v1 = &SpriteQuadCacheInfo[quadIndex];
|
|
|
|
|
|
|
|
|
|
*temp_v1 |= 0x1F;
|
|
|
|
|
return &D_802DFE44[quadIndex];
|
|
|
|
|
return &SpriteQuadCache[quadIndex];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void spr_make_quad_for_size(Quad* quad, s32 width, s32 height) {
|
|
|
|
|
Vtx* vtx = &quad->v[0];
|
|
|
|
|
s32 w = width; // required to match
|
|
|
|
|
|
|
|
|
|
*quad = spr_defaultQuad;
|
|
|
|
|
*quad = SpriteQuadTemplate;
|
|
|
|
|
|
|
|
|
|
vtx->v.ob[0] = -w / 2;
|
|
|
|
|
vtx->v.ob[1] = height;
|
|
|
|
|
@@ -182,26 +182,26 @@ Quad* spr_get_quad_for_size(s32* quadIndex, s32 width, s32 height) {
|
|
|
|
|
if ((width * height) / 2 <= 0x800) {
|
|
|
|
|
dimensions = (width << 0x18) + (height << 0x10);
|
|
|
|
|
qi = *quadIndex;
|
|
|
|
|
if (qi != -1 && (dimensions == (D_802DFE48[qi] & 0xFFFF0000))) {
|
|
|
|
|
if (qi != -1 && (dimensions == (SpriteQuadCacheInfo[qi] & 0xFFFF0000))) {
|
|
|
|
|
return spr_get_cached_quad(qi);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(D_802DFE48); i++) {
|
|
|
|
|
if (dimensions == (D_802DFE48[i] & 0xFFFF0000)) {
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(SpriteQuadCacheInfo); i++) {
|
|
|
|
|
if (dimensions == (SpriteQuadCacheInfo[i] & 0xFFFF0000)) {
|
|
|
|
|
*quadIndex = i;
|
|
|
|
|
return spr_get_cached_quad(i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(D_802DFE48); i++) {
|
|
|
|
|
if (D_802DFE48[i] == -1) {
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(SpriteQuadCacheInfo); i++) {
|
|
|
|
|
if (SpriteQuadCacheInfo[i] == -1) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (i != ARRAY_COUNT(D_802DFE48)) {
|
|
|
|
|
if (i != ARRAY_COUNT(SpriteQuadCacheInfo)) {
|
|
|
|
|
*quadIndex = i;
|
|
|
|
|
D_802DFE48[i] = dimensions;
|
|
|
|
|
SpriteQuadCacheInfo[i] = dimensions;
|
|
|
|
|
quad = spr_get_cached_quad(i);
|
|
|
|
|
spr_make_quad_for_size(quad, width, height);
|
|
|
|
|
return quad;
|
|
|
|
|
@@ -213,11 +213,11 @@ Quad* spr_get_quad_for_size(s32* quadIndex, s32 width, s32 height) {
|
|
|
|
|
void spr_clear_quad_cache(void) {
|
|
|
|
|
s32 i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(D_802DFE48); i++) {
|
|
|
|
|
if (D_802DFE48[i] != -1) {
|
|
|
|
|
D_802DFE48[i]--;
|
|
|
|
|
if (!(D_802DFE48[i] & 0xFFFF)) {
|
|
|
|
|
D_802DFE48[i] = -1;
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(SpriteQuadCacheInfo); i++) {
|
|
|
|
|
if (SpriteQuadCacheInfo[i] != -1) {
|
|
|
|
|
SpriteQuadCacheInfo[i]--;
|
|
|
|
|
if (!(SpriteQuadCacheInfo[i] & 0xFFFF)) {
|
|
|
|
|
SpriteQuadCacheInfo[i] = -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -242,7 +242,7 @@ void spr_appendGfx_component_flat(
|
|
|
|
|
if (gSpriteShadingProfile->flags & SPR_SHADING_FLAG_SET_VIEWPORT) {
|
|
|
|
|
Camera* camera = &gCameras[gCurrentCamID];
|
|
|
|
|
if (gGameStatusPtr->context == CONTEXT_PAUSE) {
|
|
|
|
|
gSPViewport(gMainGfxPos++, &SprPauseVpAlt);
|
|
|
|
|
gSPViewport(gMainGfxPos++, &SpritePauseVpAlt);
|
|
|
|
|
} else {
|
|
|
|
|
gSPViewport(gMainGfxPos++, &camera->vpAlt);
|
|
|
|
|
}
|
|
|
|
|
@@ -269,7 +269,7 @@ void spr_appendGfx_component_flat(
|
|
|
|
|
if (gSpriteShadingProfile->flags & SPR_SHADING_FLAG_SET_VIEWPORT) {
|
|
|
|
|
Camera* camera = &gCameras[gCurrentCamID];
|
|
|
|
|
if (gGameStatusPtr->context == CONTEXT_PAUSE) {
|
|
|
|
|
gSPViewport(gMainGfxPos++, &SprPauseVpAlt);
|
|
|
|
|
gSPViewport(gMainGfxPos++, &SpritePauseVpAlt);
|
|
|
|
|
} else {
|
|
|
|
|
gSPViewport(gMainGfxPos++, &camera->vpAlt);
|
|
|
|
|
}
|
|
|
|
|
@@ -305,9 +305,9 @@ void spr_appendGfx_component_flat(
|
|
|
|
|
Camera* camera = &gCameras[gCurrentCamID];
|
|
|
|
|
|
|
|
|
|
if (gGameStatusPtr->context == CONTEXT_PAUSE) {
|
|
|
|
|
gSPViewport(gMainGfxPos++, &SprPauseVp);
|
|
|
|
|
SprPauseVpAlt.vp.vtrans[0] = SprPauseVp.vp.vtrans[0] + gGameStatusPtr->altViewportOffset.x;
|
|
|
|
|
SprPauseVpAlt.vp.vtrans[1] = SprPauseVp.vp.vtrans[1] + gGameStatusPtr->altViewportOffset.y;
|
|
|
|
|
gSPViewport(gMainGfxPos++, &SpritePauseVp);
|
|
|
|
|
SpritePauseVpAlt.vp.vtrans[0] = SpritePauseVp.vp.vtrans[0] + gGameStatusPtr->altViewportOffset.x;
|
|
|
|
|
SpritePauseVpAlt.vp.vtrans[1] = SpritePauseVp.vp.vtrans[1] + gGameStatusPtr->altViewportOffset.y;
|
|
|
|
|
} else {
|
|
|
|
|
gSPViewport(gMainGfxPos++, &camera->vp);
|
|
|
|
|
}
|
|
|
|
|
@@ -360,16 +360,16 @@ void spr_appendGfx_component(
|
|
|
|
|
|
|
|
|
|
if (gSpriteShadingProfile->flags & SPR_SHADING_FLAG_ENABLED) {
|
|
|
|
|
if ((u8) opacity == 255) {
|
|
|
|
|
gSPDisplayList(gMainGfxPos++, D_802DF460);
|
|
|
|
|
gSPDisplayList(gMainGfxPos++, OpaqueShadedSpriteGfx);
|
|
|
|
|
} else {
|
|
|
|
|
gSPDisplayList(gMainGfxPos++, D_802DF490);
|
|
|
|
|
gSPDisplayList(gMainGfxPos++, TranslucentShadedSpriteGfx);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if ((u8) opacity == 255) {
|
|
|
|
|
gSPDisplayList(gMainGfxPos++, D_802DF3F0);
|
|
|
|
|
gSPDisplayList(gMainGfxPos++, OpaqueSpriteGfx);
|
|
|
|
|
} else {
|
|
|
|
|
gDPSetPrimColor(gMainGfxPos++, 0, 0, 0, 0, 0, (u8) opacity);
|
|
|
|
|
gSPDisplayList(gMainGfxPos++, D_802DF428);
|
|
|
|
|
gSPDisplayList(gMainGfxPos++, TranslucentSpriteGfx);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -377,7 +377,7 @@ void spr_appendGfx_component(
|
|
|
|
|
height = cache->height;
|
|
|
|
|
quadIndex = cache->quadCacheIndex;
|
|
|
|
|
quad = nullptr;
|
|
|
|
|
if (!(D_802DF540 & SPR_IMGFX_FLAG_ALL)) {
|
|
|
|
|
if (!(CurSpriteImgFX & SPR_IMGFX_FLAG_ALL)) {
|
|
|
|
|
quad = spr_get_quad_for_size(&quadIndex, width, height);
|
|
|
|
|
cache->quadCacheIndex = quadIndex;
|
|
|
|
|
}
|
|
|
|
|
@@ -392,8 +392,8 @@ void spr_appendGfx_component(
|
|
|
|
|
ifxImg.xOffset = -(width / 2);
|
|
|
|
|
ifxImg.yOffset = height;
|
|
|
|
|
ifxImg.alpha = opacity;
|
|
|
|
|
if (imgfx_appendGfx_component((u8) D_802DF540, &ifxImg, IMGFX_FLAG_80000, mtxTransform) == 1) {
|
|
|
|
|
D_802DF540 &= ~SPR_IMGFX_FLAG_ALL;
|
|
|
|
|
if (imgfx_appendGfx_component((u8) CurSpriteImgFX, &ifxImg, IMGFX_FLAG_80000, mtxTransform) == 1) {
|
|
|
|
|
CurSpriteImgFX &= ~SPR_IMGFX_FLAG_ALL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
|
|
|
|
|
@@ -440,9 +440,9 @@ void spr_draw_component(s32 drawOpts, SpriteComponent* component, SpriteAnimComp
|
|
|
|
|
f32 inX, inY, inZ;
|
|
|
|
|
|
|
|
|
|
if (component->initialized && component->curRaster != -1) {
|
|
|
|
|
rotX = D_802DFEA0[0];
|
|
|
|
|
rotY = D_802DFEA0[1];
|
|
|
|
|
rotZ = D_802DFEA0[2];
|
|
|
|
|
rotX = SpriteCurBaseRot[0];
|
|
|
|
|
rotY = SpriteCurBaseRot[1];
|
|
|
|
|
rotZ = SpriteCurBaseRot[2];
|
|
|
|
|
inX = component->compPos.x + anim->compOffset.x;
|
|
|
|
|
inY = component->compPos.y + anim->compOffset.y;
|
|
|
|
|
inZ = component->compPos.z + anim->compOffset.z;
|
|
|
|
|
@@ -451,9 +451,9 @@ void spr_draw_component(s32 drawOpts, SpriteComponent* component, SpriteAnimComp
|
|
|
|
|
cacheEntry = cache[component->curRaster];
|
|
|
|
|
paletteIdx = component->curPalette;
|
|
|
|
|
if (drawOpts & DRAW_SPRITE_USE_PLAYER_RASTERS) {
|
|
|
|
|
cacheEntry->image = spr_get_player_raster(component->curRaster & 0xFFF, D_802DF57C);
|
|
|
|
|
cacheEntry->image = spr_get_player_raster(component->curRaster & 0xFFF, CurPlayerSpriteIndex);
|
|
|
|
|
}
|
|
|
|
|
D_802DF540 = component->imgfxIdx;
|
|
|
|
|
CurSpriteImgFX = component->imgfxIdx;
|
|
|
|
|
pal = palettes[paletteIdx];
|
|
|
|
|
|
|
|
|
|
spr_appendGfx_component(
|
|
|
|
|
@@ -467,7 +467,7 @@ void spr_draw_component(s32 drawOpts, SpriteComponent* component, SpriteAnimComp
|
|
|
|
|
component->scale.z,
|
|
|
|
|
drawOpts, pal, mtx
|
|
|
|
|
);
|
|
|
|
|
component->imgfxIdx = D_802DF540;
|
|
|
|
|
component->imgfxIdx = CurSpriteImgFX;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -510,7 +510,7 @@ void spr_component_update_commands(SpriteComponent* comp, SpriteAnimComponent* a
|
|
|
|
|
bufPos = comp->readPos;
|
|
|
|
|
gotoPos = (u16*) -1;
|
|
|
|
|
|
|
|
|
|
comp->waitTime -= spr_animUpdateTimeScale;
|
|
|
|
|
comp->waitTime -= SpriteAnimUpdateTimescale;
|
|
|
|
|
|
|
|
|
|
while (comp->waitTime <= 0.0f) {
|
|
|
|
|
// overflow check
|
|
|
|
|
@@ -757,15 +757,15 @@ void spr_init_anim_state(SpriteComponent** compList, SpriteAnimComponent** animL
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void spr_set_anim_timescale(f32 timescale) {
|
|
|
|
|
spr_animUpdateTimeScale = timescale * 2.0f;
|
|
|
|
|
SpriteAnimUpdateTimescale = timescale * 2.0f;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void spr_load_player_sprite(s32 spriteIndex) {
|
|
|
|
|
SpriteAnimData* playerSprite = spr_load_sprite(spriteIndex - 1, true, false);
|
|
|
|
|
|
|
|
|
|
spr_playerSprites[spriteIndex - 1] = playerSprite;
|
|
|
|
|
if (spr_playerMaxComponents < playerSprite->maxComponents) {
|
|
|
|
|
spr_playerMaxComponents = playerSprite->maxComponents;
|
|
|
|
|
PlayerSprites[spriteIndex - 1] = playerSprite;
|
|
|
|
|
if (MaxPlayerSpriteComponents < playerSprite->maxComponents) {
|
|
|
|
|
MaxPlayerSpriteComponents = playerSprite->maxComponents;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -773,24 +773,24 @@ void spr_init_sprites(s32 playerSpriteSet) {
|
|
|
|
|
s32 loadedFlags;
|
|
|
|
|
s32 i;
|
|
|
|
|
|
|
|
|
|
spr_allocateBtlComponentsOnWorldHeap = false;
|
|
|
|
|
SpriteUseGeneralHeap = false;
|
|
|
|
|
_heap_create(&heap_spriteHead, SPRITE_HEAP_SIZE);
|
|
|
|
|
imgfx_init();
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(spr_playerSprites); i++) {
|
|
|
|
|
SpriteAnimData** playerSprites = spr_playerSprites;
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(PlayerSprites); i++) {
|
|
|
|
|
SpriteAnimData** playerSprites = PlayerSprites;
|
|
|
|
|
playerSprites[i] = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
spr_playerMaxComponents = 0;
|
|
|
|
|
MaxPlayerSpriteComponents = 0;
|
|
|
|
|
|
|
|
|
|
if (gGameStatusPtr->peachFlags & PEACH_FLAG_IS_PEACH) {
|
|
|
|
|
playerSpriteSet = PLAYER_SPRITES_PEACH_WORLD;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
loadedFlags = (&spr_playerSpriteSets[playerSpriteSet])->initiallyLoaded;
|
|
|
|
|
spr_init_player_raster_cache((&spr_playerSpriteSets[playerSpriteSet])->cacheSize,
|
|
|
|
|
(&spr_playerSpriteSets[playerSpriteSet])->rasterSize);
|
|
|
|
|
loadedFlags = (&PlayerSpriteSets[playerSpriteSet])->initiallyLoaded;
|
|
|
|
|
spr_init_player_raster_cache((&PlayerSpriteSets[playerSpriteSet])->cacheSize,
|
|
|
|
|
(&PlayerSpriteSets[playerSpriteSet])->rasterSize);
|
|
|
|
|
|
|
|
|
|
for (i = 1; i <= SPR_Peach3; i++) {
|
|
|
|
|
if ((loadedFlags >> i) & 1) {
|
|
|
|
|
@@ -798,9 +798,9 @@ void spr_init_sprites(s32 playerSpriteSet) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(spr_playerCurrentAnimInfo); i++) {
|
|
|
|
|
spr_playerCurrentAnimInfo[i].componentList = nullptr;
|
|
|
|
|
spr_playerCurrentAnimInfo[i].animID = -1;
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(CurPlayerAnimInfo); i++) {
|
|
|
|
|
CurPlayerAnimInfo[i].componentList = nullptr;
|
|
|
|
|
CurPlayerAnimInfo[i].animID = -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(NpcSpriteData); i++) {
|
|
|
|
|
@@ -824,7 +824,7 @@ void spr_render_init(void) {
|
|
|
|
|
spr_clear_quad_cache();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s32 func_802DDA84(void) {
|
|
|
|
|
s32 spr_unused_nop(void) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -834,14 +834,14 @@ s32 spr_update_player_sprite(s32 spriteInstanceID, s32 animID, f32 timeScale) {
|
|
|
|
|
SpriteComponent* component;
|
|
|
|
|
SpriteAnimComponent** animList;
|
|
|
|
|
SpriteRasterCacheEntry** rasterList;
|
|
|
|
|
s32 spriteId = ((animID >> 16) & 0xFF) - 1;
|
|
|
|
|
s32 spriteIdx = SPR_UNPACK_SPR(animID) - 1;
|
|
|
|
|
s32 instanceIdx = spriteInstanceID & 0xFF;
|
|
|
|
|
s32 animIndex = animID & 0xFF;
|
|
|
|
|
D_802DF57C = spriteId;
|
|
|
|
|
s32 animIndex = SPR_UNPACK_ANIM(animID);
|
|
|
|
|
CurPlayerSpriteIndex = spriteIdx;
|
|
|
|
|
|
|
|
|
|
if (spr_playerCurrentAnimInfo[instanceIdx].componentList == nullptr) {
|
|
|
|
|
compList = spr_allocate_components(spr_playerMaxComponents);
|
|
|
|
|
spr_playerCurrentAnimInfo[instanceIdx].componentList = compList;
|
|
|
|
|
if (CurPlayerAnimInfo[instanceIdx].componentList == nullptr) {
|
|
|
|
|
compList = spr_allocate_components(MaxPlayerSpriteComponents);
|
|
|
|
|
CurPlayerAnimInfo[instanceIdx].componentList = compList;
|
|
|
|
|
while (*compList != PTR_LIST_END) {
|
|
|
|
|
component = *compList;
|
|
|
|
|
component->imgfxIdx = imgfx_get_free_instances(1);
|
|
|
|
|
@@ -849,8 +849,8 @@ s32 spr_update_player_sprite(s32 spriteInstanceID, s32 animID, f32 timeScale) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
spriteData = (u32*)spr_playerSprites[spriteId];
|
|
|
|
|
compList = spr_playerCurrentAnimInfo[instanceIdx].componentList;
|
|
|
|
|
spriteData = (u32*)PlayerSprites[spriteIdx];
|
|
|
|
|
compList = CurPlayerAnimInfo[instanceIdx].componentList;
|
|
|
|
|
|
|
|
|
|
if (spriteData == nullptr) {
|
|
|
|
|
return 0;
|
|
|
|
|
@@ -862,24 +862,24 @@ s32 spr_update_player_sprite(s32 spriteInstanceID, s32 animID, f32 timeScale) {
|
|
|
|
|
|
|
|
|
|
spr_set_anim_timescale(timeScale);
|
|
|
|
|
if ((spriteInstanceID & DRAW_SPRITE_OVERRIDE_ALPHA) ||
|
|
|
|
|
(animID & ~SPRITE_ID_BACK_FACING) != (spr_playerCurrentAnimInfo[instanceIdx].animID & ~SPRITE_ID_BACK_FACING))
|
|
|
|
|
(animID & ~SPRITE_ID_BACK_FACING) != (CurPlayerAnimInfo[instanceIdx].animID & ~SPRITE_ID_BACK_FACING))
|
|
|
|
|
{
|
|
|
|
|
spr_init_anim_state(compList, animList);
|
|
|
|
|
spr_playerCurrentAnimInfo[instanceIdx].notifyValue = 0;
|
|
|
|
|
CurPlayerAnimInfo[instanceIdx].notifyValue = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
spr_playerCurrentAnimInfo[instanceIdx].animID = animID;
|
|
|
|
|
CurPlayerAnimInfo[instanceIdx].animID = animID;
|
|
|
|
|
|
|
|
|
|
if (!(spriteInstanceID & DRAW_SPRITE_OVERRIDE_YAW)) {
|
|
|
|
|
spr_playerCurrentAnimInfo[instanceIdx].notifyValue = spr_component_update(spr_playerCurrentAnimInfo[instanceIdx].notifyValue,
|
|
|
|
|
CurPlayerAnimInfo[instanceIdx].notifyValue = spr_component_update(CurPlayerAnimInfo[instanceIdx].notifyValue,
|
|
|
|
|
compList, animList, rasterList, 0);
|
|
|
|
|
}
|
|
|
|
|
return spr_playerCurrentAnimInfo[instanceIdx].notifyValue;
|
|
|
|
|
return CurPlayerAnimInfo[instanceIdx].notifyValue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s32 spr_draw_player_sprite(s32 spriteInstanceID, s32 yaw, s32 alphaIn, PAL_PTR* paletteList, Matrix4f mtx) {
|
|
|
|
|
s32 instanceIdx = spriteInstanceID & 0xFF;
|
|
|
|
|
s32 animID = spr_playerCurrentAnimInfo[instanceIdx].animID;
|
|
|
|
|
s32 animID = CurPlayerAnimInfo[instanceIdx].animID;
|
|
|
|
|
SpriteRasterCacheEntry** rasters;
|
|
|
|
|
PAL_PTR* palettes;
|
|
|
|
|
SpriteAnimComponent** animComponents;
|
|
|
|
|
@@ -887,15 +887,15 @@ s32 spr_draw_player_sprite(s32 spriteInstanceID, s32 yaw, s32 alphaIn, PAL_PTR*
|
|
|
|
|
f32 zscale;
|
|
|
|
|
u32 alpha;
|
|
|
|
|
u32* spriteData;
|
|
|
|
|
s32 spriteId;
|
|
|
|
|
s32 spriteIdx;
|
|
|
|
|
s32 spriteIdBackFacing;
|
|
|
|
|
|
|
|
|
|
if (animID == ANIM_LIST_END) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
D_802DF57C = spriteId = ((animID >> 0x10) & 0xFF) - 1;
|
|
|
|
|
spriteData = (u32*)spr_playerSprites[spriteId];
|
|
|
|
|
CurPlayerSpriteIndex = spriteIdx = SPR_UNPACK_SPR(animID) - 1;
|
|
|
|
|
spriteData = (u32*)PlayerSprites[spriteIdx];
|
|
|
|
|
if (spriteData == nullptr) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
@@ -905,17 +905,17 @@ s32 spr_draw_player_sprite(s32 spriteInstanceID, s32 yaw, s32 alphaIn, PAL_PTR*
|
|
|
|
|
palettes = (PAL_PTR*)*spriteData++;
|
|
|
|
|
spriteData++;
|
|
|
|
|
spriteData++;
|
|
|
|
|
animComponents = (SpriteAnimComponent**)spriteData[animID & 0xFF];
|
|
|
|
|
animComponents = (SpriteAnimComponent**)spriteData[SPR_UNPACK_ANIM(animID)];
|
|
|
|
|
|
|
|
|
|
if (animID & SPRITE_ID_BACK_FACING) {
|
|
|
|
|
switch (spriteId) {
|
|
|
|
|
case 0:
|
|
|
|
|
case 5:
|
|
|
|
|
case 9:
|
|
|
|
|
spriteIdBackFacing = spriteId + 1;
|
|
|
|
|
switch (spriteIdx) {
|
|
|
|
|
case SPR_Mario1 - 1:
|
|
|
|
|
case SPR_MarioW1 - 1:
|
|
|
|
|
case SPR_Peach1 - 1:
|
|
|
|
|
spriteIdBackFacing = spriteIdx + 1;
|
|
|
|
|
// TODO find better match
|
|
|
|
|
rasters = (SpriteRasterCacheEntry**)spr_playerSprites[spriteIdBackFacing];
|
|
|
|
|
D_802DF57C = spriteIdBackFacing;
|
|
|
|
|
rasters = (SpriteRasterCacheEntry**)PlayerSprites[spriteIdBackFacing];
|
|
|
|
|
CurPlayerSpriteIndex = spriteIdBackFacing;
|
|
|
|
|
rasters = (SpriteRasterCacheEntry**)*rasters;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
@@ -941,9 +941,9 @@ s32 spr_draw_player_sprite(s32 spriteInstanceID, s32 yaw, s32 alphaIn, PAL_PTR*
|
|
|
|
|
zscale = 0.0f - zscale;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
D_802DFEA0[0] = 0;
|
|
|
|
|
D_802DFEA0[1] = yaw;
|
|
|
|
|
D_802DFEA0[2] = 0;
|
|
|
|
|
SpriteCurBaseRot[0] = 0;
|
|
|
|
|
SpriteCurBaseRot[1] = yaw;
|
|
|
|
|
SpriteCurBaseRot[2] = 0;
|
|
|
|
|
|
|
|
|
|
if (spriteInstanceID & DRAW_SPRITE_OVERRIDE_ALPHA) {
|
|
|
|
|
alpha = alphaIn & 0xFF;
|
|
|
|
|
@@ -954,7 +954,7 @@ s32 spr_draw_player_sprite(s32 spriteInstanceID, s32 yaw, s32 alphaIn, PAL_PTR*
|
|
|
|
|
alpha = 255;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
components = spr_playerCurrentAnimInfo[instanceIdx].componentList;
|
|
|
|
|
components = CurPlayerAnimInfo[instanceIdx].componentList;
|
|
|
|
|
if (spriteInstanceID & DRAW_SPRITE_OVERRIDE_PALETTES) {
|
|
|
|
|
palettes = paletteList;
|
|
|
|
|
}
|
|
|
|
|
@@ -970,7 +970,7 @@ s32 spr_draw_player_sprite(s32 spriteInstanceID, s32 yaw, s32 alphaIn, PAL_PTR*
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s32 func_802DDEC4(s32 spriteIdx) {
|
|
|
|
|
return spr_playerCurrentAnimInfo[spriteIdx].notifyValue;
|
|
|
|
|
return CurPlayerAnimInfo[spriteIdx].notifyValue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void set_player_imgfx_comp(s32 spriteIdx, s32 compIdx, ImgFXType imgfx, s32 imgfxArg1, s32 imgfxArg2, s32 imgfxArg3, s32 imgfxArg4, s32 flags) {
|
|
|
|
|
@@ -978,8 +978,8 @@ void set_player_imgfx_comp(s32 spriteIdx, s32 compIdx, ImgFXType imgfx, s32 imgf
|
|
|
|
|
SpriteComponent** componentListIt;
|
|
|
|
|
s32 i;
|
|
|
|
|
|
|
|
|
|
if (spr_playerCurrentAnimInfo[spriteIdx].componentList != nullptr) {
|
|
|
|
|
componentListIt = spr_playerCurrentAnimInfo[spriteIdx].componentList;
|
|
|
|
|
if (CurPlayerAnimInfo[spriteIdx].componentList != nullptr) {
|
|
|
|
|
componentListIt = CurPlayerAnimInfo[spriteIdx].componentList;
|
|
|
|
|
i = 0;
|
|
|
|
|
|
|
|
|
|
while (*componentListIt != PTR_LIST_END) {
|
|
|
|
|
@@ -1009,7 +1009,7 @@ void spr_get_player_raster_info(SpriteRasterInfo* out, s32 playerSpriteID, s32 r
|
|
|
|
|
u16** paletteOffsetCopy;
|
|
|
|
|
|
|
|
|
|
playerSpriteID--;
|
|
|
|
|
sprite = spr_playerSprites[playerSpriteID];
|
|
|
|
|
sprite = PlayerSprites[playerSpriteID];
|
|
|
|
|
if (sprite != nullptr) {
|
|
|
|
|
paletteOffsetCopy = sprite->palettesOffset;
|
|
|
|
|
cache = sprite->rastersOffset[rasterIndex];
|
|
|
|
|
@@ -1021,7 +1021,7 @@ void spr_get_player_raster_info(SpriteRasterInfo* out, s32 playerSpriteID, s32 r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PAL_PTR* spr_get_player_palettes(s32 spriteIndex) {
|
|
|
|
|
SpriteAnimData* sprites = spr_playerSprites[spriteIndex - 1];
|
|
|
|
|
SpriteAnimData* sprites = PlayerSprites[spriteIndex - 1];
|
|
|
|
|
|
|
|
|
|
if (sprites == nullptr) {
|
|
|
|
|
return nullptr;
|
|
|
|
|
@@ -1084,7 +1084,7 @@ s32 spr_update_sprite(s32 spriteInstanceID, s32 animID, f32 timeScale) {
|
|
|
|
|
|
|
|
|
|
s32 palID;
|
|
|
|
|
s32 i = spriteInstanceID & 0xFF;
|
|
|
|
|
s32 animIndex = animID & 0xFF;
|
|
|
|
|
s32 animIndex = SPR_UNPACK_ANIM(animID);
|
|
|
|
|
|
|
|
|
|
compList = SpriteInstances[i].componentList;
|
|
|
|
|
spriteData = (u32*)SpriteInstances[i].spriteData;
|
|
|
|
|
@@ -1093,7 +1093,7 @@ s32 spr_update_sprite(s32 spriteInstanceID, s32 animID, f32 timeScale) {
|
|
|
|
|
spriteData += 4 + animIndex;
|
|
|
|
|
animList = (SpriteAnimComponent**)*spriteData;
|
|
|
|
|
|
|
|
|
|
palID = (animID >> 8) & 0xFF;
|
|
|
|
|
palID = SPR_UNPACK_PAL(animID);
|
|
|
|
|
spr_set_anim_timescale(timeScale);
|
|
|
|
|
if ((spriteInstanceID & DRAW_SPRITE_OVERRIDE_ALPHA) || ((SpriteInstances[i].curAnimID & 0xFF) != animIndex)) {
|
|
|
|
|
spr_init_anim_state(compList, animList);
|
|
|
|
|
@@ -1107,7 +1107,7 @@ s32 spr_update_sprite(s32 spriteInstanceID, s32 animID, f32 timeScale) {
|
|
|
|
|
return SpriteInstances[i].notifyValue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s32 spr_draw_npc_sprite(s32 spriteInstanceID, s32 yaw, s32 arg2, PAL_PTR* paletteList, Matrix4f mtx) {
|
|
|
|
|
s32 spr_draw_npc_sprite(s32 spriteInstanceID, s32 yaw, s32 alphaIn, PAL_PTR* paletteList, Matrix4f mtx) {
|
|
|
|
|
s32 i = spriteInstanceID & 0xFF;
|
|
|
|
|
s32 animID = SpriteInstances[i].curAnimID;
|
|
|
|
|
SpriteRasterCacheEntry** rasters;
|
|
|
|
|
@@ -1129,11 +1129,11 @@ s32 spr_draw_npc_sprite(s32 spriteInstanceID, s32 yaw, s32 arg2, PAL_PTR* palett
|
|
|
|
|
palettes = (PAL_PTR*)*spriteData++;
|
|
|
|
|
spriteData++;
|
|
|
|
|
spriteData++;
|
|
|
|
|
animComponents = (SpriteAnimComponent**)spriteData[animID & 0xFF];
|
|
|
|
|
animComponents = (SpriteAnimComponent**)spriteData[SPR_UNPACK_ANIM(animID)];
|
|
|
|
|
|
|
|
|
|
D_802DFEA0[0] = 0;
|
|
|
|
|
D_802DFEA0[1] = yaw;
|
|
|
|
|
D_802DFEA0[2] = 0;
|
|
|
|
|
SpriteCurBaseRot[0] = 0;
|
|
|
|
|
SpriteCurBaseRot[1] = yaw;
|
|
|
|
|
SpriteCurBaseRot[2] = 0;
|
|
|
|
|
|
|
|
|
|
if (!(spriteInstanceID & DRAW_SPRITE_OVERRIDE_YAW)) {
|
|
|
|
|
yaw += gCameras[gCurrentCamID].curYaw;
|
|
|
|
|
@@ -1152,8 +1152,8 @@ s32 spr_draw_npc_sprite(s32 spriteInstanceID, s32 yaw, s32 arg2, PAL_PTR* palett
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (spriteInstanceID & DRAW_SPRITE_OVERRIDE_ALPHA) {
|
|
|
|
|
alpha = arg2 & 0xFF;
|
|
|
|
|
if (arg2 == 0) {
|
|
|
|
|
alpha = alphaIn & 0xFF;
|
|
|
|
|
if (alphaIn == 0) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
@@ -1175,8 +1175,8 @@ s32 spr_draw_npc_sprite(s32 spriteInstanceID, s32 yaw, s32 arg2, PAL_PTR* palett
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s32 spr_get_notify_value(s32 spriteIndex) {
|
|
|
|
|
return SpriteInstances[spriteIndex].notifyValue;
|
|
|
|
|
s32 spr_get_notify_value(s32 spriteInstanceID) {
|
|
|
|
|
return SpriteInstances[spriteInstanceID].notifyValue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s32 spr_free_sprite(s32 spriteInstanceID) {
|
|
|
|
|
@@ -1206,7 +1206,7 @@ s32 spr_free_sprite(s32 spriteInstanceID) {
|
|
|
|
|
_heap_free(&heap_spriteHead, spriteData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (spr_allocateBtlComponentsOnWorldHeap) {
|
|
|
|
|
if (SpriteUseGeneralHeap) {
|
|
|
|
|
_heap_free(&heap_generalHead, compList);
|
|
|
|
|
} else {
|
|
|
|
|
_heap_free(&heap_spriteHead, compList);
|
|
|
|
|
|