summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSonic Dreamcaster <alejandro.asenjo88@gmail.com>2025-05-20 21:50:52 -0300
committerSonic Dreamcaster <alejandro.asenjo88@gmail.com>2025-05-20 21:50:52 -0300
commita33f296e0f0b55106d5f4744798e00b2fffd7620 (patch)
tree1b7904596e2485a3b75a49d04276f0ab747277ad
parent64e2a39b446cd358181c0350660e98423d0914f1 (diff)
better object interpolation
-rw-r--r--src/math_util_2.c53
-rw-r--r--src/math_util_2.h2
-rw-r--r--src/render_objects.c24
3 files changed, 54 insertions, 25 deletions
diff --git a/src/math_util_2.c b/src/math_util_2.c
index e4fc571d5..b113c6a5d 100644
--- a/src/math_util_2.c
+++ b/src/math_util_2.c
@@ -690,13 +690,13 @@ UNUSED void func_800421FC(s32 x, s32 y, f32 scale) {
void func_80042330(s32 x, s32 y, u16 angle, f32 scale) {
Mat4 matrix;
- //printf("panel %d %d %d\n", x, (s32)OTRGetDimensionFromLeftEdge(x), (s32)OTRGetDimensionFromLeftEdge(0));
+ // printf("panel %d %d %d\n", x, (s32)OTRGetDimensionFromLeftEdge(x), (s32)OTRGetDimensionFromLeftEdge(0));
if (gHUDModes != 2) {
if (x < (SCREEN_WIDTH / 2)) {
- x = (s32)OTRGetDimensionFromLeftEdge(x);
+ x = (s32) OTRGetDimensionFromLeftEdge(x);
} else {
- x = (s32)OTRGetDimensionFromRightEdge(x);
+ x = (s32) OTRGetDimensionFromRightEdge(x);
}
}
@@ -710,7 +710,7 @@ void func_80042330(s32 x, s32 y, u16 angle, f32 scale) {
void func_80042330_unchanged(s32 x, s32 y, u16 angle, f32 scale) {
Mat4 matrix;
- //printf("panel %d %d %d\n", x, (s32)OTRGetDimensionFromLeftEdge(x), (s32)OTRGetDimensionFromLeftEdge(0));
+ // printf("panel %d %d %d\n", x, (s32)OTRGetDimensionFromLeftEdge(x), (s32)OTRGetDimensionFromLeftEdge(0));
mtxf_translation_x_y_rotate_z_scale_x_y(matrix, x, y, angle, scale);
// convert_to_fixed_point_matrix(&gGfxPool->mtxHud[gMatrixHudCount], matrix);
@@ -723,13 +723,13 @@ void func_80042330_unchanged(s32 x, s32 y, u16 angle, f32 scale) {
// Allows a different way of lining up the portraits at the end of race sequence
void func_80042330_portrait(s32 x, s32 y, u16 angle, f32 scale, s16 lapCount) {
Mat4 matrix;
- //printf("panel %d %d %d\n", x, (s32)OTRGetDimensionFromLeftEdge(x), (s32)OTRGetDimensionFromLeftEdge(0));
+ // printf("panel %d %d %d\n", x, (s32)OTRGetDimensionFromLeftEdge(x), (s32)OTRGetDimensionFromLeftEdge(0));
if ((gHUDModes != 2) && (D_801657E2 == 0) || (CVarGetInteger("gImprovements", 0) == true)) {
if (x < (SCREEN_WIDTH / 2)) {
- x = (s32)OTRGetDimensionFromLeftEdge(x);
+ x = (s32) OTRGetDimensionFromLeftEdge(x);
} else {
- x = (s32)OTRGetDimensionFromRightEdge(x);
+ x = (s32) OTRGetDimensionFromRightEdge(x);
}
}
@@ -745,9 +745,9 @@ void func_80042330_wide(s32 x, s32 y, u16 angle, f32 scale) {
Mat4 matrix;
if (x < (SCREEN_WIDTH / 2)) {
- x = (s32)OTRGetDimensionFromLeftEdge(x);
+ x = (s32) OTRGetDimensionFromLeftEdge(x);
} else {
- x = (s32)OTRGetDimensionFromRightEdge(x);
+ x = (s32) OTRGetDimensionFromRightEdge(x);
}
mtxf_translation_x_y_rotate_z_scale_x_y(matrix, x, y, angle, scale);
@@ -808,8 +808,7 @@ UNUSED void func_8004252C(Mat4 arg0, u16 arg1, u16 arg2) {
arg0[2][2] = sp28 * cos_theta_y;
}
-void mtxf_set_matrix_transformation(Mat4 transformMatrix, Vec3f location, Vec3su rotation,
- f32 scale) {
+void mtxf_set_matrix_transformation(Mat4 transformMatrix, Vec3f location, Vec3su rotation, f32 scale) {
FrameInterpolation_RecordSetMatrixTransformation(transformMatrix, location, rotation, scale);
f32 sinX = sins(rotation[0]);
@@ -864,7 +863,13 @@ void mtxf_set_matrix_scale_transl(Mat4 transformMatrix, Vec3f vec1, Vec3f vec2,
* @param arg1
**/
-void mtxf_set_matrix_gObjectList(s32 objectIndex, Mat4 transformMatrix) {
+struct ObjectInterpData2 {
+ s32 objectIndex;
+ f32 x, y;
+};
+struct ObjectInterpData2 prevObject2[OBJECT_LIST_SIZE] = { 0 };
+
+s32 mtxf_set_matrix_gObjectList(s32 objectIndex, Mat4 transformMatrix) {
f32 sinX;
Object* object = &gObjectList[objectIndex];
f32 sinY;
@@ -896,6 +901,26 @@ void mtxf_set_matrix_gObjectList(s32 objectIndex, Mat4 transformMatrix) {
transformMatrix[1][3] = 0.0f;
transformMatrix[2][3] = 0.0f;
transformMatrix[3][3] = 1.0f;
+
+ // Search all recorded objects for the one we're drawing
+ for (int i = 0; i < OBJECT_LIST_SIZE; i++) {
+ if (objectIndex == prevObject2[i].objectIndex) {
+ // Coincidence!
+ // Skip drawing the object this frame if it warped to the other side of the screen
+ if ((fabsf(object->pos[0] - prevObject2[i].x) > 20) || (fabsf(object->pos[1] - prevObject2[i].y) > 20)) {
+ prevObject2[objectIndex].x = object->pos[0];
+ prevObject2[objectIndex].y = object->pos[1];
+ prevObject2[objectIndex].objectIndex = objectIndex;
+ // printf("IDX: %d X: %f Y: %f Z: %f\n", objectIndex, object->pos[0], object->pos[1], object->pos[2]);
+ return 1;
+ }
+ }
+ }
+ prevObject2[objectIndex].x = object->pos[0];
+ prevObject2[objectIndex].y = object->pos[1];
+ prevObject2[objectIndex].objectIndex = objectIndex;
+
+ return 0;
}
UNUSED void mtxf_mult_first_column(Mat4 arg0, f32 arg1) {
@@ -1065,7 +1090,9 @@ void rsp_set_matrix_transl_rot_scale(Vec3f arg0, Vec3f arg1, f32 arg2) {
void rsp_set_matrix_gObjectList(s32 transformIndex) {
Mat4 matrix;
- mtxf_set_matrix_gObjectList(transformIndex, matrix);
+ if (mtxf_set_matrix_gObjectList(transformIndex, matrix)) {
+ return;
+ }
// convert_to_fixed_point_matrix(&gGfxPool->mtxHud[gMatrixHudCount], matrix);
// gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gGfxPool->mtxHud[gMatrixHudCount++]),
diff --git a/src/math_util_2.h b/src/math_util_2.h
index 5d0837dd9..52b436301 100644
--- a/src/math_util_2.h
+++ b/src/math_util_2.h
@@ -76,7 +76,7 @@ void func_80042330_portrait(s32, s32, u16, f32, s16);
void func_80042330_wide(s32, s32, u16, f32);
void mtxf_set_matrix_transformation(Mat4, Vec3f, Vec3su, f32);
void mtxf_set_matrix_scale_transl(Mat4, Vec3f, Vec3f, f32);
-void mtxf_set_matrix_gObjectList(s32, Mat4);
+s32 mtxf_set_matrix_gObjectList(s32, Mat4);
void set_transform_matrix(Mat4 dest, Vec3f orientationVector, Vec3f positionVector, u16 rotationAngle,
f32 scaleFactor);
void vec3f_rotate_x_y(Vec3f, Vec3f, Vec3s);
diff --git a/src/render_objects.c b/src/render_objects.c
index e3a5d869d..0bfef1437 100644
--- a/src/render_objects.c
+++ b/src/render_objects.c
@@ -3449,23 +3449,24 @@ void render_object_snowflakes_particles(void) {
gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF);
}
-struct CloudInterpData {
+struct ObjectInterpData {
s32 objectIndex;
- s16 x;
+ s16 x, y;
};
-struct CloudInterpData prevClouds[OBJECT_LIST_SIZE] = { 0 };
+struct ObjectInterpData prevObject[OBJECT_LIST_SIZE] = { 0 };
void func_800518F8(s32 objectIndex, s16 x, s16 y) {
- // Search all recorded clouds for the one we're drawing
+ // Search all recorded objects for the one we're drawing
for (int i = 0; i < OBJECT_LIST_SIZE; i++) {
- if (objectIndex == prevClouds[i].objectIndex) {
+ if (objectIndex == prevObject[i].objectIndex) {
// Coincidence!
- // Skip drawing the cloud this frame if it warped to the other side of the screen
- if (fabs(x - prevClouds[i].x) > SCREEN_WIDTH / 2) {
- prevClouds[objectIndex].x = x;
- prevClouds[objectIndex].objectIndex = objectIndex;
+ // Skip drawing the object this frame if it warped to the other side of the screen
+ if ((fabs(x - prevObject[i].x) > SCREEN_WIDTH / 2) || (fabs(y - prevObject[i].y) > SCREEN_HEIGHT / 2)) {
+ prevObject[objectIndex].x = x;
+ prevObject[objectIndex].y = y;
+ prevObject[objectIndex].objectIndex = objectIndex;
return;
}
}
@@ -3490,8 +3491,9 @@ void func_800518F8(s32 objectIndex, s16 x, s16 y) {
}
// Save current cloud index and x position
- prevClouds[objectIndex].x = x;
- prevClouds[objectIndex].objectIndex = objectIndex;
+ prevObject[objectIndex].x = x;
+ prevObject[objectIndex].y = y;
+ prevObject[objectIndex].objectIndex = objectIndex;
}
void func_800519D4(s32 objectIndex, s16 arg1, s16 arg2) {