From 132357d9fb50d7962518e10b22db358c85d87ba5 Mon Sep 17 00:00:00 2001 From: MegaMech Date: Fri, 6 Mar 2026 20:10:07 -0700 Subject: [PATCH] Big Interpolation Overhaul (#674) * Fix FI * FI statue * Intepr fixes * Improve * More interp * Fix compile * More interp * Fix text --- src/actors/fake_item_box/render.inc.c | 22 +++++--- src/actors/falling_rock/render.inc.c | 2 + src/actors/falling_rock/update.inc.c | 2 + src/actors/item_box/render.inc.c | 28 ++++++---- src/actors/yoshi_egg/render.inc.c | 10 +++- src/code_800029B0.c | 6 +-- src/code_80057C60.c | 48 +++++++++-------- src/engine/Smoke.cpp | 4 +- src/engine/actors/BowserStatue.cpp | 6 ++- src/engine/actors/BowserStatue.h | 2 + src/engine/actors/FallingRock.cpp | 8 ++- src/engine/actors/FallingRock.h | 3 +- src/engine/actors/Finishline.cpp | 5 +- src/engine/actors/Finishline.h | 1 + src/engine/actors/MarioSign.cpp | 7 ++- src/engine/actors/MarioSign.h | 7 ++- src/engine/actors/Text.cpp | 2 +- src/engine/actors/WarioSign.cpp | 7 ++- src/engine/actors/WarioSign.h | 7 ++- src/engine/objects/Bat.cpp | 4 +- src/engine/objects/Boos.cpp | 10 ++-- src/engine/objects/Boos.h | 2 +- src/engine/objects/CheepCheep.cpp | 3 ++ src/engine/objects/GrandPrixBalloons.cpp | 4 +- src/engine/objects/GrandPrixBalloons.h | 2 +- src/engine/objects/Lakitu.cpp | 9 ++-- src/engine/objects/Penguin.cpp | 2 +- src/engine/objects/Thwomp.cpp | 9 ++-- src/engine/objects/TrashBin.cpp | 4 +- src/engine/particles/StarEmitter.cpp | 6 +-- src/engine/sky/SkyCloud.cpp | 2 +- src/engine/sky/SkySnow.cpp | 2 +- src/engine/sky/SkyStar.cpp | 2 +- src/engine/tracks/CustomTrack.cpp | 4 +- src/racing/actors.c | 12 +++-- src/racing/skybox_and_splitscreen.c | 2 +- src/render_objects.c | 65 +++++++++++------------- src/render_objects.h | 8 +-- 38 files changed, 194 insertions(+), 135 deletions(-) diff --git a/src/actors/fake_item_box/render.inc.c b/src/actors/fake_item_box/render.inc.c index 37182dd7c..af0ca4d54 100644 --- a/src/actors/fake_item_box/render.inc.c +++ b/src/actors/fake_item_box/render.inc.c @@ -25,7 +25,15 @@ void render_actor_fake_item_box(Camera* camera, struct FakeItemBox* fakeItemBox) f32 temp_f2_2; f32 someMultiplier; - FrameInterpolation_RecordOpenChild("Fake Item Box", TAG_ITEM_ADDR((((struct Actor*)fakeItemBox) - gActorList) << 5) | (camera - cameras)); + size_t actorIdx = CM_FindActorIndex((struct Actor*)fakeItemBox); + if (-1 == actorIdx) { + printf("[render_actor_fake_item_box] Could not find fake item box for FI, skipping!\n"); + return; + } + + u32 uniqueIdentifier = TAG_ITEM_ADDR((actorIdx << 4) | (camera - cameras)); + + FrameInterpolation_RecordOpenChild("fake_item_box", uniqueIdentifier); if (is_within_render_distance(camera->pos, fakeItemBox->pos, camera->rot[1], 2500.0f, camera->fieldOfView, 1000000.0f) < 0 && @@ -58,7 +66,7 @@ void render_actor_fake_item_box(Camera* camera, struct FakeItemBox* fakeItemBox) gSPDisplayList(gDisplayListHead++, common_model_fake_itembox); FrameInterpolation_RecordCloseChild(); - FrameInterpolation_RecordOpenChild("fake_item_box_part2", TAG_ITEM_ADDR((((struct Actor*)fakeItemBox) - gActorList) << 5) | (camera - cameras)); + FrameInterpolation_RecordOpenChild("fake_item_box_part2", uniqueIdentifier); mtxf_pos_rotation_xyz(someMatrix2, fakeItemBox->pos, fakeItemBox->rot); mtxf_scale(someMatrix2, fakeItemBox->sizeScaling); @@ -129,7 +137,7 @@ void render_actor_fake_item_box(Camera* camera, struct FakeItemBox* fakeItemBox) someVec[0] = temp_f2_2; someVec[1] = 2.3f * thing; someVec[2] = temp_f12; - FrameInterpolation_RecordOpenChild("fake_item_box_part3", TAG_ITEM_ADDR((((struct Actor*)fakeItemBox) - gActorList) << 5) | (camera - cameras)); + FrameInterpolation_RecordOpenChild("fake_item_box_part3", uniqueIdentifier); add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec); @@ -144,7 +152,7 @@ void render_actor_fake_item_box(Camera* camera, struct FakeItemBox* fakeItemBox) someVec[0] = temp_f2_2; someVec[1] = 1.2f * thing; someVec[2] = temp_f0_2; - FrameInterpolation_RecordOpenChild("fake_item_box_part4", TAG_ITEM_ADDR((((struct Actor*)fakeItemBox) - gActorList) << 5) | (camera - cameras)); + FrameInterpolation_RecordOpenChild("fake_item_box_part4", uniqueIdentifier); add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec); if (!render_set_position(someMatrix3, 0)) { @@ -163,7 +171,7 @@ void render_actor_fake_item_box(Camera* camera, struct FakeItemBox* fakeItemBox) someVec[0] = 0.0f; someVec[1] = 1.8f * thing; someVec[2] = -1.0f * thing; - FrameInterpolation_RecordOpenChild("fake_item_box_part5", TAG_ITEM_ADDR((((struct Actor*)fakeItemBox) - gActorList) << 5) | (camera - cameras)); + FrameInterpolation_RecordOpenChild("fake_item_box_part5", uniqueIdentifier); add_translate_mat4_vec3f(someMatrix2, someMatrix3, someVec); @@ -173,7 +181,7 @@ void render_actor_fake_item_box(Camera* camera, struct FakeItemBox* fakeItemBox) } gSPDisplayList(gDisplayListHead++, D_0D0031E8); FrameInterpolation_RecordCloseChild(); - FrameInterpolation_RecordOpenChild("fake_item_box_part6", TAG_ITEM_ADDR((((struct Actor*)fakeItemBox) - gActorList) << 5) | (camera - cameras)); + FrameInterpolation_RecordOpenChild("fake_item_box_part6", uniqueIdentifier); temp_f0_3 = -0.8f * thing; someVec[0] = temp_f0_3; @@ -188,7 +196,7 @@ void render_actor_fake_item_box(Camera* camera, struct FakeItemBox* fakeItemBox) gSPDisplayList(gDisplayListHead++, D_0D003188); FrameInterpolation_RecordCloseChild(); - FrameInterpolation_RecordOpenChild("fake_item_box_part7", TAG_ITEM_ADDR((((struct Actor*)fakeItemBox) - gActorList) << 5) | (camera - cameras)); + FrameInterpolation_RecordOpenChild("fake_item_box_part7", uniqueIdentifier); someVec[0] = temp_f0_3; someVec[1] = temp_f2; diff --git a/src/actors/falling_rock/render.inc.c b/src/actors/falling_rock/render.inc.c index 8b262cc35..b3c9da9a1 100644 --- a/src/actors/falling_rock/render.inc.c +++ b/src/actors/falling_rock/render.inc.c @@ -17,6 +17,8 @@ void render_actor_falling_rock(Camera* camera, struct FallingRock* rock) { f32 height; UNUSED s32 pad[4]; + return; // No longer used. Use the C++ actor! + if (rock->respawnTimer != 0) { return; } diff --git a/src/actors/falling_rock/update.inc.c b/src/actors/falling_rock/update.inc.c index 434d7c2a7..a0605a169 100644 --- a/src/actors/falling_rock/update.inc.c +++ b/src/actors/falling_rock/update.inc.c @@ -58,6 +58,8 @@ void update_actor_falling_rocks(struct FallingRock* rock) { f32 pad0; f32 pad1; + return; // No longer used! Use C++ actor + if (rock->respawnTimer != 0) { rock->respawnTimer -= 1; return; diff --git a/src/actors/item_box/render.inc.c b/src/actors/item_box/render.inc.c index 3b864ad65..1c3e24e62 100644 --- a/src/actors/item_box/render.inc.c +++ b/src/actors/item_box/render.inc.c @@ -27,6 +27,14 @@ void render_actor_item_box(Camera* camera, struct ItemBox* item_box) { f32 temp_f2_2; f32 someMultiplier; + size_t actorIdx = CM_FindActorIndex((struct Actor*)item_box); + if (-1 == actorIdx) { + printf("[render_actor_item_box] Could not find item box for FI, skipping!\n"); + return; + } + + u32 uniqueIdentifier = TAG_ITEM_ADDR((actorIdx << 4) | (camera - cameras)); + temp_f0 = is_within_render_distance(camera->pos, item_box->pos, camera->rot[1], 0.0f, camera->fieldOfView, 4000000.0f); if (CVarGetInteger("gNoCulling", 0) == 1) { @@ -41,7 +49,7 @@ void render_actor_item_box(Camera* camera, struct ItemBox* item_box) { someVec2[1] = item_box->resetDistance + 2.0f; someVec2[2] = item_box->pos[2]; - FrameInterpolation_RecordOpenChild("itembox", TAG_ITEM_ADDR((((struct Actor*)item_box) - gActorList) << 5) | (camera - cameras)); + FrameInterpolation_RecordOpenChild("itembox", uniqueIdentifier); mtxf_pos_rotation_xyz(someMatrix1, someVec2, someRot); if (!render_set_position(someMatrix1, 0)) { @@ -51,7 +59,7 @@ void render_actor_item_box(Camera* camera, struct ItemBox* item_box) { gSPDisplayList(gDisplayListHead++, D_0D002EE8); FrameInterpolation_RecordCloseChild(); - FrameInterpolation_RecordOpenChild("itembox2", TAG_ITEM_ADDR((((struct Actor*)item_box) - gActorList) << 5) | (camera - cameras)); + FrameInterpolation_RecordOpenChild("itembox2", uniqueIdentifier); someRot[1] = item_box->rot[1] * 2; @@ -68,7 +76,7 @@ void render_actor_item_box(Camera* camera, struct ItemBox* item_box) { FrameInterpolation_RecordCloseChild(); } if (item_box->state == 5) { - FrameInterpolation_RecordOpenChild("itembox3", TAG_ITEM_ADDR((((struct Actor*)item_box) - gActorList) << 5) | (camera - cameras)); + FrameInterpolation_RecordOpenChild("itembox3", uniqueIdentifier); mtxf_pos_rotation_xyz(someMatrix1, item_box->pos, item_box->rot); if (!render_set_position(someMatrix1, 0)) { @@ -80,7 +88,7 @@ void render_actor_item_box(Camera* camera, struct ItemBox* item_box) { FrameInterpolation_RecordCloseChild(); } if (item_box->state != 3) { - FrameInterpolation_RecordOpenChild("itembox4", TAG_ITEM_ADDR((((struct Actor*)item_box) - gActorList) << 5) | (camera - cameras)); + FrameInterpolation_RecordOpenChild("itembox4", uniqueIdentifier); mtxf_pos_rotation_xyz(someMatrix1, item_box->pos, item_box->rot); if (!render_set_position(someMatrix1, 0)) { @@ -121,7 +129,7 @@ void render_actor_item_box(Camera* camera, struct ItemBox* item_box) { gDPSetBlendMask(gDisplayListHead++, 0xFF); thing = item_box->someTimer; - FrameInterpolation_RecordOpenChild("itembox5", TAG_ITEM_ADDR((((struct Actor*)item_box) - gActorList) << 5) | (camera - cameras)); + FrameInterpolation_RecordOpenChild("itembox5", uniqueIdentifier); mtxf_pos_rotation_xyz(someMatrix1, item_box->pos, item_box->rot); if (thing < 10.0f) { someMultiplier = 1.0f; @@ -147,7 +155,7 @@ void render_actor_item_box(Camera* camera, struct ItemBox* item_box) { gSPDisplayList(gDisplayListHead++, D_0D003158); FrameInterpolation_RecordCloseChild(); - FrameInterpolation_RecordOpenChild("itembox6", TAG_ITEM_ADDR((((struct Actor*)item_box) - gActorList) << 5) | (camera - cameras)); + FrameInterpolation_RecordOpenChild("itembox6", uniqueIdentifier); temp_f2_2 = 0.8f * thing; temp_f12 = 0.5f * thing; @@ -163,7 +171,7 @@ void render_actor_item_box(Camera* camera, struct ItemBox* item_box) { gSPDisplayList(gDisplayListHead++, D_0D0031B8); FrameInterpolation_RecordCloseChild(); - FrameInterpolation_RecordOpenChild("itembox7", TAG_ITEM_ADDR((((struct Actor*)item_box) - gActorList) << 5) | (camera - cameras)); + FrameInterpolation_RecordOpenChild("itembox7", uniqueIdentifier); temp_f0_2 = -0.5f * thing; someVec1[0] = temp_f2_2; @@ -179,7 +187,7 @@ void render_actor_item_box(Camera* camera, struct ItemBox* item_box) { gSPDisplayList(gDisplayListHead++, D_0D003128); FrameInterpolation_RecordCloseChild(); - FrameInterpolation_RecordOpenChild("itembox8", TAG_ITEM_ADDR((((struct Actor*)item_box) - gActorList) << 5) | (camera - cameras)); + FrameInterpolation_RecordOpenChild("itembox8", uniqueIdentifier); if (!(item_box->someTimer & 1)) { @@ -200,7 +208,7 @@ void render_actor_item_box(Camera* camera, struct ItemBox* item_box) { gSPDisplayList(gDisplayListHead++, D_0D0031E8); FrameInterpolation_RecordCloseChild(); - FrameInterpolation_RecordOpenChild("itembox9", TAG_ITEM_ADDR((((struct Actor*)item_box) - gActorList) << 5) | (camera - cameras)); + FrameInterpolation_RecordOpenChild("itembox9", uniqueIdentifier); temp_f0_3 = -0.8f * thing; someVec1[0] = temp_f0_3; @@ -216,7 +224,7 @@ void render_actor_item_box(Camera* camera, struct ItemBox* item_box) { gSPDisplayList(gDisplayListHead++, D_0D003188); FrameInterpolation_RecordCloseChild(); - FrameInterpolation_RecordOpenChild("itembox10", TAG_ITEM_ADDR((((struct Actor*)item_box) - gActorList) << 5) | (camera - cameras)); + FrameInterpolation_RecordOpenChild("itembox10", uniqueIdentifier); someVec1[0] = temp_f0_3; someVec1[1] = temp_f2; diff --git a/src/actors/yoshi_egg/render.inc.c b/src/actors/yoshi_egg/render.inc.c index a9b8234d4..3d8a35e51 100644 --- a/src/actors/yoshi_egg/render.inc.c +++ b/src/actors/yoshi_egg/render.inc.c @@ -19,6 +19,12 @@ void render_actor_yoshi_egg(Camera* camera, Mat4 arg1, struct YoshiValleyEgg* eg Vec3f sp54; f32 temp_f0; + size_t actorIdx = CM_FindActorIndex((struct Actor*) egg); + if (-1 == actorIdx) { + printf("[render_actor_yoshi_egg] Could not find actor for FI, skipping\n"); + return; + } + if (gGamestate != CREDITS_SEQUENCE) { temp_f0 = is_within_render_distance(camera->pos, egg->pos, camera->rot[1], 200.0f, camera->fieldOfView, 16000000.0f); @@ -53,7 +59,7 @@ void render_actor_yoshi_egg(Camera* camera, Mat4 arg1, struct YoshiValleyEgg* eg sp5C[1] = egg->eggRot; sp5C[2] = 0; - FrameInterpolation_RecordOpenChild("yoshi_egg", TAG_OBJECT(egg)); + FrameInterpolation_RecordOpenChild("yoshi_egg", TAG_OBJECT((actorIdx << 4) | camera->cameraId)); mtxf_pos_rotation_xyz(sp60, egg->pos, sp5C); if (render_set_position(sp60, 0) == 0) { @@ -68,7 +74,7 @@ void render_actor_yoshi_egg(Camera* camera, Mat4 arg1, struct YoshiValleyEgg* eg arg1[3][1] = egg->pos[1]; arg1[3][2] = egg->pos[2]; - FrameInterpolation_RecordOpenChild("yoshi_egg2", TAG_OBJECT(egg)); + FrameInterpolation_RecordOpenChild("yoshi_egg2", TAG_OBJECT((actorIdx << 4) | camera->cameraId)); if (render_set_position(arg1, 0) != 0) { gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); diff --git a/src/code_800029B0.c b/src/code_800029B0.c index 42f9c279a..4d68b49de 100644 --- a/src/code_800029B0.c +++ b/src/code_800029B0.c @@ -153,11 +153,11 @@ f32 gWaterLevel; f32 gWaterVelocity; s16 gPlayerPositionLUT[8]; // Player index at each position u16 gNumPermanentActors; -s32 code_800029B0_bss_pad2[44]; +//s32 code_800029B0_bss_pad2[44]; -struct Actor gActorList[100]; +//struct Actor gActorList[100]; use CM_FindActorIndex(actor) instead //! @warning todo: Is this apart of the actor array? -UNUSED u8 D_80162578[sizeof(struct Actor)]; +//UNUSED u8 D_80162578[sizeof(struct Actor)]; s16 gDebugPathCount; s16 sIsController1Unplugged; diff --git a/src/code_80057C60.c b/src/code_80057C60.c index 948285d77..9a45ea57d 100644 --- a/src/code_80057C60.c +++ b/src/code_80057C60.c @@ -562,18 +562,18 @@ void render_object_for_player(s32 cameraId) { } } -void render_snowing_effect(s32 playerId) { +void render_snowing_effect(s32 cameraId) { if (IsFrappeSnowland()) { if (gGamestate != 9) { if ((D_8015F894 == 0) && (gPlayerCountSelection1 == 1)) { - render_object_snowflakes_particles(); + render_object_snowflakes_particles(cameraId); } } else { - render_object_snowflakes_particles(); + render_object_snowflakes_particles(cameraId); } } if (CM_GetProps()->LakituTowType == 1) { - render_ice_block(playerId); + render_ice_block(cameraId); } } @@ -4765,7 +4765,7 @@ void func_8006538C(Player* player, s8 arg1, s16 arg2, s8 arg3) { } } -void func_800658A0(Player* player, UNUSED s8 arg1, s16 arg2, s8 arg3) { +void func_800658A0(Player* player, s8 playerId, s16 idx, s8 screenId) { Vec3f sp54; Vec3s sp4C; s16 red; @@ -4773,24 +4773,26 @@ void func_800658A0(Player* player, UNUSED s8 arg1, s16 arg2, s8 arg3) { s16 blue; s16 alpha; - if (player->particlePool0[arg2].isAlive == 1) { - red = player->particlePool0[arg2].red; - green = player->particlePool0[arg2].green; - blue = player->particlePool0[arg2].blue; - alpha = player->particlePool0[arg2].alpha; - sp54[0] = player->particlePool0[arg2].pos[0]; - sp54[1] = player->particlePool0[arg2].pos[1]; - sp54[2] = player->particlePool0[arg2].pos[2]; + if (player->particlePool0[idx].isAlive == 1) { + red = player->particlePool0[idx].red; + green = player->particlePool0[idx].green; + blue = player->particlePool0[idx].blue; + alpha = player->particlePool0[idx].alpha; + sp54[0] = player->particlePool0[idx].pos[0]; + sp54[1] = player->particlePool0[idx].pos[1]; + sp54[2] = player->particlePool0[idx].pos[2]; sp4C[0] = 0; - sp4C[1] = player->unk_048[arg3]; + sp4C[1] = player->unk_048[screenId]; sp4C[2] = 0; - func_800652D4(sp54, sp4C, player->particlePool0[arg2].scale * player->size); + FrameInterpolation_RecordOpenChild("some_ply_part4", (idx << 8) | (playerId << 4) | screenId); + func_800652D4(sp54, sp4C, player->particlePool0[idx].scale * player->size); gSPDisplayList(gDisplayListHead++, D_0D008DB8); gDPLoadTextureBlock(gDisplayListHead++, D_8018D48C, G_IM_FMT_IA, G_IM_SIZ_8b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); func_8004B35C(red, green, blue, alpha); gSPDisplayList(gDisplayListHead++, D_0D008E48); + FrameInterpolation_RecordCloseChild(); gMatrixEffectCount += 1; } } @@ -4958,7 +4960,7 @@ void func_800664E0(Player* player, UNUSED s8 arg1, s16 arg2, s8 arg3) { } } -void func_80066714(Player* player, UNUSED s32 arg1, s16 arg2, s8 arg3) { +UNUSED void func_80066714(Player* player, UNUSED s32 arg1, s16 arg2, s8 arg3) { Vec3f sp5C; Vec3s sp54; s16 red; @@ -5147,7 +5149,7 @@ void func_80067280(Player* player, UNUSED s8 arg1, s16 arg2, s8 arg3) { } } -void render_player_boost_spark_particles(Player* player, UNUSED s8 arg1, s16 arg2, s8 arg3) { +void render_player_boost_spark_particles(Player* player, s8 playerId, s16 arg2, s8 screenId) { Vec3f sp8C; Vec3s sp84; UNUSED s32 stackPadding[4]; @@ -5157,8 +5159,9 @@ void render_player_boost_spark_particles(Player* player, UNUSED s8 arg1, s16 arg sp8C[1] = player->particlePool3[arg2].pos[1]; sp8C[2] = player->particlePool3[arg2].pos[2]; sp84[0] = 0; - sp84[1] = player->unk_048[arg3]; + sp84[1] = player->unk_048[screenId]; sp84[2] = 0; + FrameInterpolation_RecordOpenChild("boost_spark_particle", TAG_SMOKE_DUST((arg2 << 8) | (playerId << 4) | screenId)); func_800652D4(sp8C, sp84, player->particlePool3[arg2].scale * player->size); if (player->particlePool3[arg2].unk_010 == 1) { gSPDisplayList(gDisplayListHead++, D_0D008DB8); @@ -5175,6 +5178,7 @@ void render_player_boost_spark_particles(Player* player, UNUSED s8 arg1, s16 arg func_8004B72C(0x000000FF, 0x000000FF, 0x000000DF, 0x000000FF, 0x0000005F, 0, 0x00000060); gSPDisplayList(gDisplayListHead++, D_0D008E48); } + FrameInterpolation_RecordCloseChild(); gMatrixEffectCount += 1; } } @@ -5964,7 +5968,7 @@ void render_balloon(Vec3f arg0, f32 arg1, s16 arg2, s16 arg3) { gMatrixEffectCount += 1; } -void func_8006C0C8(Vec3f arg0, f32 arg1, s32 rgb, s16 alpha) { +UNUSED void func_8006C0C8(Vec3f arg0, f32 arg1, s32 rgb, s16 alpha) { Vec3f sp4C; Vec3s sp44; s16 red; @@ -6454,15 +6458,15 @@ void func_8006D474(Player* player, s8 playerId, s8 screenId) { } } -void func_8006DC54(Player* player, s8 arg1, s8 arg2) { +void func_8006DC54(Player* player, s8 playerId, s8 screenId) { s16 i; s32 bitwiseMask; - bitwiseMask = SIDE_OF_KART << (arg2 * 4); + bitwiseMask = SIDE_OF_KART << (screenId * 4); if (bitwiseMask == (player->unk_002 & bitwiseMask)) { for (i = 0; i < 10; i++) { if (player->particlePool0[i].type == 7) { - func_800658A0(player, arg1, i, arg2); + func_800658A0(player, playerId, i, screenId); } } } diff --git a/src/engine/Smoke.cpp b/src/engine/Smoke.cpp index 849c67351..e36252f9a 100644 --- a/src/engine/Smoke.cpp +++ b/src/engine/Smoke.cpp @@ -89,7 +89,7 @@ void TrainSmokeDraw(s32 cameraId) { if ((train->SomeFlags != 0) && (is_particle_on_screen(train->Locomotive.position, camera, 0x4000U) != 0)) { for (size_t i = 0; i < 128; i++) { - FrameInterpolation_RecordOpenChild("TrainSmokeParticle", train->SmokeParticles[i]); + FrameInterpolation_RecordOpenChild("train_smoke_particle", (train->SmokeParticles[i] << 4) | camera->cameraId); render_object_train_smoke_particle(train->SmokeParticles[i], cameraId); FrameInterpolation_RecordCloseChild(); } @@ -103,7 +103,7 @@ void TrainSmokeDraw(s32 cameraId) { D_80183E80[2] = 0x8000; if ((boat->SomeFlags != 0) && (is_particle_on_screen(boat->Position, camera, 0x4000U) != 0)) { for (size_t i = 0; i < gObjectParticle2_SIZE; i++) { - FrameInterpolation_RecordOpenChild("BoatSmokeParticle", boat->SmokeParticles[i]); + FrameInterpolation_RecordOpenChild("boat_smoke_particle", (boat->SmokeParticles[i] << 4) | camera->cameraId); render_object_paddle_boat_smoke_particle(boat->SmokeParticles[i], cameraId); FrameInterpolation_RecordCloseChild(); } diff --git a/src/engine/actors/BowserStatue.cpp b/src/engine/actors/BowserStatue.cpp index 59a013d7c..b9c2d56e8 100644 --- a/src/engine/actors/BowserStatue.cpp +++ b/src/engine/actors/BowserStatue.cpp @@ -14,6 +14,8 @@ extern "C" { Vtx gBowserStatueVtx[717]; Gfx gBowserStatueGfx[162]; +size_t ABowserStatue::_count = 0; + ABowserStatue::ABowserStatue(const SpawnParams& params) { Name = "Bowser Statue"; ResourceName = "mk:bowser_statue"; @@ -26,6 +28,8 @@ ABowserStatue::ABowserStatue(const SpawnParams& params) { Scale = params.Scale.value_or(FVector(1.0f, 1.0f, 1.0f)); mBehaviour = static_cast(params.Behaviour.value_or(0)); + _idx = _count; + _count += 1; } void ABowserStatue::Tick() { @@ -44,7 +48,7 @@ void ABowserStatue::Draw(Camera *camera) { FVector pos = FVector(Pos[0] + 76, Pos[1], Pos[2] + 1846); - FrameInterpolation_RecordOpenChild("mk:bowser_statue", TAG_OBJECT(this)); + FrameInterpolation_RecordOpenChild("mk:bowser_statue", TAG_OBJECT((_idx << 4) | camera->cameraId)); ApplyMatrixTransformations(mtx, pos, *(IRotator*)Rot, Scale); AddObjectMatrix(mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gDPSetCombineMode(gDisplayListHead++,G_CC_MODULATEIA, G_CC_MODULATEIA); diff --git a/src/engine/actors/BowserStatue.h b/src/engine/actors/BowserStatue.h index f8eb72514..59a75e3e7 100644 --- a/src/engine/actors/BowserStatue.h +++ b/src/engine/actors/BowserStatue.h @@ -30,4 +30,6 @@ public: virtual bool IsMod() override; private: ABowserStatue::Behaviour mBehaviour; + static size_t _count; + size_t _idx; }; diff --git a/src/engine/actors/FallingRock.cpp b/src/engine/actors/FallingRock.cpp index d32b65c9d..4cd4b72ce 100644 --- a/src/engine/actors/FallingRock.cpp +++ b/src/engine/actors/FallingRock.cpp @@ -24,6 +24,7 @@ AFallingRock::AFallingRock(SpawnParams params) : AActor(params) { Type = ACTOR_FALLING_ROCK; Name = "Falling Rock"; ResourceName = "mk:falling_rock"; + _idx = _count; FVector pos = params.Location.value_or(FVector(0, 0, 0)); TimerLength = params.Behaviour.value_or(80); @@ -179,7 +180,7 @@ void AFallingRock::Draw(Camera* camera) { sp98[2] = 0; sp8C[1] = height + 2.0f; - FrameInterpolation_RecordOpenChild("rock_shadow", (uintptr_t) this); + FrameInterpolation_RecordOpenChild("rock_shadow", (_idx << 4) | camera->cameraId); mtxf_pos_rotation_xyz(mtx, sp8C, sp98); if (render_set_position(mtx, 0) == 0) { FrameInterpolation_RecordCloseChild(); @@ -190,18 +191,15 @@ void AFallingRock::Draw(Camera* camera) { } } - // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("rock", (uintptr_t) this); + FrameInterpolation_RecordOpenChild("rock", (_idx << 4) | camera->cameraId); mtxf_pos_rotation_xyz(mtx, Pos, Rot); if (render_set_position(mtx, 0) == 0) { - // @port Pop the transform id. FrameInterpolation_RecordCloseChild(); return; } gSPDisplayList(gDisplayListHead++, (Gfx*)d_course_choco_mountain_dl_falling_rock); - // @port Pop the transform id. FrameInterpolation_RecordCloseChild(); } diff --git a/src/engine/actors/FallingRock.h b/src/engine/actors/FallingRock.h index 2bbbd7443..ec05a8674 100644 --- a/src/engine/actors/FallingRock.h +++ b/src/engine/actors/FallingRock.h @@ -37,7 +37,8 @@ public: virtual void DrawEditorProperties() override; void Reset(); - private: +private: uint32_t RespawnTimer = 0; static size_t _count; + size_t _idx; }; diff --git a/src/engine/actors/Finishline.cpp b/src/engine/actors/Finishline.cpp index ec9a5f97b..5b853fbfc 100644 --- a/src/engine/actors/Finishline.cpp +++ b/src/engine/actors/Finishline.cpp @@ -24,6 +24,7 @@ size_t AFinishline::_count = 0; AFinishline::AFinishline(const SpawnParams& params) : AActor(params) { Name = "Finishline"; ResourceName = "mk:finishline"; + _idx = _count; if (params.Location.has_value()) { FVector pos = params.Location.value_or(FVector(0, 0, 0)); @@ -47,6 +48,8 @@ AFinishline::AFinishline(const SpawnParams& params) : AActor(params) { Flags = -0x8000 | 0x4000; BoundingBoxSize = 0.0f; + + _count +=1; } void AFinishline::BeginPlay() { @@ -70,7 +73,7 @@ void AFinishline::Draw(Camera *camera) { return; } - FrameInterpolation_RecordOpenChild("Finishline", _count); + FrameInterpolation_RecordOpenChild("finishline", (_idx << 4) | (camera->cameraId)); mtxf_pos_rotation_xyz(mtx, Pos, Rot); diff --git a/src/engine/actors/Finishline.h b/src/engine/actors/Finishline.h index eefac2f41..681461c5c 100644 --- a/src/engine/actors/Finishline.h +++ b/src/engine/actors/Finishline.h @@ -49,6 +49,7 @@ public: bool bIsFinishline = false; static size_t _count; + size_t _idx; bool PickedUp = false; uint32_t Timer = 0; diff --git a/src/engine/actors/MarioSign.cpp b/src/engine/actors/MarioSign.cpp index 7722b7de5..bf87b0f6b 100644 --- a/src/engine/actors/MarioSign.cpp +++ b/src/engine/actors/MarioSign.cpp @@ -14,12 +14,15 @@ extern "C" { #include "collision.h" } +size_t AMarioSign::_count = 0; + AMarioSign::AMarioSign(const SpawnParams& params) : AActor(params) { Name = "Mario Sign"; ResourceName = "mk:mario_sign"; Model = d_course_mario_raceway_dl_sign; Speed = params.Speed.value_or(182); + _idx = _count; FVector pos = params.Location.value_or(FVector(0, 0, 0)); Pos[0] = pos.x * gTrackDirection; @@ -36,6 +39,8 @@ AMarioSign::AMarioSign(const SpawnParams& params) : AActor(params) { func_802AAAAC(&Unk30); Flags = -0x8000; Flags |= 0x4000; + + _count += 1; } bool AMarioSign::IsMod() { @@ -73,7 +78,7 @@ void AMarioSign::Draw(Camera *camera) { unk = MAX(unk, 0.0f); } if (!(unk < 0.0f)) { - FrameInterpolation_RecordOpenChild("mk:mario_sign", TAG_OBJECT(this)); + FrameInterpolation_RecordOpenChild("mk:mario_sign", TAG_OBJECT((_idx << 4) | camera->cameraId)); gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH); gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); mtxf_pos_rotation_xyz(sp40, Pos, Rot); diff --git a/src/engine/actors/MarioSign.h b/src/engine/actors/MarioSign.h index 57b6c38aa..699a68769 100644 --- a/src/engine/actors/MarioSign.h +++ b/src/engine/actors/MarioSign.h @@ -13,7 +13,9 @@ extern "C" { class AMarioSign : public AActor { public: - virtual ~AMarioSign() = default; + virtual ~AMarioSign() { + _count -= 1; + }; explicit AMarioSign(const SpawnParams& params); // This is simply a helper function to keep Spawning code clean @@ -33,4 +35,7 @@ public: virtual void SetSpawnParams(SpawnParams& params) override; virtual void Tick() override; virtual void Draw(Camera*) override; +private: + static size_t _count; + size_t _idx; }; diff --git a/src/engine/actors/Text.cpp b/src/engine/actors/Text.cpp index f6ab19373..d2468d2a1 100644 --- a/src/engine/actors/Text.cpp +++ b/src/engine/actors/Text.cpp @@ -357,6 +357,7 @@ void AText::SetupVtx() { void AText::DrawText3D(Camera* camera) { // Based on func_80095BD0 Mat4 mtx; + FrameInterpolation_RecordOpenChild("actor_text", (_idx << 4) | camera->cameraId); if (FaceCamera) { ApplySphericalBillBoard(mtx, *(FVector*)Pos, Scale, camera->cameraId); } else { @@ -365,7 +366,6 @@ void AText::DrawText3D(Camera* camera) { // Based on func_80095BD0 AddObjectMatrix(mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - FrameInterpolation_RecordOpenChild("actor_text", ((uintptr_t)_idx << 6) | camera->cameraId); gSPDisplayList(gDisplayListHead++, (Gfx*)D_020077A8); for (CharacterList& tex : TextureList) { diff --git a/src/engine/actors/WarioSign.cpp b/src/engine/actors/WarioSign.cpp index cd7813f04..9b3a276ac 100644 --- a/src/engine/actors/WarioSign.cpp +++ b/src/engine/actors/WarioSign.cpp @@ -13,6 +13,8 @@ extern "C" { #include "collision.h" } +size_t AWarioSign::_count = 0; + AWarioSign::AWarioSign(const SpawnParams& params) : AActor(params) { Type = ACTOR_WARIO_SIGN; Name = "Wario Sign"; @@ -20,6 +22,7 @@ AWarioSign::AWarioSign(const SpawnParams& params) : AActor(params) { Model = d_course_wario_stadium_dl_sign; Speed = params.Speed.value_or(182); + _idx = _count; FVector pos = params.Location.value_or(FVector(0, 0, 0)); Pos[0] = pos.x * gTrackDirection; @@ -35,6 +38,8 @@ AWarioSign::AWarioSign(const SpawnParams& params) : AActor(params) { func_802AAAAC(&Unk30); Flags = -0x8000; + + _count += 1; } bool AWarioSign::IsMod() { @@ -54,7 +59,7 @@ void AWarioSign::Draw(Camera *camera) { unk = MAX(unk, 0.0f); } if (!(unk < 0.0f)) { - FrameInterpolation_RecordOpenChild("mk:mario_sign", TAG_OBJECT(this)); + FrameInterpolation_RecordOpenChild("mk:mario_sign", TAG_OBJECT((_idx << 4) | camera->cameraId)); gSPSetGeometryMode(gDisplayListHead++, G_SHADING_SMOOTH); gSPClearGeometryMode(gDisplayListHead++, G_LIGHTING); diff --git a/src/engine/actors/WarioSign.h b/src/engine/actors/WarioSign.h index 112222570..355e7343a 100644 --- a/src/engine/actors/WarioSign.h +++ b/src/engine/actors/WarioSign.h @@ -8,7 +8,9 @@ class AWarioSign : public AActor { public: - virtual ~AWarioSign() = default; + virtual ~AWarioSign() { + _count -= 1; + }; explicit AWarioSign(const SpawnParams& params); // This is simply a helper function to keep Spawning code clean @@ -27,4 +29,7 @@ public: virtual bool IsMod() override; virtual void Tick() override; virtual void Draw(Camera*) override; +private: + static size_t _count; + size_t _idx; }; diff --git a/src/engine/objects/Bat.cpp b/src/engine/objects/Bat.cpp index 2b6f01230..148725bca 100644 --- a/src/engine/objects/Bat.cpp +++ b/src/engine/objects/Bat.cpp @@ -126,7 +126,7 @@ void OBat::Draw(s32 cameraId) { if ((gObjectList[objectIndex].state >= 2) && (gMatrixHudCount < 0x2EF)) { // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("Bat set 1", (uintptr_t) &gObjectList[objectIndex]); + FrameInterpolation_RecordOpenChild("bat_1", (objectIndex << 4) | cameraId); D_80183E80[1] = func_800418AC(gObjectList[objectIndex].pos[0], gObjectList[objectIndex].pos[2], cam->pos); @@ -149,7 +149,7 @@ void OBat::Draw(s32 cameraId) { if ((gObjectList[objectIndex].state >= 2) && (gMatrixHudCount < 0x2EF)) { // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("Bat set 2", (uintptr_t) &gObjectList[objectIndex]); + FrameInterpolation_RecordOpenChild("bat_2", (objectIndex << 4) | cameraId); D_80183E80[1] = func_800418AC(gObjectList[objectIndex].pos[0], gObjectList[objectIndex].pos[2], cam->pos); diff --git a/src/engine/objects/Boos.cpp b/src/engine/objects/Boos.cpp index f05d62be1..f41197f46 100644 --- a/src/engine/objects/Boos.cpp +++ b/src/engine/objects/Boos.cpp @@ -104,30 +104,30 @@ void OBoos::Draw(s32 cameraId) { temp_s2 = MIN(temp_s2, 0x15F91U); } - // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("Boo", (uintptr_t)&gObjectList[objectIndex]); + FrameInterpolation_RecordOpenChild("boo", (objectIndex << 4) | cameraId); if (is_obj_flag_status_active(objectIndex, VISIBLE) != 0) { func_800523B8(objectIndex, cameraId, temp_s2); } - // @port Pop the transform id. FrameInterpolation_RecordCloseChild(); } } } -void OBoos::func_800523B8(s32 objectIndex, s32 arg1, u32 arg2) { +void OBoos::func_800523B8(s32 objectIndex, s32 cameraId, u32 arg2) { UNUSED s32 pad[2]; Object* object; - Camera* camera = &camera1[arg1]; + Camera* camera = &camera1[cameraId]; object = &gObjectList[objectIndex]; object->orientation[1] = func_800418AC(object->pos[0], object->pos[2], camera->pos); func_800484BC(object->pos, object->orientation, object->sizeScaling, object->primAlpha, (u8*) object->activeTLUT, (u8*) object->activeTexture, object->vertex, 0x00000030, 0x00000028, 0x00000030, 0x00000028); if ((is_obj_flag_status_active(objectIndex, 0x00000020) != 0) && (arg2 < 0x15F91U)) { + FrameInterpolation_RecordOpenChild("boo_hoo", (objectIndex << 4) | cameraId); func_8004A630(&D_8018C830, object->pos, 0.4f); + FrameInterpolation_RecordCloseChild(); } } diff --git a/src/engine/objects/Boos.h b/src/engine/objects/Boos.h index b29757fa7..faaf35ee7 100644 --- a/src/engine/objects/Boos.h +++ b/src/engine/objects/Boos.h @@ -63,7 +63,7 @@ public: virtual void Tick() override; virtual void Draw(s32 cameraId) override; virtual void DrawEditorProperties() override; - void func_800523B8(s32 objectIndex, s32 arg1, u32 arg2); + void func_800523B8(s32 objectIndex, s32 cameraId, u32 arg2); void func_8007CA70(void); void func_8007C5B4(s32 objectIndex); diff --git a/src/engine/objects/CheepCheep.cpp b/src/engine/objects/CheepCheep.cpp index f52af62a1..f81aeb795 100644 --- a/src/engine/objects/CheepCheep.cpp +++ b/src/engine/objects/CheepCheep.cpp @@ -1,5 +1,6 @@ #include "CheepCheep.h" #include "port/Game.h" +#include "port/interpolation/FrameInterpolation.h" #include "assets/models/tracks/banshee_boardwalk/banshee_boardwalk_data.h" #include "assets/models/common_data.h" @@ -64,6 +65,7 @@ void OCheepCheep::Draw(s32 cameraId) { // func_8005217C object = &gObjectList[temp_a3]; if (object->state >= 2) { if (is_obj_flag_status_active(temp_a3, 0x10) != 0) { + FrameInterpolation_RecordOpenChild("cheep_cheep", (temp_a3 << 4) | cameraId); rsp_set_matrix_transformation(object->pos, object->direction_angle, object->sizeScaling); func_800520C0(temp_a3); @@ -80,6 +82,7 @@ void OCheepCheep::Draw(s32 cameraId) { // func_8005217C gSPLight(gDisplayListHead++, &D_800E45C0l[3].l[0], LIGHT_1); gSPLight(gDisplayListHead++, &D_800E45C0l[3].a, LIGHT_2); gSPDisplayList(gDisplayListHead++, (Gfx*) d_course_banshee_boardwalk_dl_7650); + FrameInterpolation_RecordCloseChild(); } } } diff --git a/src/engine/objects/GrandPrixBalloons.cpp b/src/engine/objects/GrandPrixBalloons.cpp index 91b41bc5f..ba1c6f003 100644 --- a/src/engine/objects/GrandPrixBalloons.cpp +++ b/src/engine/objects/GrandPrixBalloons.cpp @@ -104,7 +104,7 @@ void OGrandPrixBalloons::Draw(s32 cameraId) { } } -void OGrandPrixBalloons::func_80053D74(s32 objectIndex, UNUSED s32 arg1, s32 vertexIndex, s32 index) { +void OGrandPrixBalloons::func_80053D74(s32 objectIndex, s32 cameraId, s32 vertexIndex, s32 index) { Object* object; Vtx* vtx = (Vtx*) LOAD_ASSET_RAW(common_vtx_hedgehog); @@ -113,7 +113,7 @@ void OGrandPrixBalloons::func_80053D74(s32 objectIndex, UNUSED s32 arg1, s32 ver if (gMatrixHudCount <= MTX_HUD_POOL_SIZE_MAX) { object = &gObjectList[objectIndex]; - FrameInterpolation_RecordOpenChild("Balloon", TAG_ITEM_ADDR((objectIndex << 7 | index))); + FrameInterpolation_RecordOpenChild("balloon", TAG_ITEM_ADDR((objectIndex << 11 | (cameraId << 7) | index))); D_80183E80[2] = (s16) (object->unk_084[6] + 0x8000); rsp_set_matrix_transformation(object->pos, (u16*) D_80183E80, object->sizeScaling); diff --git a/src/engine/objects/GrandPrixBalloons.h b/src/engine/objects/GrandPrixBalloons.h index 3eb4a1dfa..e6a8045b6 100644 --- a/src/engine/objects/GrandPrixBalloons.h +++ b/src/engine/objects/GrandPrixBalloons.h @@ -39,7 +39,7 @@ public: virtual void Tick() override; virtual void Draw(s32 cameraId) override; - void func_80053D74(s32 objectIndex, UNUSED s32 arg1, s32 vertexIndex, s32 index); + void func_80053D74(s32 objectIndex, s32 cameraId, s32 vertexIndex, s32 index); void func_80074924(s32 objectIndex); void func_80074D94(s32 objectIndex); diff --git a/src/engine/objects/Lakitu.cpp b/src/engine/objects/Lakitu.cpp index 7034e610b..121191a12 100644 --- a/src/engine/objects/Lakitu.cpp +++ b/src/engine/objects/Lakitu.cpp @@ -118,8 +118,6 @@ void OLakitu::Draw(s32 cameraId) { return; } - FrameInterpolation_RecordOpenChild("Lakitu", (uintptr_t) this); - objectIndex = mLakituId; camera = &cameras[cameraId]; if (is_obj_flag_status_active(objectIndex, 0x00000010) != 0) { @@ -130,6 +128,7 @@ void OLakitu::Draw(s32 cameraId) { if (func_80072354(objectIndex, 2) != 0) { s32 width = object->textureWidth; s32 height = object->textureHeight; + FrameInterpolation_RecordOpenChild("lakitu", (_idx << 4) | cameraId); rsp_set_matrix_transformation(object->pos, object->orientation, object->sizeScaling); gSPDisplayList(gDisplayListHead++, (Gfx*) D_0D007D78); s32 heightIndex; @@ -140,10 +139,12 @@ void OLakitu::Draw(s32 cameraId) { G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); gSPVertex(gDisplayListHead++, (uintptr_t) object->vertex, 4, 0); gSPDisplayList(gDisplayListHead++, (Gfx*) common_rectangle_display); + FrameInterpolation_RecordCloseChild(); gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF); } else { s32 width = object->textureWidth; s32 height = object->textureHeight; + FrameInterpolation_RecordOpenChild("lakitu2", (_idx << 4) | cameraId); rsp_set_matrix_transformation(object->pos, object->orientation, object->sizeScaling); gSPDisplayList(gDisplayListHead++, (Gfx*) D_0D007E98); gDPSetAlphaCompare(gDisplayListHead++, G_AC_DITHER); @@ -156,6 +157,7 @@ void OLakitu::Draw(s32 cameraId) { rsp_load_texture((u8*) object->activeTexture, width, height); gSPVertex(gDisplayListHead++, (uintptr_t) object->vertex, 4, 0); gSPDisplayList(gDisplayListHead++, (Gfx*) common_rectangle_display); + FrameInterpolation_RecordCloseChild(); gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF); gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE); @@ -170,11 +172,12 @@ void OLakitu::Draw(s32 cameraId) { var_f2 = -var_f2; } if ((var_f0 + var_f2) <= 200.0) { + FrameInterpolation_RecordOpenChild("lakitu3", (_idx << 4) | cameraId); func_8004A630(&D_8018C0B0[cameraId], object->pos, 0.35f); + FrameInterpolation_RecordCloseChild(); } } } - FrameInterpolation_RecordCloseChild(); } void OLakitu::func_80079114(s32 objectIndex, s32 playerId, s32 arg2) { diff --git a/src/engine/objects/Penguin.cpp b/src/engine/objects/Penguin.cpp index 27c009489..a645b9633 100644 --- a/src/engine/objects/Penguin.cpp +++ b/src/engine/objects/Penguin.cpp @@ -137,7 +137,7 @@ void OPenguin::Draw(s32 cameraId) { //} temp_s1 = func_8008A364(objectIndex, cameraId, var_s1, drawDistance); if (is_obj_flag_status_active(objectIndex, VISIBLE) != 0) { - func_800557B4(objectIndex, (u32) temp_s1, var_s3); + func_800557B4(objectIndex, cameraId, (u32) temp_s1, var_s3); } } } diff --git a/src/engine/objects/Thwomp.cpp b/src/engine/objects/Thwomp.cpp index 054d8d534..b176dca70 100644 --- a/src/engine/objects/Thwomp.cpp +++ b/src/engine/objects/Thwomp.cpp @@ -170,8 +170,6 @@ void OThwomp::Tick60fps() { // func_80081210 if (_idx == 0) { for (var_s4 = 0; var_s4 < gObjectParticle2_SIZE; var_s4++) { - FrameInterpolation_RecordOpenChild("Thwomp_smoke", (uintptr_t) (var_s4 << 5)); - objectIndex = gObjectParticle2[var_s4]; if (objectIndex == DELETED_OBJECT_ID) { continue; @@ -184,9 +182,6 @@ void OThwomp::Tick60fps() { // func_80081210 continue; } delete_object_wrapper(&gObjectParticle2[var_s4]); - - // @port Pop the transform id. - FrameInterpolation_RecordCloseChild(); } } } @@ -732,9 +727,11 @@ void OThwomp::Draw(s32 cameraId) { if (objectIndex != NULL_OBJECT_ID) { object = &gObjectList[objectIndex]; if ((object->state > 0) && (Behaviour == States::MOVE_FAR)) { + FrameInterpolation_RecordOpenChild("thwomp_particle2", (_idx << 12) | (i << 4) | cameraId); rsp_set_matrix_transformation(object->pos, object->orientation, object->sizeScaling); gSPVertex(gDisplayListHead++, (uintptr_t) D_0D005C00, 3, 0); gSPDisplayList(gDisplayListHead++, (Gfx*) D_0D006930); + FrameInterpolation_RecordCloseChild(); } } } @@ -753,7 +750,7 @@ void OThwomp::Draw(s32 cameraId) { if ((object->state >= 2) && (Behaviour == States::MOVE_AND_ROTATE)) { func_8004B138(0x000000FF, 0x000000FF, 0x000000FF, (s32) object->primAlpha); D_80183E80[1] = func_800418AC(object->pos[0], object->pos[2], camera->pos); - FrameInterpolation_RecordOpenChild("thwomp_particle", (i << 16) | (_idx << 6) | cameraId); + FrameInterpolation_RecordOpenChild("thwomp_particle", (_idx << 12) | (i << 4) | cameraId); func_800431B0(object->pos, D_80183E80, object->sizeScaling, (Vtx*) D_0D005AE0); FrameInterpolation_RecordCloseChild(); } diff --git a/src/engine/objects/TrashBin.cpp b/src/engine/objects/TrashBin.cpp index b483a7549..75c5390fa 100644 --- a/src/engine/objects/TrashBin.cpp +++ b/src/engine/objects/TrashBin.cpp @@ -64,8 +64,7 @@ void OTrashBin::Draw(s32 cameraId) { Vec3f Pos = { _pos.x + 63, _pos.y + 12, _pos.z + 25 }; Vec3s Rot = { 0, 0x4000, 0 }; - // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("OTrashBin", (uintptr_t) object); + FrameInterpolation_RecordOpenChild("OTrashBin", (_objectIndex << 4) | cameraId); mtxf_pos_rotation_xyz(mtx, Pos, Rot); //mtxf_scale(mtx, 1.0f); @@ -73,7 +72,6 @@ void OTrashBin::Draw(s32 cameraId) { gSPDisplayList(gDisplayListHead++, BinMod); } - // @port Pop the transform id. FrameInterpolation_RecordCloseChild(); } } diff --git a/src/engine/particles/StarEmitter.cpp b/src/engine/particles/StarEmitter.cpp index fafb7a007..878990f9b 100644 --- a/src/engine/particles/StarEmitter.cpp +++ b/src/engine/particles/StarEmitter.cpp @@ -108,13 +108,11 @@ void StarEmitter::Draw(s32 cameraId) { // func_80054BE8 D_80183E80[0] = 0; for (var_s0 = 0; var_s0 < gObjectParticle3_SIZE; var_s0++) { temp_a0 = ObjectIndex[var_s0]; - // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("Ceremony Stars", (uintptr_t) &ObjectIndex[var_s0]); if ((temp_a0 != -1) && (gObjectList[temp_a0].state >= 2)) { + FrameInterpolation_RecordOpenChild("trophy_stars", (var_s0 << 4) | cameraId); StarEmitter::func_80054AFC(temp_a0, camera->pos); + FrameInterpolation_RecordCloseChild(); } - // @port Pop the transform id. - FrameInterpolation_RecordCloseChild(); } } diff --git a/src/engine/sky/SkyCloud.cpp b/src/engine/sky/SkyCloud.cpp index 2cad8b7c6..6c81cfbdd 100644 --- a/src/engine/sky/SkyCloud.cpp +++ b/src/engine/sky/SkyCloud.cpp @@ -95,7 +95,7 @@ void SkyCloud::Draw(ScreenContext* screen, s32 arg0) { // render_clouds return; } if (mVisible) { - FrameInterpolation_RecordOpenChild("render_clouds", TAG_CLOUDS((_idx << 4) | (mScreen - gScreenOneCtx))); + FrameInterpolation_RecordOpenChild("render_clouds", TAG_CLOUDS((_idx << 4) | (mScreen - gScreenContexts))); if (D_8018D228 != mCloudVariant) { D_8018D228 = mCloudVariant; diff --git a/src/engine/sky/SkySnow.cpp b/src/engine/sky/SkySnow.cpp index 7c931befe..97197a4b8 100644 --- a/src/engine/sky/SkySnow.cpp +++ b/src/engine/sky/SkySnow.cpp @@ -85,7 +85,7 @@ void SkySnow::Draw(ScreenContext* screen, s32 arg0) { // render_clouds } if (mVisible) { - FrameInterpolation_RecordOpenChild("render_snow", TAG_CLOUDS((_idx << 4) | (screen - gScreenOneCtx))); + FrameInterpolation_RecordOpenChild("render_snow", TAG_CLOUDS((_idx << 4) | (screen - gScreenContexts))); if (D_8018D228 != mCloudVariant) { D_8018D228 = mCloudVariant; diff --git a/src/engine/sky/SkyStar.cpp b/src/engine/sky/SkyStar.cpp index 7f696d7bb..928c20867 100644 --- a/src/engine/sky/SkyStar.cpp +++ b/src/engine/sky/SkyStar.cpp @@ -107,7 +107,7 @@ void SkyStar::Draw(ScreenContext* screen, s32 arg0) { // render_stars s32 posY = arg0 - mY; func_8004B414(255, 255, 255, 255); if (mVisible) { - FrameInterpolation_RecordOpenChild("render_stars", TAG_CLOUDS((_idx << 4) | (screen - gScreenOneCtx))); + FrameInterpolation_RecordOpenChild("render_stars", TAG_CLOUDS((_idx << 4) | (screen - gScreenContexts))); func_80044DA0((u8*)mTexture, mTextureWidth, mTextureHeight); diff --git a/src/engine/tracks/CustomTrack.cpp b/src/engine/tracks/CustomTrack.cpp index 9e720c4c9..52f9f9672 100644 --- a/src/engine/tracks/CustomTrack.cpp +++ b/src/engine/tracks/CustomTrack.cpp @@ -290,7 +290,7 @@ void CustomTrack::DrawTransparency(ScreenContext* screen, uint16_t pathCounter, for (TrackSections& item : mTranslucentItems) { Mat4 matrix; FVector pos = {item.location[0], item.location[1], item.location[2]}; - FrameInterpolation_RecordOpenChild("translucent_obj", item.crc); + FrameInterpolation_RecordOpenChild("translucent_obj", (item.crc << 4) | screen - gScreenContexts); ApplyMatrixTransformations(matrix, pos, IRotator(0, 0, 0), FVector(1, 1, 1)); AddObjectMatrix(matrix, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(gDisplayListHead++, (Gfx*) ResourceGetDataByCrc(item.crc)); @@ -301,9 +301,11 @@ void CustomTrack::DrawTransparency(ScreenContext* screen, uint16_t pathCounter, for (TrackSections& item : mTranslucentNoZBufferItems) { Mat4 matrix; FVector pos = {item.location[0], item.location[1], item.location[2]}; + FrameInterpolation_RecordOpenChild("translucent_no_z", (item.crc << 4) | screen - gScreenContexts); ApplyMatrixTransformations(matrix, pos, IRotator(0, 0, 0), FVector(1, 1, 1)); AddObjectMatrix(matrix, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(gDisplayListHead++, (Gfx*) ResourceGetDataByCrc(item.crc)); + FrameInterpolation_RecordCloseChild(); } gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER); } diff --git a/src/racing/actors.c b/src/racing/actors.c index 04bb2fe2e..5482a08ec 100644 --- a/src/racing/actors.c +++ b/src/racing/actors.c @@ -547,7 +547,7 @@ void render_cows(Camera* camera, Mat4 arg1) { arg1[3][1] = sp88[1]; arg1[3][2] = sp88[2]; - FrameInterpolation_RecordOpenChild("render_actor_cow", TAG_ITEM_ADDR((i << 5) | (camera - cameras))); + FrameInterpolation_RecordOpenChild("render_actor_cow", TAG_ITEM_ADDR((i << 4) | (camera - cameras))); if ((gMatrixObjectCount < MTX_OBJECT_POOL_SIZE) && (render_set_position(arg1, 0) != 0)) { switch (var_s1->someId) { @@ -684,7 +684,7 @@ void render_palm_trees(Camera* camera, Mat4 arg1) { var_s1++; continue; } - FrameInterpolation_RecordOpenChild("render_palm_tree", TAG_ITEM_ADDR((i << 5) | (camera - cameras))); + FrameInterpolation_RecordOpenChild("render_palm_tree", TAG_ITEM_ADDR((i << 4) | (camera - cameras))); test &= 0xF; test = (s16) test; @@ -737,7 +737,13 @@ void render_actor_shell(Camera* camera, Mat4 matrix, struct ShellActor* shell) { char* phi_t3; bool reverseShell = false; - FrameInterpolation_RecordOpenChild("shell", TAG_ITEM_ADDR(((( (struct Actor*)shell ) - gActorList) << 5) | (camera - cameras))); + size_t actorIdx = CM_FindActorIndex((struct Actor*)shell); + if (-1 == actorIdx) { + printf("[render_actor_shell] Could not find actor index for FI, skipping!\n"); + return; + } + + FrameInterpolation_RecordOpenChild("shell", TAG_ITEM_ADDR(((actorIdx << 4) | (camera - cameras)))); f32 temp_f0 = is_within_render_distance(camera->pos, shell->pos, camera->rot[1], 0, camera->fieldOfView, 490000.0f); diff --git a/src/racing/skybox_and_splitscreen.c b/src/racing/skybox_and_splitscreen.c index fba19a45b..825150f83 100644 --- a/src/racing/skybox_and_splitscreen.c +++ b/src/racing/skybox_and_splitscreen.c @@ -664,7 +664,7 @@ void render_screens(ScreenContext* screen, s32 mode, s32 someId, s32 playerId) { CM_SetViewProjection(camera); // Create a matrix for the track and game objects - FrameInterpolation_RecordOpenChild("track", TAG_TRACK((camera->cameraId | (playerId << 2)))); + FrameInterpolation_RecordOpenChild("track", TAG_TRACK(((playerId << 4) | camera->cameraId))); Mat4 trackMatrix; mtxf_identity(trackMatrix); if (gIsMirrorMode != 0) { diff --git a/src/render_objects.c b/src/render_objects.c index 01f380bfa..2a0961a03 100644 --- a/src/render_objects.c +++ b/src/render_objects.c @@ -2635,7 +2635,6 @@ void draw_simplified_lap_count(s32 playerId) { } void func_8004E800(s32 playerId) { - // @port: Tag the transform. FrameInterpolation_RecordOpenChild("Player place HUD", playerId); if (playerHUD[playerId].unk_81 != 0) { if (playerHUD[playerId].lapCount != 3) { @@ -2652,7 +2651,6 @@ void func_8004E800(s32 playerId) { 0x00000040, 0x00000080, 0x00000040); } } - // @port Pop the transform id. FrameInterpolation_RecordCloseChild(); } @@ -3099,8 +3097,7 @@ void func_80050320(void) { var_a0 = 1; } - // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("ranking portraits", i | var_a0 << 16); + FrameInterpolation_RecordOpenChild("ranking_portraits", (var_a0 << 4) | i); temp_v0 = gGPCurrentRacePlayerIdByRank[i]; characterId = gGPCurrentRaceCharacterIdByRank[i]; @@ -3111,7 +3108,6 @@ void func_80050320(void) { func_8004FDB4(D_8018D028[i], D_8018D050[i], i, lapCount, characterId, D_8018D3E0, 0, var_a0, 0); } - // @port Pop the transform id. FrameInterpolation_RecordCloseChild(); } } @@ -3123,8 +3119,7 @@ void func_80050320(void) { var_a0 = 1; } - // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("ranking portraits 2", i | var_a0 << 16); + FrameInterpolation_RecordOpenChild("ranking_portraits2", (var_a0 << 4) | i); temp_v0 = gGPCurrentRacePlayerIdByRank[i]; // ???? @@ -3136,7 +3131,6 @@ void func_80050320(void) { func_8004FDB4(D_8018D028[i], D_8018D050[i], i, lapCount, characterId, 0x000000FF, 0, var_a0, 1); } - // @port Pop the transform id. FrameInterpolation_RecordCloseChild(); } } @@ -3435,8 +3429,7 @@ void render_object_leaf_particle(UNUSED s32 cameraId) { for (i = 0; i < gLeafParticle_SIZE; i++) { leafIndex = gLeafParticle[i]; - // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("Leaves", leafIndex); + FrameInterpolation_RecordOpenChild("leaves", (leafIndex << 4) | cameraId); if (leafIndex != -1) { object = &gObjectList[leafIndex]; @@ -3446,14 +3439,13 @@ void render_object_leaf_particle(UNUSED s32 cameraId) { } } - // @port Pop the transform id. FrameInterpolation_RecordCloseChild(); } gSPSetGeometryMode(gDisplayListHead++, G_CULL_BACK); gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF); } -void render_object_snowflakes_particles(void) { +void render_object_snowflakes_particles(s32 cameraId) { size_t i; s32 snowflakeIndex; @@ -3463,15 +3455,13 @@ void render_object_snowflakes_particles(void) { for (i = 0; i < NUM_SNOWFLAKES; i++) { snowflakeIndex = gObjectParticle1[i]; - // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("SnowFlakes", snowflakeIndex); + FrameInterpolation_RecordOpenChild("snowFlakes", (snowflakeIndex << 4) | cameraId); if (gObjectList[snowflakeIndex].state >= 2) { rsp_set_matrix_gObjectList(snowflakeIndex); gSPDisplayList(gDisplayListHead++, D_0D006980); } - // @port Pop the transform id. FrameInterpolation_RecordCloseChild(); } gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF); @@ -3578,20 +3568,22 @@ void func_800520C0(s32 arg0) { } } -void func_8005285C(s32 arg0) { +void func_8005285C(s32 cameraId, s32 playerId) { Player* temp_v0; - temp_v0 = &gPlayerOne[arg0]; + temp_v0 = &gPlayerOne[playerId]; D_80183E40[0] = temp_v0->pos[0]; D_80183E40[1] = temp_v0->pos[1]; D_80183E40[2] = temp_v0->pos[2]; D_80183E80[0] = 0; D_80183E80[1] = 0; D_80183E80[2] = 0; + FrameInterpolation_RecordOpenChild("ice_block", (playerId << 4) | cameraId); func_80043500(D_80183E40, D_80183E80, 0.02f, d_course_sherbet_land_dl_ice_block); + FrameInterpolation_RecordCloseChild(); } -void func_800528EC(s32 playerId) { +void func_800528EC(s32 cameraId) { s32 var_s3; s32 objectIndex; Object* object; @@ -3614,9 +3606,11 @@ void func_800528EC(s32 playerId) { if (objectIndex != NULL_OBJECT_ID) { object = &gObjectList[objectIndex]; if (object->state > 0) { + FrameInterpolation_RecordOpenChild("ice_block2", (var_s3 << 4) | cameraId); rsp_set_matrix_transformation(object->pos, D_80183E80, object->sizeScaling); gSPVertex(gDisplayListHead++, D_0D005BD0, 3, 0); gSPDisplayList(gDisplayListHead++, D_0D006930); + FrameInterpolation_RecordCloseChild(); } } } @@ -3625,11 +3619,13 @@ void func_800528EC(s32 playerId) { objectIndex = gObjectParticle2[var_s3]; if (objectIndex != NULL_OBJECT_ID) { object = &gObjectList[objectIndex]; - if ((object->state > 0) && (playerId == object->unk_084[7]) && + if ((object->state > 0) && (cameraId == object->unk_084[7]) && (gMatrixHudCount <= MTX_HUD_POOL_SIZE_MAX)) { + FrameInterpolation_RecordOpenChild("ice_block3", (var_s3 << 4) | cameraId); rsp_set_matrix_transformation(object->pos, D_80183E80, object->sizeScaling); gSPVertex(gDisplayListHead++, D_0D005BD0, 3, 0); gSPDisplayList(gDisplayListHead++, D_0D006930); + FrameInterpolation_RecordCloseChild(); } } } @@ -3639,7 +3635,7 @@ void func_800528EC(s32 playerId) { gSPTexture(gDisplayListHead++, 0x0001, 0x0001, 0, G_TX_RENDERTILE, G_OFF); } -void render_ice_block(s32 playerId) { +void render_ice_block(s32 cameraId) { s32 objectIndex; // Lights1 D_800E4620l = *(Lights1 *) LOAD_ASSET(D_800E4620); D_800E4620.l[0].l.dir[0] = D_80165840[0]; @@ -3651,14 +3647,14 @@ void render_ice_block(s32 playerId) { objectIndex = gIndexLakituList[i]; if (objectIndex) {} if (func_80072320(objectIndex, 4) != false) { - func_8005285C(i); + func_8005285C(cameraId, i); } func_80072320(objectIndex, 0x00000010); } - func_800528EC(playerId); + func_800528EC(cameraId); } -void func_80052D70(s32 playerId) { +void func_80052D70(s32 cameraId, s32 playerId) { s32 test; Player* temp_v1; @@ -3668,11 +3664,13 @@ void func_80052D70(s32 playerId) { D_80183E40[0] = temp_v1->pos[0]; D_80183E40[1] = temp_v1->unk_074 - 6.5; D_80183E40[2] = temp_v1->pos[2]; + FrameInterpolation_RecordOpenChild("some_snow_thing", (playerId << 4) | cameraId); func_800435A0(D_80183E40, (u16*) D_80183E80, 0.02f, d_course_sherbet_land_dl_ice_block, 0x000000FF); + FrameInterpolation_RecordCloseChild(); } } -void func_80052E30(UNUSED s32 arg0) { +void func_80052E30(s32 cameraId) { s32 var_s0; D_800E4620.l[0].l.dir[0] = D_80165840[0]; D_800E4620.l[0].l.dir[1] = D_80165840[1]; @@ -3684,7 +3682,7 @@ void func_80052E30(UNUSED s32 arg0) { D_80183E80[2] = 0; if (gPlayerCount == 1) { for (var_s0 = 0; var_s0 < gPlayerCountSelection1; var_s0++) { - func_80052D70(var_s0); + func_80052D70(cameraId, var_s0); } } } @@ -3800,8 +3798,7 @@ void render_object_bowser_flame_particle(s32 objectIndex, s32 cameraId) { if (gMatrixHudCount <= MTX_HUD_POOL_SIZE_MAX) { object = &gObjectList[objectIndex]; - // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("Bowser Statue Flame", TAG_ITEM_ADDR(object)); + FrameInterpolation_RecordOpenChild("bowser_statue_flame", TAG_ITEM_ADDR((objectIndex << 4) | cameraId)); if (object->unk_0D5 == 9) { func_8004B72C(0xFF, (s32) object->type, 0, (s32) object->unk_0A2, 0, 0, (s32) object->primAlpha); } else { @@ -3810,7 +3807,6 @@ void render_object_bowser_flame_particle(s32 objectIndex, s32 cameraId) { D_80183E80[1] = func_800418AC(object->pos[0], object->pos[2], camera->pos); func_800431B0(object->pos, D_80183E80, object->sizeScaling, D_0D005AE0); - // @port Pop the transform id. FrameInterpolation_RecordCloseChild(); } } @@ -3873,8 +3869,8 @@ void render_object_smoke_particles(s32 cameraId) { objectIndex = gObjectParticle4[i]; if (objectIndex != NULL_OBJECT_ID) { object = &gObjectList[objectIndex]; - // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("SmokeParticles", (uintptr_t) object); + + FrameInterpolation_RecordOpenChild("smokes_particles", (uintptr_t) (objectIndex << 4) | cameraId); if (object->state >= 2) { if (object->unk_0D8 == 3) { func_8008A364(objectIndex, cameraId, 0x4000U, 0x00000514); @@ -3885,7 +3881,6 @@ void render_object_smoke_particles(s32 cameraId) { func_8005477C(objectIndex, object->unk_0D8, sp54->pos); } } - // @port Pop the transform id. FrameInterpolation_RecordCloseChild(); } } @@ -3894,14 +3889,13 @@ void render_object_smoke_particles(s32 cameraId) { UNUSED void func_800557AC() { } -void func_800557B4(s32 objectIndex, u32 arg1, u32 arg2) { +void func_800557B4(s32 objectIndex, s32 cameraId, u32 arg1, u32 arg2) { Vec3f sp34; Object* object; object = &gObjectList[objectIndex]; - // @port: Tag the transform. - FrameInterpolation_RecordOpenChild("Penguin", (uintptr_t) object); + FrameInterpolation_RecordOpenChild("penguin", (objectIndex << 4) | cameraId); if (object->state >= 2) { if (is_obj_flag_status_active(objectIndex, 0x00000020) != 0) { if (func_80072320(objectIndex, 4) != 0) { @@ -3925,7 +3919,6 @@ void func_800557B4(s32 objectIndex, u32 arg1, u32 arg2) { (s16) object->textureListIndex); } - // @port Pop the transform id. FrameInterpolation_RecordCloseChild(); } @@ -3956,7 +3949,7 @@ void render_object_neon(s32 cameraId) { objectIndex = indexObjectList1[i]; if (D_8018E838[cameraId] == 0) { object = &gObjectList[objectIndex]; - FrameInterpolation_RecordOpenChild(object, TAG_OBJECT((objectIndex << 8) + i)); + FrameInterpolation_RecordOpenChild("neon_sign", TAG_OBJECT((objectIndex << 8) | (cameraId << 4) | i)); if ((object->state >= 2) && (is_obj_index_flag_status_inactive(objectIndex, 0x00080000) != 0) && (is_object_visible_on_camera(objectIndex, camera, 0x2AABU) != 0)) { object->orientation[1] = angle_between_object_camera(objectIndex, camera); diff --git a/src/render_objects.h b/src/render_objects.h index ce385d2e5..78db7ef4d 100644 --- a/src/render_objects.h +++ b/src/render_objects.h @@ -317,7 +317,7 @@ void func_80050E34(s32, s32); void func_800514BC(void); void render_object_leaf_particle(s32); -void render_object_snowflakes_particles(void); +void render_object_snowflakes_particles(s32 cameraId); void func_80051ABC(ScreenContext* screen, s16, s32); void func_80051C60(ScreenContext* screen, s16, s32); void func_80051EBC(ScreenContext* screen); @@ -327,10 +327,10 @@ void func_80052044(ScreenContext* screen); void func_80052080(ScreenContext* screen); void func_800520C0(s32); -void func_8005285C(s32); +void func_8005285C(s32, s32); void func_800528EC(s32); void render_ice_block(s32); -void func_80052D70(s32); +void func_80052D70(s32, s32); void func_80052E30(s32); void render_object_snowmans_list_2(s32); @@ -359,7 +359,7 @@ void func_80055228(s32); void render_object_seagulls(s32); void render_object_crabs(s32); void func_800557AC(void); -void func_800557B4(s32, u32, u32); +void func_800557B4(s32, s32, u32, u32); void func_80055AB8(s32, s32); void render_object_chain_chomps(s32); void func_80055EF4(s32, s32);