From 5d54756d2d552cab64dcb2d6e4916236b8ae8f22 Mon Sep 17 00:00:00 2001 From: coco875 <59367621+coco875@users.noreply.github.com> Date: Sat, 20 Dec 2025 01:16:29 +0100 Subject: [PATCH] fix again spining will but avoid invalid texture at all (#605) --- src/kart_dma.c | 49 +++++++++------------------------------------ src/render_player.c | 17 ++-------------- 2 files changed, 11 insertions(+), 55 deletions(-) diff --git a/src/kart_dma.c b/src/kart_dma.c index c25de204a..b6cd7df75 100644 --- a/src/kart_dma.c +++ b/src/kart_dma.c @@ -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]; } } diff --git a/src/render_player.c b/src/render_player.c index b8bd8bc27..74f3c4499 100644 --- a/src/render_player.c +++ b/src/render_player.c @@ -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) {