fix ending interpolation issues

This commit is contained in:
Sonic Dreamcaster 2024-11-26 05:37:22 -03:00
parent d3a759e594
commit 39ecaaf916
2 changed files with 60 additions and 12 deletions

View File

@ -420,7 +420,7 @@ void Ending_801886F4(void) {
return; return;
} }
RCP_SetupDL(&gMasterDisp, SETUPDL_78); RCP_SetupDL(&gMasterDisp, SETUPDL_78_POINT);
gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 255); gDPSetPrimColor(gMasterDisp++, 0x00, 0x00, 255, 255, 255, 255);
switch ((D_ending_80196F90 % 8) / 2) { switch ((D_ending_80196F90 % 8) / 2) {
@ -1139,8 +1139,10 @@ void Ending_Draw(void) {
if ((D_ending_80192E70 >= 0) && (D_ending_80192E70 < 10000)) { if ((D_ending_80192E70 >= 0) && (D_ending_80192E70 < 10000)) {
RCP_SetupDL(&gMasterDisp, SETUPDL_83); RCP_SetupDL(&gMasterDisp, SETUPDL_83);
gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255); gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255);
Graphics_DisplaySmallText(10, 220, 1.0f, 1.0f, "TIMER"); Graphics_DisplaySmallText(10, 210, 1.0f, 1.0f, "TIMER");
Graphics_DisplaySmallNumber(80, 220, D_ending_80192E70); Graphics_DisplaySmallNumber(80, 210, D_ending_80192E70);
Graphics_DisplaySmallText(10, 220, 1.0f, 1.0f, "CSFRM");
Graphics_DisplaySmallNumber(80, 220, gCsFrameCount);
} }
#endif #endif
@ -1545,9 +1547,13 @@ void Ending_8018B860(void) {
Play_ClearObjectData(); Play_ClearObjectData();
Ending_8018B3E8(&gActors[0], 0); Ending_8018B3E8(&gActors[0], 0);
Ending_8018B52C(&gActors[1], 0);
Ending_8018B52C(&gActors[2], 1); // Buildings
Ending_8018B52C(&gActors[3], 2); Ending_8018B52C(&gActors[1], 0); // left
Ending_8018B52C(&gActors[2], 1); // right near
Ending_8018B52C(&gActors[3], 2); // right far
// Cornerian fighters
Ending_8018B6D8(&gActors[4], 0); Ending_8018B6D8(&gActors[4], 0);
Ending_8018B6D8(&gActors[5], 1); Ending_8018B6D8(&gActors[5], 1);
Ending_8018B6D8(&gActors[6], 2); Ending_8018B6D8(&gActors[6], 2);
@ -1774,6 +1780,7 @@ void Ending_8018C21C(void) {
f32 spE4; f32 spE4;
s32 i; s32 i;
// Clouds
if (gCsFrameCount < 780) { if (gCsFrameCount < 780) {
Matrix_Push(&gGfxMatrix); Matrix_Push(&gGfxMatrix);
RCP_SetupDL(&gMasterDisp, SETUPDL_17); RCP_SetupDL(&gMasterDisp, SETUPDL_17);
@ -1793,6 +1800,13 @@ void Ending_8018C21C(void) {
Matrix_Push(&gGfxMatrix); Matrix_Push(&gGfxMatrix);
// Actors
// 0 Great Fox
// 1 Building on the left
// 2 building on the right near
// 3 building on the right far
// 4 5 6 7 8 9 cornerian ships
for (i = ARRAY_COUNT(gActors) - 1; i >= 0; i--) { for (i = ARRAY_COUNT(gActors) - 1; i >= 0; i--) {
if (gActors[i].obj.status != OBJ_FREE) { if (gActors[i].obj.status != OBJ_FREE) {
Matrix_Push(&gGfxMatrix); Matrix_Push(&gGfxMatrix);
@ -1876,7 +1890,11 @@ void Ending_8018C21C(void) {
gSPDisplayList(gMasterDisp++, D_END_700F320); gSPDisplayList(gMasterDisp++, D_END_700F320);
break; break;
case 3: case 3: // Cornerian ships
// @port: Tag the transform.
FrameInterpolation_RecordOpenChild(&gActors, i);
RCP_SetupDL(&gMasterDisp, SETUPDL_23); RCP_SetupDL(&gMasterDisp, SETUPDL_23);
Matrix_Translate(gGfxMatrix, gActors[i].obj.pos.x, gActors[i].obj.pos.y, gActors[i].obj.pos.z, Matrix_Translate(gGfxMatrix, gActors[i].obj.pos.x, gActors[i].obj.pos.y, gActors[i].obj.pos.z,
MTXF_APPLY); MTXF_APPLY);
@ -1935,6 +1953,9 @@ void Ending_8018C21C(void) {
Matrix_SetGfxMtx(&gMasterDisp); Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, D_END_700C620); gSPDisplayList(gMasterDisp++, D_END_700C620);
Matrix_Pop(&gGfxMatrix); Matrix_Pop(&gGfxMatrix);
// @port Pop the transform id.
FrameInterpolation_RecordCloseChild();
break; break;
} }
Matrix_Pop(&gGfxMatrix); Matrix_Pop(&gGfxMatrix);

View File

@ -9,6 +9,8 @@ Vec3f D_ending_801985E0;
Vec3f D_ending_801985F0; Vec3f D_ending_801985F0;
Vec3f D_ending_80198600[300]; Vec3f D_ending_80198600[300];
bool sTagged = false;
#include "fox_end2_data.c" #include "fox_end2_data.c"
void Ending_8018CE20(u32 arg0) { void Ending_8018CE20(u32 arg0) {
@ -167,7 +169,7 @@ void Ending_8018D814(u32 arg0, AssetInfo* asset) {
alpha = (asset->unk_0C + asset->unk_10 - arg0) * 255 / asset->fogFar; alpha = (asset->unk_0C + asset->unk_10 - arg0) * 255 / asset->fogFar;
} }
RCP_SetupDL(&gMasterDisp, asset->unk_08); RCP_SetupDL(&gMasterDisp, SETUPDL_76_POINT);
gDPSetPrimColor(gMasterDisp++, 0, 0, asset->prim.r, asset->prim.g, asset->prim.b, alpha); gDPSetPrimColor(gMasterDisp++, 0, 0, asset->prim.r, asset->prim.g, asset->prim.b, alpha);
@ -187,7 +189,7 @@ void Ending_8018DA0C(u32 arg0, AssetInfo* asset) {
alpha = (arg0 - asset->unk_0C) * 255 / asset->fogNear; alpha = (arg0 - asset->unk_0C) * 255 / asset->fogNear;
} }
RCP_SetupDL(&gMasterDisp, asset->unk_08); RCP_SetupDL(&gMasterDisp, SETUPDL_76_POINT);
gDPSetPrimColor(gMasterDisp++, 0, 0, asset->prim.r, asset->prim.g, asset->prim.b, alpha); gDPSetPrimColor(gMasterDisp++, 0, 0, asset->prim.r, asset->prim.g, asset->prim.b, alpha);
Graphics_DisplaySmallText((s16) asset->unk_18.x, (s16) asset->unk_18.y, asset->unk_30.x, asset->unk_30.y, Graphics_DisplaySmallText((s16) asset->unk_18.x, (s16) asset->unk_18.y, asset->unk_30.x, asset->unk_30.y,
@ -421,6 +423,9 @@ void Ending_8018E7B8(u32 arg0, AssetInfo* asset) {
void Ending_8018EDB8(u32 arg0, AssetInfo* asset) { void Ending_8018EDB8(u32 arg0, AssetInfo* asset) {
f32 temp; f32 temp;
// @port: Tag the transform.
FrameInterpolation_RecordOpenChild("Running Scene Floor", 0);
gStarCount = 0; gStarCount = 0;
RCP_SetupDL(&gMasterDisp, asset->unk_08); RCP_SetupDL(&gMasterDisp, asset->unk_08);
@ -456,6 +461,7 @@ void Ending_8018EDB8(u32 arg0, AssetInfo* asset) {
gSPDisplayList(gMasterDisp++, D_END_700E9E0); gSPDisplayList(gMasterDisp++, D_END_700E9E0);
} }
// Draw Great Fox
void Ending_8018F2A8(u32 arg0, AssetInfo* asset) { void Ending_8018F2A8(u32 arg0, AssetInfo* asset) {
f32 temp; f32 temp;
@ -493,7 +499,8 @@ void Ending_8018F2A8(u32 arg0, AssetInfo* asset) {
void Ending_8018F64C(u32 arg0, AssetInfo* asset) { void Ending_8018F64C(u32 arg0, AssetInfo* asset) {
f32 temp; f32 temp;
if (gLeveLClearStatus[LEVEL_ZONESS] == 0) { // @port: Avoid drawing Katt after 1800 ending frames to avoid interpolation issues
if ((gLeveLClearStatus[LEVEL_ZONESS] == 0) || (D_ending_80192E70 >= 1800)) {
return; return;
} }
@ -560,7 +567,8 @@ void Ending_8018F64C(u32 arg0, AssetInfo* asset) {
void Ending_8018FC60(u32 arg0, AssetInfo* asset) { void Ending_8018FC60(u32 arg0, AssetInfo* asset) {
f32 temp; f32 temp;
if (gLeveLClearStatus[LEVEL_KATINA] == 0) { // @port: Avoid drawing Bill after 1800 ending frames to avoid interpolation issues
if ((gLeveLClearStatus[LEVEL_KATINA] == 0) || (D_ending_80192E70 >= 1800)) {
return; return;
} }
@ -627,6 +635,9 @@ void Ending_8018FC60(u32 arg0, AssetInfo* asset) {
void Ending_80190274(u32 arg0, AssetInfo* asset) { void Ending_80190274(u32 arg0, AssetInfo* asset) {
f32 temp; f32 temp;
// @port: Tag the transform.
FrameInterpolation_RecordOpenChild("Corneria_Planet", 0);
RCP_SetupDL(&gMasterDisp, asset->unk_08); RCP_SetupDL(&gMasterDisp, asset->unk_08);
gSPFogPosition(gMasterDisp++, asset->fogNear, asset->fogFar); gSPFogPosition(gMasterDisp++, asset->fogNear, asset->fogFar);
@ -667,7 +678,11 @@ void Ending_80190648(s32 arg0, AssetInfo* asset) {
Matrix_Scale(gGfxMatrix, asset->unk_30.x, asset->unk_30.y, asset->unk_30.z, MTXF_APPLY); Matrix_Scale(gGfxMatrix, asset->unk_30.x, asset->unk_30.y, asset->unk_30.z, MTXF_APPLY);
Matrix_SetGfxMtx(&gMasterDisp); Matrix_SetGfxMtx(&gMasterDisp);
gSPDisplayList(gMasterDisp++, D_END_7002120);
// @port: Hide Venom under 1700 frames
if (D_ending_80192E70 < 1700) {
gSPDisplayList(gMasterDisp++, D_END_7002120);
}
} }
void Ending_80190778(u32 arg0, AssetInfo* asset) { void Ending_80190778(u32 arg0, AssetInfo* asset) {
@ -859,9 +874,11 @@ void Ending_80191294(u32 arg0, AssetInfo* asset) {
Display_ArwingWings(&D_ending_80198590); Display_ArwingWings(&D_ending_80198590);
} }
// Stubbed
void Ending_80191700(u32 arg0, AssetInfo* asset) { void Ending_80191700(u32 arg0, AssetInfo* asset) {
} }
// Draws obj displaylist
void Ending_80191710(u32 arg0, AssetInfo* asset) { void Ending_80191710(u32 arg0, AssetInfo* asset) {
f32 temp; f32 temp;
@ -917,10 +934,12 @@ void Ending_80191710(u32 arg0, AssetInfo* asset) {
gSPDisplayList(gMasterDisp++, asset->unk_00); gSPDisplayList(gMasterDisp++, asset->unk_00);
} }
// Function pointer execution
void Ending_80191C58(u32 arg0, AssetInfo* asset) { void Ending_80191C58(u32 arg0, AssetInfo* asset) {
((void (*)(u32, AssetInfo*)) asset->unk_04)(arg0, asset); ((void (*)(u32, AssetInfo*)) asset->unk_04)(arg0, asset);
} }
// Draws skeleton
void Ending_80191C7C(u32 arg0, AssetInfo* asset) { void Ending_80191C7C(u32 arg0, AssetInfo* asset) {
f32 temp; f32 temp;
@ -967,6 +986,9 @@ void Ending_80192164(u32 arg0) {
if ((D_ending_801934B4[i].unk_00 == NULL) && (D_ending_801934B4[i].unk_04 == NULL)) { if ((D_ending_801934B4[i].unk_00 == NULL) && (D_ending_801934B4[i].unk_04 == NULL)) {
Ending_80191700(arg0, &D_ending_801934B4[i]); Ending_80191700(arg0, &D_ending_801934B4[i]);
} else if ((D_ending_801934B4[i].unk_00 != NULL) && (D_ending_801934B4[i].unk_04 == NULL)) { } else if ((D_ending_801934B4[i].unk_00 != NULL) && (D_ending_801934B4[i].unk_04 == NULL)) {
// @port: Tag the transform.
FrameInterpolation_RecordOpenChild(&D_ending_801934B4[i], arg0);
sTagged = true;
Ending_80191710(arg0, &D_ending_801934B4[i]); Ending_80191710(arg0, &D_ending_801934B4[i]);
} else if ((D_ending_801934B4[i].unk_00 == NULL) && (D_ending_801934B4[i].unk_04 != NULL)) { } else if ((D_ending_801934B4[i].unk_00 == NULL) && (D_ending_801934B4[i].unk_04 != NULL)) {
Ending_80191C58(arg0, &D_ending_801934B4[i]); Ending_80191C58(arg0, &D_ending_801934B4[i]);
@ -974,6 +996,11 @@ void Ending_80192164(u32 arg0) {
Ending_80191C7C(arg0, &D_ending_801934B4[i]); Ending_80191C7C(arg0, &D_ending_801934B4[i]);
} }
Matrix_Pop(&gGfxMatrix); Matrix_Pop(&gGfxMatrix);
if (sTagged) {
// @port Pop the transform id.
FrameInterpolation_RecordCloseChild();
sTagged = false;
}
} }
} }
} }