summaryrefslogtreecommitdiff
path: root/src/engine/objects
diff options
context:
space:
mode:
authorSonic Dreamcaster <alejandro.asenjo88@gmail.com>2025-05-20 03:32:28 -0300
committerSonic Dreamcaster <alejandro.asenjo88@gmail.com>2025-05-20 03:32:28 -0300
commite3185e0caf3bb618ebc7b1ed862f1714054a1350 (patch)
tree079e779703a83bc49238cdb80de49b9433c656f6 /src/engine/objects
parent23e53566f08067f4fad75c7463d37e82ae4641a3 (diff)
tag Snowman interpolation
Diffstat (limited to 'src/engine/objects')
-rw-r--r--src/engine/objects/Snowman.cpp59
1 files changed, 39 insertions, 20 deletions
diff --git a/src/engine/objects/Snowman.cpp b/src/engine/objects/Snowman.cpp
index 12beb9e47..7cbfc691d 100644
--- a/src/engine/objects/Snowman.cpp
+++ b/src/engine/objects/Snowman.cpp
@@ -11,6 +11,7 @@ extern "C" {
#include "code_80086E70.h"
#include "code_80057C60.h"
}
+#include "port/interpolation/FrameInterpolation.h"
static const char* sSnowmanHeadList[] = { d_course_frappe_snowland_snowman_head };
@@ -27,7 +28,7 @@ OSnowman::OSnowman(const FVector& pos) {
gObjectList[_headIndex].origin_pos[0] = pos.x * xOrientation;
gObjectList[_headIndex].origin_pos[1] = pos.y + 5.0 + 3.0;
gObjectList[_headIndex].origin_pos[2] = pos.z;
- gObjectList[_headIndex].pos[0] = pos.x * xOrientation;
+ gObjectList[_headIndex].pos[0] = pos.x * xOrientation;
gObjectList[_headIndex].pos[1] = pos.y + 5.0 + 3.0;
gObjectList[_headIndex].pos[2] = pos.z;
@@ -38,7 +39,7 @@ OSnowman::OSnowman(const FVector& pos) {
gObjectList[_bodyIndex].origin_pos[2] = pos.z;
gObjectList[_bodyIndex].unk_0D5 = 0; // Section Id no longer used.
- gObjectList[_bodyIndex].pos[0] = pos.x * xOrientation;
+ gObjectList[_bodyIndex].pos[0] = pos.x * xOrientation;
gObjectList[_bodyIndex].pos[1] = pos.y + 3.0;
gObjectList[_bodyIndex].pos[2] = pos.z;
@@ -71,14 +72,15 @@ void OSnowman::Tick() {
}
}
- //for (var_s0 = 0; var_s0 < NUM_SNOWMEN; var_s0++) {
+ // for (var_s0 = 0; var_s0 < NUM_SNOWMEN; var_s0++) {
var_s4 = _bodyIndex;
var_s3 = _headIndex;
OSnowman::func_80083A94(var_s3); // snowman head
OSnowman::func_80083C04(var_s4); // snowman body
if (is_obj_index_flag_status_inactive(var_s4, 0x00001000) != 0) {
object = &gObjectList[var_s4];
- if ((are_players_in_course_section(object->unk_0D5 - 1, object->unk_0D5 + 1) != 0) && (func_80089B50(var_s4) != 0)) {
+ if ((are_players_in_course_section(object->unk_0D5 - 1, object->unk_0D5 + 1) != 0) &&
+ (func_80089B50(var_s4) != 0)) {
set_object_flag(var_s4, 0x00001000);
clear_object_flag(var_s4, 0x00000010);
func_800726CC(var_s4, 0x0000000A);
@@ -93,6 +95,7 @@ void OSnowman::Tick() {
}
void OSnowman::Draw(s32 cameraId) {
+
OSnowman::DrawHead(cameraId);
OSnowman::DrawBody(cameraId);
}
@@ -117,23 +120,29 @@ void OSnowman::DrawHead(s32 cameraId) {
if (gObjectList[objectIndex].state >= 2) {
func_8008A364(objectIndex, cameraId, 0x2AABU, 0x00000258);
if (is_obj_flag_status_active(objectIndex, VISIBLE) != 0) {
+
+ // @port: Tag the transform.
+ FrameInterpolation_RecordOpenChild("OSnowman::DrawHead", (uintptr_t) &gObjectList[objectIndex]);
+
D_80183E80[0] = (s16) gObjectList[objectIndex].orientation[0];
D_80183E80[1] =
func_800418AC(gObjectList[objectIndex].pos[0], gObjectList[objectIndex].pos[2], camera->pos);
D_80183E80[2] = (u16) gObjectList[objectIndex].orientation[2];
if (is_obj_flag_status_active(objectIndex, 0x00000010) != 0) {
draw_2d_texture_at(gObjectList[objectIndex].pos, (u16*) D_80183E80,
- gObjectList[objectIndex].sizeScaling, (u8*) gObjectList[objectIndex].activeTLUT,
- (u8*)gObjectList[objectIndex].activeTexture, gObjectList[objectIndex].vertex,
- 0x00000040, 0x00000040, 0x00000040, 0x00000020);
+ gObjectList[objectIndex].sizeScaling, (u8*) gObjectList[objectIndex].activeTLUT,
+ (u8*) gObjectList[objectIndex].activeTexture, gObjectList[objectIndex].vertex,
+ 0x00000040, 0x00000040, 0x00000040, 0x00000020);
}
objectIndex = _headIndex;
D_80183E80[0] = (s16) gObjectList[objectIndex].orientation[0];
D_80183E80[2] = (u16) gObjectList[objectIndex].orientation[2];
- draw_2d_texture_at(gObjectList[objectIndex].pos, (u16*) D_80183E80,
- gObjectList[objectIndex].sizeScaling, (u8*) gObjectList[objectIndex].activeTLUT,
- (u8*)gObjectList[objectIndex].activeTexture, gObjectList[objectIndex].vertex, 0x00000040,
- 0x00000040, 0x00000040, 0x00000020);
+ draw_2d_texture_at(gObjectList[objectIndex].pos, (u16*) D_80183E80, gObjectList[objectIndex].sizeScaling,
+ (u8*) gObjectList[objectIndex].activeTLUT, (u8*) gObjectList[objectIndex].activeTexture,
+ gObjectList[objectIndex].vertex, 0x00000040, 0x00000040, 0x00000040, 0x00000020);
+
+ // @port Pop the transform id.
+ FrameInterpolation_RecordCloseChild();
}
}
}
@@ -146,7 +155,8 @@ void OSnowman::DrawBody(s32 cameraId) {
Object* object;
sp44 = &camera1[cameraId];
- load_texture_and_tlut((u8*)d_course_frappe_snowland_snow_tlut, (u8*)d_course_frappe_snowland_snow, 0x00000020, 0x00000020);
+ load_texture_and_tlut((u8*) d_course_frappe_snowland_snow_tlut, (u8*) d_course_frappe_snowland_snow, 0x00000020,
+ 0x00000020);
//! @todo quick hack to add the snow particles on hit. Need to separate into its own class
if (_idx == 0) {
@@ -157,9 +167,16 @@ void OSnowman::DrawBody(s32 cameraId) {
if (object->state > 0) {
func_8008A364(objectIndex, cameraId, 0x2AABU, 0x000001F4);
if (is_obj_flag_status_active(objectIndex, VISIBLE) != 0) {
+
+ // @port: Tag the transform.
+ FrameInterpolation_RecordOpenChild("OSnowman::DrawBody", (uintptr_t) object);
+
object->orientation[1] = func_800418AC(object->pos[0], object->pos[2], sp44->pos);
rsp_set_matrix_gObjectList(objectIndex);
- gSPDisplayList(gDisplayListHead++, (Gfx*)D_0D0069E0);
+ gSPDisplayList(gDisplayListHead++, (Gfx*) D_0D0069E0);
+
+ // @port Pop the transform id.
+ FrameInterpolation_RecordCloseChild();
}
}
}
@@ -215,7 +232,8 @@ void OSnowman::func_80083BE4(s32 objectIndex) {
void OSnowman::func_80083868(s32 objectIndex) {
Object* object;
Vtx* vtx = (Vtx*) LOAD_ASSET_RAW(D_0D0061B0);
- init_texture_object(objectIndex, (u8*)d_course_frappe_snowland_snowman_tlut, (const char**)sSnowmanHeadList, 0x40U, (u16) 0x00000040);
+ init_texture_object(objectIndex, (u8*) d_course_frappe_snowland_snowman_tlut, (const char**) sSnowmanHeadList,
+ 0x40U, (u16) 0x00000040);
object = &gObjectList[objectIndex];
object->vertex = vtx;
object->sizeScaling = 0.1f;
@@ -259,7 +277,8 @@ void OSnowman::func_80083948(s32 objectIndex) {
break;
}
object_calculate_new_pos_offset(objectIndex);
- OSnowman::func_80073D0C(objectIndex, &gObjectList[objectIndex].primAlpha, -0x00001000, 0x00001000, 0x00000400, 1, -1);
+ OSnowman::func_80073D0C(objectIndex, &gObjectList[objectIndex].primAlpha, -0x00001000, 0x00001000, 0x00000400, 1,
+ -1);
gObjectList[objectIndex].orientation[2] = gObjectList[objectIndex].primAlpha + 0x8000;
}
@@ -285,7 +304,8 @@ static const char* sSnowmanBodyList[] = { d_course_frappe_snowland_snowman_body
void OSnowman::func_80083B0C(s32 objectIndex) {
Vtx* vtx = (Vtx*) LOAD_ASSET_RAW(common_vtx_hedgehog);
- init_texture_object(objectIndex, (u8*)d_course_frappe_snowland_snowman_tlut, (const char**)sSnowmanBodyList, 0x40U, (u16) 0x00000040);
+ init_texture_object(objectIndex, (u8*) d_course_frappe_snowland_snowman_tlut, (const char**) sSnowmanBodyList,
+ 0x40U, (u16) 0x00000040);
gObjectList[objectIndex].vertex = vtx;
gObjectList[objectIndex].sizeScaling = 0.1f;
gObjectList[objectIndex].textureListIndex = 0;
@@ -299,16 +319,15 @@ void OSnowman::func_80083B0C(s32 objectIndex) {
set_object_flag(objectIndex, 0x04000210);
}
-
void OSnowman::func_80083538(s32 objectIndex, Vec3f arg1, s32 arg2, s32 arg3) {
Object* object;
init_object(objectIndex, 0);
object = &gObjectList[objectIndex];
- object->activeTexture = (const char*)d_course_frappe_snowland_snow;
- object->textureList = (const char**)d_course_frappe_snowland_snow;
+ object->activeTexture = (const char*) d_course_frappe_snowland_snow;
+ object->textureList = (const char**) d_course_frappe_snowland_snow;
object->activeTLUT = d_course_frappe_snowland_snow_tlut;
- object->tlutList = (u8*)d_course_frappe_snowland_snow_tlut;
+ object->tlutList = (u8*) d_course_frappe_snowland_snow_tlut;
object->sizeScaling = random_int(0x0064U);
object->sizeScaling = (object->sizeScaling * 0.001) + 0.05;
object->velocity[1] = random_int(0x0014U);