summaryrefslogtreecommitdiff
path: root/src/port/interpolation/FrameInterpolation.cpp
diff options
context:
space:
mode:
authorSonic Dreamcaster <alejandro.asenjo88@gmail.com>2025-05-17 18:00:34 -0300
committerSonic Dreamcaster <alejandro.asenjo88@gmail.com>2025-05-17 18:00:34 -0300
commit1229a69f2c90385eb10f4743554cda8a3fd990da (patch)
tree1f4a93db2a15af3661559f6886dd52c3806f2a14 /src/port/interpolation/FrameInterpolation.cpp
parent9635600bdcf79b6b7b2b4c703322c84fb575639b (diff)
progress
Diffstat (limited to 'src/port/interpolation/FrameInterpolation.cpp')
-rw-r--r--src/port/interpolation/FrameInterpolation.cpp66
1 files changed, 54 insertions, 12 deletions
diff --git a/src/port/interpolation/FrameInterpolation.cpp b/src/port/interpolation/FrameInterpolation.cpp
index 9df591f0c..70a7ccf01 100644
--- a/src/port/interpolation/FrameInterpolation.cpp
+++ b/src/port/interpolation/FrameInterpolation.cpp
@@ -67,7 +67,8 @@ enum class Op {
MatrixMtxFToMtx,
MatrixToMtx,
MatrixRotateAxis,
- SkinMatrixMtxFToMtx
+ SkinMatrixMtxFToMtx,
+ SetTransformMatrix
};
typedef pair<const void*, int> label;
@@ -161,6 +162,14 @@ union Data {
} matrix_rotate_axis;
struct {
+ Mat4 dest;
+ Vec3f orientationVector;
+ Vec3f positionVector;
+ u16 rotationAngle;
+ f32 scaleFactor;
+ } set_transform_matrix_data;
+
+ struct {
label key;
size_t idx;
} open_child;
@@ -330,11 +339,11 @@ struct InterpolateCtx {
break;
case Op::MatrixPush:
- Matrix_Push((Matrix**)&gInterpolationMatrix);
+ Matrix_Push((Matrix**) &gInterpolationMatrix);
break;
case Op::MatrixPop:
- Matrix_Pop((Matrix**)&gInterpolationMatrix);
+ Matrix_Pop((Matrix**) &gInterpolationMatrix);
break;
// Unused on SF64
@@ -366,9 +375,12 @@ struct InterpolateCtx {
tempF[1] = lerp(old_op.matrix_pos_rot_xyz.pos.y, new_op.matrix_pos_rot_xyz.pos.y);
tempF[2] = lerp(old_op.matrix_pos_rot_xyz.pos.z, new_op.matrix_pos_rot_xyz.pos.z);
- tempS[0] = lerp(old_op.matrix_pos_rot_xyz.orientation.x, new_op.matrix_pos_rot_xyz.orientation.x);
- tempS[1] = lerp(old_op.matrix_pos_rot_xyz.orientation.y, new_op.matrix_pos_rot_xyz.orientation.y);
- tempS[2] = lerp(old_op.matrix_pos_rot_xyz.orientation.z, new_op.matrix_pos_rot_xyz.orientation.z);
+ tempS[0] =
+ lerp(old_op.matrix_pos_rot_xyz.orientation.x, new_op.matrix_pos_rot_xyz.orientation.x);
+ tempS[1] =
+ lerp(old_op.matrix_pos_rot_xyz.orientation.y, new_op.matrix_pos_rot_xyz.orientation.y);
+ tempS[2] =
+ lerp(old_op.matrix_pos_rot_xyz.orientation.z, new_op.matrix_pos_rot_xyz.orientation.z);
mtxf_pos_rotation_xyz(*gInterpolationMatrix, tempF, tempS);
break;
@@ -382,7 +394,7 @@ struct InterpolateCtx {
case Op::MatrixRotate1Coord: {
s16 v = interpolate_angle(old_op.matrix_rotate_1_coord.value,
- new_op.matrix_rotate_1_coord.value);
+ new_op.matrix_rotate_1_coord.value);
switch (new_op.matrix_rotate_1_coord.coord) {
case 0:
mtxf_rotate_x(*gInterpolationMatrix, v);
@@ -441,6 +453,30 @@ struct InterpolateCtx {
// new_op.matrix_rotate_axis.mode);
break;
}
+
+ case Op::SetTransformMatrix: {
+ /*
+ Mat4 dest, Vec3f orientationVector, Vec3f positionVector, u16 rotationAngle,
+ f32 scaleFactor
+
+ set_transform_matrix_data
+ */
+ interpolate_mtxf(&tmp_mtxf, (MtxF *)&old_op.set_transform_matrix_data.dest, (MtxF *)&new_op.set_transform_matrix_data.dest);
+ Vec3f orientationVectorTemp;
+ lerp_vec3f(&orientationVectorTemp, &old_op.set_transform_matrix_data.orientationVector,
+ &new_op.set_transform_matrix_data.orientationVector);
+ Vec3f positionVector;
+ lerp_vec3f(&orientationVectorTemp, &old_op.set_transform_matrix_data.positionVector,
+ &new_op.set_transform_matrix_data.positionVector);
+
+ u16 rotationAngleTemp = lerp_s16(old_op.set_transform_matrix_data.rotationAngle,
+ new_op.set_transform_matrix_data.rotationAngle);
+ f32 scaleFactorTemp = lerp(old_op.set_transform_matrix_data.scaleFactor, new_op.set_transform_matrix_data.scaleFactor);
+
+ set_transform_matrix(tmp_mtxf.mf, orientationVectorTemp, positionVector, rotationAngleTemp, scaleFactorTemp);
+
+ break;
+ }
}
}
}
@@ -523,7 +559,7 @@ void FrameInterpolation_RecordMatrixPush(Mat4* matrix) {
if (!is_recording)
return;
- append(Op::MatrixPush).matrix_ptr = { (Mat4**)matrix };
+ append(Op::MatrixPush).matrix_ptr = { (Mat4**) matrix };
}
void FrameInterpolation_RecordMarker(const char* file, int line) {
@@ -536,7 +572,7 @@ void FrameInterpolation_RecordMarker(const char* file, int line) {
void FrameInterpolation_RecordMatrixPop(Mat4* matrix) {
if (!is_recording)
return;
- append(Op::MatrixPop).matrix_ptr = { (Mat4**)matrix };
+ append(Op::MatrixPop).matrix_ptr = { (Mat4**) matrix };
}
void FrameInterpolation_RecordMatrixPut(MtxF* src) {
@@ -554,7 +590,7 @@ void FrameInterpolation_RecordMatrixMult(Mat4* matrix, MtxF* mf, u8 mode) {
void FrameInterpolation_RecordMatrixTranslate(Mat4* matrix, Vec3f b) {
if (!is_recording)
return;
-
+
append(Op::MatrixTranslate).matrix_translate = { matrix, *((Vec3fInterp*) &b) };
}
@@ -567,11 +603,17 @@ void FrameInterpolation_RecordMatrixScale(Mat4* matrix, f32 x, f32 y, f32 z, u8
void FrameInterpolation_RecordMatrixMultVec3fNoTranslate(Mat4* matrix, Vec3f src, Vec3f dest) {
if (!is_recording)
return;
- //append(Op::MatrixMultVec3fNoTranslate).matrix_vec_no_translate = { matrix, src, dest };
+ // append(Op::MatrixMultVec3fNoTranslate).matrix_vec_no_translate = { matrix, src, dest };
}
-// Make a template for deref
+void FrameInterpolation_Record_set_transform_matrix(Mat4 dest, Vec3f orientationVector, Vec3f positionVector, u16 rotationAngle,
+ f32 scaleFactor) {
+ if (!is_recording)
+ return;
+ append(Op::SetTransformMatrix).set_transform_matrix_data = { dest[0][0], orientationVector[0], positionVector[0], rotationAngle, scaleFactor};
+}
+// Make a template for deref
void FrameInterpolation_RecordMatrixPosRotXYZ(Mat4 out, Vec3f pos, Vec3s orientation) {
if (!is_recording)