summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcoco875 <59367621+coco875@users.noreply.github.com>2025-12-20 01:16:29 +0100
committerGitHub <noreply@github.com>2025-12-19 17:16:29 -0700
commit5d54756d2d552cab64dcb2d6e4916236b8ae8f22 (patch)
treebbfb557d2026a7400c97bd188c4b9c43349ac26c /src
parenta925d0fa2f814eeb2e780d304e89972c67171c92 (diff)
fix again spining will but avoid invalid texture at all (#605)
Diffstat (limited to 'src')
-rw-r--r--src/kart_dma.c49
-rw-r--r--src/render_player.c17
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) {