diff --git a/src/mods/vr/FFakeStereoRenderingHook.cpp b/src/mods/vr/FFakeStereoRenderingHook.cpp index a5646dea..8da17406 100644 --- a/src/mods/vr/FFakeStereoRenderingHook.cpp +++ b/src/mods/vr/FFakeStereoRenderingHook.cpp @@ -3851,6 +3851,27 @@ void FFakeStereoRenderingHook::adjust_view_rect(FFakeStereoRendering* stereo, in index_starts_from_one = false; } + // The purpose of this is to prevent the game from crashing in IDirect3D12CommandList::Close + // Because the game will try to copy a texture region that is out of bounds. + if (g_hook->m_skip_next_adjust_view_rect) { + *x = 0; + *y = 0; + *w = std::min(VR::get()->get_hmd_width(), *w); + *h = std::min(VR::get()->get_hmd_height(), *h); + g_hook->m_skip_next_adjust_view_rect = false; + g_hook->m_skip_next_adjust_view_rect_count = 1; + return; + } + + if (g_hook->m_skip_next_adjust_view_rect_count > 0) { + *x = 0; + *y = 0; + *w = std::min(VR::get()->get_hmd_width(), *w); + *h = std::min(VR::get()->get_hmd_height(), *h); + --g_hook->m_skip_next_adjust_view_rect_count; + return; + } + if (VR::get()->is_stereo_emulation_enabled()) { *w *= 2; } else { diff --git a/src/mods/vr/FFakeStereoRenderingHook.hpp b/src/mods/vr/FFakeStereoRenderingHook.hpp index 57ae5389..9b2783d2 100644 --- a/src/mods/vr/FFakeStereoRenderingHook.hpp +++ b/src/mods/vr/FFakeStereoRenderingHook.hpp @@ -222,6 +222,7 @@ class FFakeStereoRenderingHook : public ModComponent { void set_should_recreate_textures(bool recreate) { m_wants_texture_recreation = recreate; + m_skip_next_adjust_view_rect = true; } void on_device_reset() override { @@ -415,6 +416,8 @@ class FFakeStereoRenderingHook : public ModComponent { bool m_wants_texture_recreation{false}; bool m_has_view_extension_hook{false}; bool m_has_game_viewport_client_draw_hook{false}; + bool m_skip_next_adjust_view_rect{false}; + int32_t m_skip_next_adjust_view_rect_count{1}; // Synchronized AFR float m_ignored_engine_delta{0.0f};