From ebdee934ab0de775479b610bf1830cfdf33d1b5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=AA=20H=C3=A0n=20Minh=20Khang?= Date: Fri, 12 Jul 2024 14:28:02 -0400 Subject: [PATCH] Add bxt-rs camera replay related hooks (#519) * Add bxt-rs camera replay related hooks * change bxt_on_tas_playback_frame to bxt_on_tas_playback_frame_v2 --- BunnymodXT/modules/HwDLL.cpp | 32 +++++++++++++++++++++++++++----- BunnymodXT/modules/HwDLL.hpp | 2 ++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/BunnymodXT/modules/HwDLL.cpp b/BunnymodXT/modules/HwDLL.cpp index dba0ea57..c4fcaac7 100644 --- a/BunnymodXT/modules/HwDLL.cpp +++ b/BunnymodXT/modules/HwDLL.cpp @@ -41,6 +41,7 @@ struct on_tas_playback_frame_data { std::array prev_predicted_trace_fractions; std::array prev_predicted_trace_normal_zs; on_tas_playback_frame_max_accel_yaw_offset max_accel_yaw_offset; + std::array rendered_viewangles; }; // Change the variable name if you change the parameters! @@ -49,7 +50,7 @@ extern "C" { // BXT will call this right before running HLStrafe for every played back frame of a TAS. // // Return value != 0 will cause BXT to stop TAS playback. - DLLEXPORT int (*bxt_on_tas_playback_frame)(on_tas_playback_frame_data data); + DLLEXPORT int (*bxt_on_tas_playback_frame_v2)(on_tas_playback_frame_data data); // BXT will call this when the TAS playback stops. DLLEXPORT void (*bxt_on_tas_playback_stopped)(); @@ -2474,11 +2475,31 @@ cvar_t* HwDLL::FindCVar(const char* name) return ORIG_Cvar_FindVar(name); } +std::array HwDLL::GetRenderedViewangles() { + std::array res = {player.Viewangles[0], player.Viewangles[1], player.Viewangles[2]}; + + if (!PitchOverrides.empty()) { + res[0] = PitchOverrides[PitchOverrideIndex]; + } + if (!RenderPitchOverrides.empty()) { + res[0] = RenderPitchOverrides[RenderPitchOverrideIndex]; + } + + if (!TargetYawOverrides.empty()) { + res[1] = TargetYawOverrides[TargetYawOverrideIndex]; + } + if (!RenderYawOverrides.empty()) { + res[1] = RenderYawOverrides[RenderYawOverrideIndex]; + } + + return res; +} + int HwDLL::CallOnTASPlaybackFrame() { - if (!bxt_on_tas_playback_frame) + if (!bxt_on_tas_playback_frame_v2) return 0; - return bxt_on_tas_playback_frame(on_tas_playback_frame_data { + return bxt_on_tas_playback_frame_v2(on_tas_playback_frame_data { StrafeState.StrafeCycleFrameCount, PrevFractions, PrevNormalzs, @@ -2489,6 +2510,7 @@ int HwDLL::CallOnTASPlaybackFrame() { StrafeState.MaxAccelYawOffsetAccel, // accel static_cast(StrafeState.MaxAccelYawOffsetDir), // dir }, + GetRenderedViewangles(), }); } @@ -6127,7 +6149,7 @@ void HwDLL::InsertCommands() pushables, }); - if (bxt_on_tas_playback_frame) { + if (bxt_on_tas_playback_frame_v2) { const auto stop = CallOnTASPlaybackFrame(); if (stop) { ResetTASPlaybackState(); @@ -6661,7 +6683,7 @@ void HwDLL::InsertCommands() RenderPitchOverrides.clear(); RenderPitchOverrideIndex = 0; - if (bxt_on_tas_playback_frame) { + if (bxt_on_tas_playback_frame_v2) { // We don't use the return value here because we stop anyway. CallOnTASPlaybackFrame(); } diff --git a/BunnymodXT/modules/HwDLL.hpp b/BunnymodXT/modules/HwDLL.hpp index 9f3e6462..4b080dba 100644 --- a/BunnymodXT/modules/HwDLL.hpp +++ b/BunnymodXT/modules/HwDLL.hpp @@ -360,6 +360,8 @@ class HwDLL : public IHookableNameFilterOrdered bool is_cof_steam = false; // Cry of Fear-specific + // For bxt-rs rendered view playback. + std::array GetRenderedViewangles(); int CallOnTASPlaybackFrame(); void CallOnTASPlaybackStopped(); void ResetTASPlaybackState();