fix again spining will but avoid invalid texture at all (#605)

This commit is contained in:
coco875
2025-12-20 01:16:29 +01:00
committed by GitHub
parent a925d0fa2f
commit 5d54756d2d
2 changed files with 11 additions and 55 deletions
+9 -40
View File
@@ -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
View File
@@ -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) {