mirror of
https://github.com/HarbourMasters/SpaghettiKart
synced 2026-06-28 19:31:07 -04:00
fix again spining will but avoid invalid texture at all (#605)
This commit is contained in:
+9
-40
@@ -603,18 +603,20 @@ u8* gKartPalettes[] = {
|
||||
void load_kart_texture(Player* player, s8 playerId, s8 screenId, s8 screenId2, s8 index) {
|
||||
s32 temp = player->effects;
|
||||
s16 tyreSpeed = player->tyreSpeed;
|
||||
s32 wheelid = tyreSpeed >> 8;
|
||||
|
||||
if (((temp & 0x80) == 0x80) || ((temp & 0x40) == 0x40) || ((temp & 0x80000) == 0x80000) ||
|
||||
((temp & 0x800000) == 0x800000) || ((temp & 0x20000) == 0x20000) || ((player->kartProps & UNUSED_0x800) != 0)) {
|
||||
if (player->animFrameSelector[screenId] != 0) {
|
||||
osInvalDCache(&gEncodedKartTexture[index][screenId2][playerId], D_800DDEB0[player->characterId]);
|
||||
gEncodedKartTexture[index][screenId2][playerId].unk_00 =
|
||||
gKartTextureTable1[player->characterId][player->animGroupSelector[screenId]]
|
||||
[player->animFrameSelector[screenId]][tyreSpeed >> 8];
|
||||
[player->animFrameSelector[screenId]][wheelid];
|
||||
} else {
|
||||
osInvalDCache(&gEncodedKartTexture[index][screenId2][playerId], D_800DDEB0[player->characterId]);
|
||||
gEncodedKartTexture[index][screenId2][playerId].unk_00 =
|
||||
gKartTextureTable0[player->characterId][player->animGroupSelector[screenId]]
|
||||
[player->animFrameSelector[screenId]][0];
|
||||
[player->animFrameSelector[screenId]][wheelid];
|
||||
}
|
||||
} else if (((temp & 0x400) == 0x400) || ((temp & 0x01000000) == 0x01000000) ||
|
||||
((temp & 0x02000000) == 0x02000000) || ((temp & 0x10000) == 0x10000)) {
|
||||
@@ -626,70 +628,37 @@ void load_kart_texture(Player* player, s8 playerId, s8 screenId, s8 screenId2, s
|
||||
osInvalDCache(&gEncodedKartTexture[index][screenId2][playerId], D_800DDEB0[player->characterId]);
|
||||
gEncodedKartTexture[index][screenId2][playerId].unk_00 =
|
||||
gKartTextureTable0[player->characterId][player->animGroupSelector[screenId]]
|
||||
[player->animFrameSelector[screenId]][tyreSpeed >> 8];
|
||||
[player->animFrameSelector[screenId]][wheelid];
|
||||
}
|
||||
}
|
||||
|
||||
void load_kart_texture_non_blocking(Player* player, s8 arg1, s8 arg2, s8 arg3, s8 arg4) {
|
||||
s32 temp = player->effects;
|
||||
s16 tyreSpeed = player->tyreSpeed;
|
||||
s32 wheelid = tyreSpeed >> 8;
|
||||
|
||||
if (((temp & 0x80) == 0x80) || ((temp & 0x40) == 0x40) || ((temp & 0x80000) == 0x80000) ||
|
||||
((temp & 0x800000) == 0x800000) || ((temp & 0x20000) == 0x20000) || ((player->kartProps & UNUSED_0x800) != 0)) {
|
||||
if (player->animFrameSelector[arg2] != 0) {
|
||||
osInvalDCache(&gEncodedKartTexture[arg4][arg3][arg1], D_800DDEB0[player->characterId]);
|
||||
|
||||
#ifdef TARGET_N64
|
||||
osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ,
|
||||
(uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
|
||||
gKartTextureTable1[player->characterId][player->animGroupSelector[arg2]]
|
||||
[player->animFrameSelector[arg2]])],
|
||||
&gEncodedKartTexture[arg4][arg3][arg1], D_800DDEB0[player->characterId], &gDmaMesgQueue);
|
||||
#else
|
||||
gEncodedKartTexture[arg4][arg3][arg1].unk_00 =
|
||||
gKartTextureTable1[player->characterId][player->animGroupSelector[arg2]]
|
||||
[player->animFrameSelector[arg2]][tyreSpeed >> 8];
|
||||
#endif
|
||||
[player->animFrameSelector[arg2]][wheelid];
|
||||
} else {
|
||||
osInvalDCache(&gEncodedKartTexture[arg4][arg3][arg1], D_800DDEB0[player->characterId]);
|
||||
|
||||
#ifdef TARGET_N64
|
||||
osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ,
|
||||
(uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
|
||||
gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]]
|
||||
[player->animFrameSelector[arg2]])],
|
||||
&gEncodedKartTexture[arg4][arg3][arg1], D_800DDEB0[player->characterId], &gDmaMesgQueue);
|
||||
#else
|
||||
gEncodedKartTexture[arg4][arg3][arg1].unk_00 =
|
||||
gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]]
|
||||
[player->animFrameSelector[arg2]][tyreSpeed >> 8];
|
||||
#endif
|
||||
[player->animFrameSelector[arg2]][wheelid];
|
||||
}
|
||||
} else if (((temp & 0x400) == 0x400) || ((temp & 0x01000000) == 0x01000000) ||
|
||||
((temp & 0x02000000) == 0x02000000) || ((temp & 0x10000) == 0x10000)) {
|
||||
osInvalDCache(&gEncodedKartTexture[arg4][arg3][arg1], 0x780);
|
||||
// player->unk_0A8 >> 8 converts an 8.8 fixed-point animation frame to a whole number.
|
||||
#ifdef TARGET_N64
|
||||
osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ,
|
||||
(uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
|
||||
gKartTextureTumbles[player->characterId][player->unk_0A8 >> 8])],
|
||||
&gEncodedKartTexture[arg4][arg3][arg1], 0x900, &gDmaMesgQueue);
|
||||
#else
|
||||
gEncodedKartTexture[arg4][arg3][arg1].unk_00 = gKartTextureTumbles[player->characterId][player->unk_0A8 >> 8];
|
||||
#endif
|
||||
} else {
|
||||
osInvalDCache(&gEncodedKartTexture[arg4][arg3][arg1], D_800DDEB0[player->characterId]);
|
||||
|
||||
#ifdef TARGET_N64
|
||||
osPiStartDma(&gDmaIoMesg, OS_MESG_PRI_NORMAL, OS_READ,
|
||||
(uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
|
||||
gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]]
|
||||
[player->animFrameSelector[arg2]])],
|
||||
&gEncodedKartTexture[arg4][arg3][arg1], D_800DDEB0[player->characterId], &gDmaMesgQueue);
|
||||
#else
|
||||
gEncodedKartTexture[arg4][arg3][arg1].unk_00 =
|
||||
gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]][tyreSpeed >> 8];
|
||||
#endif
|
||||
gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]][wheelid];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-15
@@ -1342,19 +1342,11 @@ void render_kart(Player* player, s8 playerId, s8 screenId, s8 flipOffset) {
|
||||
sp154[2] = player->pos[2] + sp140;
|
||||
}
|
||||
}
|
||||
#ifdef AVOID_UB
|
||||
load_kart_palette(player, playerId, screenId, D_801651D0[screenId][playerId]);
|
||||
gPlayerPalette = &gPlayerPalettesList[D_801651D0[screenId][playerId]][screenId][playerId];
|
||||
#else
|
||||
gPlayerPalette =
|
||||
(struct_D_802F1F80*) &gPlayerPalettesList[D_801651D0[screenId][playerId]][screenId][playerId * 0x100];
|
||||
#endif
|
||||
load_kart_texture(player, playerId, screenId, screenId, D_801651D0[screenId][playerId]);
|
||||
if ((screenId == 0) || (screenId == 1)) {
|
||||
sKartTexture = gEncodedKartTexture[D_801651D0[screenId][playerId]][screenId][playerId].unk_00;
|
||||
// Texture not loaded yet - load it synchronously into the current buffer slot
|
||||
if (sKartTexture == NULL) {
|
||||
load_kart_texture(player, playerId, screenId, screenId, D_801651D0[screenId][playerId]);
|
||||
sKartTexture = gEncodedKartTexture[D_801651D0[screenId][playerId]][screenId][playerId].unk_00;
|
||||
}
|
||||
} else {
|
||||
sKartTexture = gEncodedKartTexture[D_801651D0[screenId][playerId]][screenId - 1][playerId - 4].unk_00;
|
||||
}
|
||||
@@ -1622,11 +1614,6 @@ void render_player(Player* player, s8 playerId, s8 screenId) {
|
||||
if (player->boostPower >= 2.0f) {
|
||||
func_80025DE8(player, playerId, screenId, var_v1);
|
||||
}
|
||||
// Allows wheels to spin
|
||||
if (GameEngine_ResourceGetTexTypeByName(sKartTexture) !=
|
||||
1) { // only invalidate texture cache if it's a palette texture
|
||||
gSPInvalidateTexCache(gDisplayListHead++, sKartTexture);
|
||||
}
|
||||
}
|
||||
|
||||
void func_80026A48(Player* player, s8 arg1) {
|
||||
|
||||
Reference in New Issue
Block a user