summaryrefslogtreecommitdiff
path: root/src/engine
diff options
context:
space:
mode:
authorMegaMech <MegaMech@users.noreply.github.com>2026-03-06 20:10:07 -0700
committerGitHub <noreply@github.com>2026-03-06 20:10:07 -0700
commit132357d9fb50d7962518e10b22db358c85d87ba5 (patch)
tree428671c5f9d888bb6905fe20c07d26a70430b392 /src/engine
parent25d49df90fe1ab2c95c962d45ef146cb5cf0c794 (diff)
Big Interpolation Overhaul (#674)
* Fix FI * FI statue * Intepr fixes * Improve * More interp * Fix compile * More interp * Fix text
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/Smoke.cpp4
-rw-r--r--src/engine/actors/BowserStatue.cpp6
-rw-r--r--src/engine/actors/BowserStatue.h2
-rw-r--r--src/engine/actors/FallingRock.cpp8
-rw-r--r--src/engine/actors/FallingRock.h3
-rw-r--r--src/engine/actors/Finishline.cpp5
-rw-r--r--src/engine/actors/Finishline.h1
-rw-r--r--src/engine/actors/MarioSign.cpp7
-rw-r--r--src/engine/actors/MarioSign.h7
-rw-r--r--src/engine/actors/Text.cpp2
-rw-r--r--src/engine/actors/WarioSign.cpp7
-rw-r--r--src/engine/actors/WarioSign.h7
-rw-r--r--src/engine/objects/Bat.cpp4
-rw-r--r--src/engine/objects/Boos.cpp10
-rw-r--r--src/engine/objects/Boos.h2
-rw-r--r--src/engine/objects/CheepCheep.cpp3
-rw-r--r--src/engine/objects/GrandPrixBalloons.cpp4
-rw-r--r--src/engine/objects/GrandPrixBalloons.h2
-rw-r--r--src/engine/objects/Lakitu.cpp9
-rw-r--r--src/engine/objects/Penguin.cpp2
-rw-r--r--src/engine/objects/Thwomp.cpp9
-rw-r--r--src/engine/objects/TrashBin.cpp4
-rw-r--r--src/engine/particles/StarEmitter.cpp6
-rw-r--r--src/engine/sky/SkyCloud.cpp2
-rw-r--r--src/engine/sky/SkySnow.cpp2
-rw-r--r--src/engine/sky/SkyStar.cpp2
-rw-r--r--src/engine/tracks/CustomTrack.cpp4
27 files changed, 77 insertions, 47 deletions
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<ABowserStatue::Behaviour>(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);
}