From eaeff4e0e083e8974d0279cab52dd8d09a70f558 Mon Sep 17 00:00:00 2001 From: Sonic Dreamcaster Date: Fri, 16 May 2025 00:24:15 -0300 Subject: [PATCH] progress --- src/port/Engine.cpp | 16 +++- src/port/Engine.h | 2 +- src/port/interpolation/FrameInterpolation.cpp | 78 ++++++++++++------- src/port/interpolation/FrameInterpolation.h | 2 +- src/port/ui/PortMenu.cpp | 30 +++---- src/racing/math_util.c | 1 + 6 files changed, 79 insertions(+), 50 deletions(-) diff --git a/src/port/Engine.cpp b/src/port/Engine.cpp index 669e24504..debfad703 100644 --- a/src/port/Engine.cpp +++ b/src/port/Engine.cpp @@ -324,16 +324,24 @@ void GameEngine::StartFrame() const { // Instance->context->GetWindow()->MainLoop(run_one_game_iter); // } -void GameEngine::RunCommands(Gfx* Commands) { +void GameEngine::RunCommands(Gfx* Commands, const std::vector>& mtx_replacements) { auto wnd = std::dynamic_pointer_cast(Ship::Context::GetInstance()->GetWindow()); - if (nullptr == wnd) { + if (wnd == nullptr) { return; } + auto interpreter = wnd->GetInterpreterWeak().lock().get(); + + // Process window events for resize, mouse, keyboard events wnd->HandleEvents(); - wnd->DrawAndRunGraphicsCommands(Commands, {}); + interpreter->mInterpolationIndex = 0; + + for (const auto& m : mtx_replacements) { + wnd->DrawAndRunGraphicsCommands(Commands, m); + interpreter->mInterpolationIndex++; + } bool curAltAssets = CVarGetInteger("gEnhancements.Mods.AlternateAssets", 0); if (prevAltAssets != curAltAssets) { @@ -379,7 +387,7 @@ void GameEngine::ProcessGfxCommands(Gfx* commands) { wnd->SetTargetFps(CVarGetInteger("gInterpolationFPS", 30)); wnd->SetMaximumFrameLatency(1); } - RunCommands(commands); + RunCommands(commands, mtx_replacements); } // Audio diff --git a/src/port/Engine.h b/src/port/Engine.h index 4a4b25439..569009b00 100644 --- a/src/port/Engine.h +++ b/src/port/Engine.h @@ -62,7 +62,7 @@ class GameEngine { static uint32_t GetInterpolationFPS(); static uint32_t GetInterpolationFrameCount(); void StartFrame() const; - static void RunCommands(Gfx* Commands); + static void RunCommands(Gfx* Commands, const std::vector>& mtx_replacements); void ProcessFrame(void (*run_one_game_iter)()) const; static void Destroy(); static void ProcessGfxCommands(Gfx* commands); diff --git a/src/port/interpolation/FrameInterpolation.cpp b/src/port/interpolation/FrameInterpolation.cpp index 386561be8..12b57f4a9 100644 --- a/src/port/interpolation/FrameInterpolation.cpp +++ b/src/port/interpolation/FrameInterpolation.cpp @@ -5,6 +5,7 @@ #include #include #include "port/Engine.h" +#include #include #include "FrameInterpolation.h" @@ -89,8 +90,7 @@ union Data { struct { Mat4* matrix; - f32 x, y, z; - u8 mode; + Vec3f b; } matrix_translate, matrix_scale; struct { @@ -181,9 +181,12 @@ Data& append(Op op) { return m.emplace_back(); } -extern "C" {extern Mat4* gInterpolationMatrix;} +extern "C" { +extern Mat4* gInterpolationMatrix; +void mtxf_translate(Mat4, Vec3f); +} -MtxF* Matrix_GetCurrent(){ +MtxF* Matrix_GetCurrent() { return (MtxF*) gInterpolationMatrix; } @@ -245,15 +248,15 @@ struct InterpolateCtx { s16 interpolate_angle(s16 os, s16 ns) { if (os == ns) return ns; - int o = (u16)os; - int n = (u16)ns; + int o = (u16) os; + int n = (u16) ns; u16 res; int diff = o - n; if (-0x8000 <= diff && diff <= 0x8000) { if (diff < -0x4000 || diff > 0x4000) { return ns; } - res = (u16)(w * o + step * n); + res = (u16) (w * o + step * n); } else { if (o < n) { o += 0x10000; @@ -264,9 +267,9 @@ struct InterpolateCtx { if (diff < -0x4000 || diff > 0x4000) { return ns; } - res = (u16)(w * o + step * n); + res = (u16) (w * o + step * n); } - if (os / 327 == ns / 327 && (s16)res / 327 != os / 327) { + if (os / 327 == ns / 327 && (s16) res / 327 != os / 327) { int bp = 0; } return res; @@ -317,11 +320,11 @@ struct InterpolateCtx { // Matrix_Pop(&gInterpolationMatrix); break; - // Unused on SF64 - // case Op::MatrixPut: - // interpolate_mtxf(&tmp_mtxf, &old_op.matrix_put.src, &new_op.matrix_put.src); - // Matrix_Put(&tmp_mtxf); - // break; + // Unused on SF64 + // case Op::MatrixPut: + // interpolate_mtxf(&tmp_mtxf, &old_op.matrix_put.src, &new_op.matrix_put.src); + // Matrix_Put(&tmp_mtxf); + // break; case Op::MatrixMult: interpolate_mtxf(&tmp_mtxf, &old_op.matrix_mult.mf, &new_op.matrix_mult.mf); @@ -329,16 +332,26 @@ struct InterpolateCtx { break; case Op::MatrixTranslate: - // Matrix_Translate(gInterpolationMatrix, lerp(old_op.matrix_translate.x, new_op.matrix_translate.x), + // Matrix_Translate(gInterpolationMatrix, lerp(old_op.matrix_translate.x, + // new_op.matrix_translate.x), // lerp(old_op.matrix_translate.y, new_op.matrix_translate.y), // lerp(old_op.matrix_translate.z, new_op.matrix_translate.z), // new_op.matrix_translate.mode); + + Vec3f temp; + + temp[0] = lerp(old_op.matrix_translate.b[0], new_op.matrix_translate.b[0]); + temp[1] = lerp(old_op.matrix_translate.b[1], new_op.matrix_translate.b[1]); + temp[2] = lerp(old_op.matrix_translate.b[2], new_op.matrix_translate.b[2]); + + mtxf_translate(*gInterpolationMatrix, temp); break; case Op::MatrixScale: // Matrix_Scale(gInterpolationMatrix, lerp(old_op.matrix_scale.x, new_op.matrix_scale.x), // lerp(old_op.matrix_scale.y, new_op.matrix_scale.y), - // lerp(old_op.matrix_scale.z, new_op.matrix_scale.z), new_op.matrix_scale.mode); + // lerp(old_op.matrix_scale.z, new_op.matrix_scale.z), + // new_op.matrix_scale.mode); break; case Op::MatrixRotate1Coord: { @@ -361,14 +374,18 @@ struct InterpolateCtx { break; } case Op::MatrixMultVec3fNoTranslate: { - interpolate_vecs(&tmp_vec3f, &old_op.matrix_vec_no_translate.src, &new_op.matrix_vec_no_translate.src); - interpolate_vecs(&tmp_vec3f2, &old_op.matrix_vec_no_translate.dest, &new_op.matrix_vec_no_translate.dest); + interpolate_vecs(&tmp_vec3f, &old_op.matrix_vec_no_translate.src, + &new_op.matrix_vec_no_translate.src); + interpolate_vecs(&tmp_vec3f2, &old_op.matrix_vec_no_translate.dest, + &new_op.matrix_vec_no_translate.dest); // Matrix_MultVec3fNoTranslate(gInterpolationMatrix, &tmp_vec3f, &tmp_vec3f2); break; } case Op::MatrixMultVec3f: { - interpolate_vecs(&tmp_vec3f, &old_op.matrix_vec_translate.src, &new_op.matrix_vec_translate.src); - interpolate_vecs(&tmp_vec3f2, &old_op.matrix_vec_translate.dest, &new_op.matrix_vec_translate.dest); + interpolate_vecs(&tmp_vec3f, &old_op.matrix_vec_translate.src, + &new_op.matrix_vec_translate.src); + interpolate_vecs(&tmp_vec3f2, &old_op.matrix_vec_translate.dest, + &new_op.matrix_vec_translate.dest); // Matrix_MultVec3f(gInterpolationMatrix, &tmp_vec3f, &tmp_vec3f2); break; } @@ -393,8 +410,10 @@ struct InterpolateCtx { case Op::MatrixRotateAxis: { lerp_vec3f(&tmp_vec3f, &old_op.matrix_rotate_axis.axis, &new_op.matrix_rotate_axis.axis); - auto tmp = interpolate_angle(old_op.matrix_rotate_axis.angle, new_op.matrix_rotate_axis.angle); - // Matrix_RotateAxis((Matrix*) &tmp_vec3f, tmp, 1.0f, 1.0f, 1.0f, new_op.matrix_rotate_axis.mode); + auto tmp = + interpolate_angle(old_op.matrix_rotate_axis.angle, new_op.matrix_rotate_axis.angle); + // Matrix_RotateAxis((Matrix*) &tmp_vec3f, tmp, 1.0f, 1.0f, 1.0f, + // new_op.matrix_rotate_axis.mode); break; } } @@ -466,7 +485,7 @@ void FrameInterpolation_DontInterpolateCamera(void) { } int FrameInterpolation_GetCameraEpoch(void) { - return (int)camera_epoch; + return (int) camera_epoch; } void FrameInterpolation_RecordActorPosRotMatrix(void) { @@ -498,7 +517,7 @@ void FrameInterpolation_RecordMatrixPop(Mat4** matrix) { void FrameInterpolation_RecordMatrixPut(MtxF* src) { if (!is_recording) return; -// append(Op::MatrixPut).matrix_put = { matrix, *src }; + // append(Op::MatrixPut).matrix_put = { matrix, *src }; } void FrameInterpolation_RecordMatrixMult(Mat4* matrix, MtxF* mf, u8 mode) { @@ -507,25 +526,26 @@ void FrameInterpolation_RecordMatrixMult(Mat4* matrix, MtxF* mf, u8 mode) { append(Op::MatrixMult).matrix_mult = { matrix, *mf, mode }; } -void FrameInterpolation_RecordMatrixTranslate(Mat4* matrix, f32 x, f32 y, f32 z, u8 mode) { +void FrameInterpolation_RecordMatrixTranslate(Mat4* matrix, Vec3f b) { if (!is_recording) return; - append(Op::MatrixTranslate).matrix_translate = { matrix, x, y, z, mode }; + + append(Op::MatrixTranslate).matrix_translate = { matrix, b[0] }; } void FrameInterpolation_RecordMatrixScale(Mat4* matrix, f32 x, f32 y, f32 z, u8 mode) { if (!is_recording) return; - append(Op::MatrixScale).matrix_scale = { matrix, x, y, z, mode }; + // append(Op::MatrixScale).matrix_scale = { matrix, x, y, z, mode }; } -void FrameInterpolation_RecordMatrixMultVec3fNoTranslate(Mat4* matrix, Vec3f src, Vec3f dest){ +void FrameInterpolation_RecordMatrixMultVec3fNoTranslate(Mat4* matrix, Vec3f src, Vec3f dest) { if (!is_recording) return; // append(Op::MatrixMultVec3fNoTranslate).matrix_vec_no_translate = { matrix, src, dest }; } -void FrameInterpolation_RecordMatrixMultVec3f(Mat4* matrix, Vec3f src, Vec3f dest){ +void FrameInterpolation_RecordMatrixMultVec3f(Mat4* matrix, Vec3f src, Vec3f dest) { if (!is_recording) return; // append(Op::MatrixMultVec3f).matrix_vec_translate = { matrix, src, dest }; diff --git a/src/port/interpolation/FrameInterpolation.h b/src/port/interpolation/FrameInterpolation.h index 77d08b9c0..72a1c9146 100644 --- a/src/port/interpolation/FrameInterpolation.h +++ b/src/port/interpolation/FrameInterpolation.h @@ -41,7 +41,7 @@ void FrameInterpolation_RecordActorPosRotMatrix(void); //void FrameInterpolation_RecordMatrixMult(Matrix* matrix, MtxF* mf, u8 mode); -//void FrameInterpolation_RecordMatrixTranslate(Matrix* matrix, f32 x, f32 y, f32 z, u8 mode); +void FrameInterpolation_RecordMatrixTranslate(Mat4* matrix, Vec3f b); //void FrameInterpolation_RecordMatrixScale(Matrix* matrix, f32 x, f32 y, f32 z, u8 mode); diff --git a/src/port/ui/PortMenu.cpp b/src/port/ui/PortMenu.cpp index b21ddc1fa..286d02aab 100644 --- a/src/port/ui/PortMenu.cpp +++ b/src/port/ui/PortMenu.cpp @@ -244,21 +244,21 @@ void PortMenu::AddSettings() { .DefaultValue(1)); #endif - // AddWidget(path, "Current FPS: %d", WIDGET_CVAR_SLIDER_INT) - // .CVar("gInterpolationFPS") - // .Callback([](WidgetInfo& info) { - // int32_t defaultValue = std::static_pointer_cast(info.options)->defaultValue; - // if (CVarGetInteger(info.cVar, defaultValue) == defaultValue) { - // info.name = "Current FPS: Original (%d)"; - // } else { - // info.name = "Current FPS: %d"; - // } - // }) - // .PreFunc([](WidgetInfo& info) { - // if (mPortMenu->disabledMap.at(DISABLE_FOR_MATCH_REFRESH_RATE_ON).active) - // info.activeDisables.push_back(DISABLE_FOR_MATCH_REFRESH_RATE_ON); - // }) - // .Options(IntSliderOptions().Tooltip(tooltip).Min(20).Max(maxFps).DefaultValue(20)); + AddWidget(path, "Current FPS: %d", WIDGET_CVAR_SLIDER_INT) + .CVar("gInterpolationFPS") + .Callback([](WidgetInfo& info) { + int32_t defaultValue = std::static_pointer_cast(info.options)->defaultValue; + if (CVarGetInteger(info.cVar, defaultValue) == defaultValue) { + info.name = "Current FPS: Original (%d)"; + } else { + info.name = "Current FPS: %d"; + } + }) + .PreFunc([](WidgetInfo& info) { + if (mPortMenu->disabledMap.at(DISABLE_FOR_MATCH_REFRESH_RATE_ON).active) + info.activeDisables.push_back(DISABLE_FOR_MATCH_REFRESH_RATE_ON); + }) + .Options(IntSliderOptions().Tooltip(tooltip).Min(20).Max(maxFps).DefaultValue(20)); AddWidget(path, "Match Refresh Rate", WIDGET_BUTTON) .Callback([](WidgetInfo& info) { int hz = Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(); diff --git a/src/racing/math_util.c b/src/racing/math_util.c index ac34ceda7..934865b08 100644 --- a/src/racing/math_util.c +++ b/src/racing/math_util.c @@ -222,6 +222,7 @@ UNUSED void add_translate_mat4_vec3f_lite(Mat4 mat, Mat4 dest, Vec3f pos) { // create a translation matrix void mtxf_translate(Mat4 dest, Vec3f b) { + FrameInterpolation_RecordMatrixTranslate(dest, b); mtxf_identity(dest); dest[3][0] = b[0]; dest[3][1] = b[1];