diff --git a/dependencies/submodules/UESDK b/dependencies/submodules/UESDK index ad077377..39ec1223 160000 --- a/dependencies/submodules/UESDK +++ b/dependencies/submodules/UESDK @@ -1 +1 @@ -Subproject commit ad077377754d7e1361b9e399c2b72213d2a0f487 +Subproject commit 39ec1223be37e0a8440b4828cd3e301e48f6e7ad diff --git a/src/mods/vr/FFakeStereoRenderingHook.cpp b/src/mods/vr/FFakeStereoRenderingHook.cpp index 3dd4b33d..5e5be842 100644 --- a/src/mods/vr/FFakeStereoRenderingHook.cpp +++ b/src/mods/vr/FFakeStereoRenderingHook.cpp @@ -374,11 +374,12 @@ void FFakeStereoRenderingHook::attempt_hook_game_engine_tick(uintptr_t return_ad namespace detail{ bool pre_find_slate_thread() { sdk::slate::locate_draw_window_renderthread_fn(); // Can take a while to find + sdk::slate::locate_draw_window_renderthread_fn_alternate(); return true; } } -void FFakeStereoRenderingHook::attempt_hook_slate_thread(uintptr_t return_address) { +void FFakeStereoRenderingHook::attempt_hook_slate_thread(uintptr_t return_address, bool alternate) { if (m_asynchronous_scan->value()) { static std::future future = std::async(std::launch::async, detail::pre_find_slate_thread); @@ -394,14 +395,22 @@ void FFakeStereoRenderingHook::attempt_hook_slate_thread(uintptr_t return_addres return; } - if (return_address == 0 && m_attempted_hook_slate_thread) { + const auto attempted = alternate ? m_attempted_hook_slate_thread_alternate : m_attempted_hook_slate_thread; + + if (return_address == 0 && attempted) { return; } SPDLOG_INFO("Attempting to hook FSlateRHIRenderer::DrawWindow_RenderThread!"); - m_attempted_hook_slate_thread = true; - auto func = sdk::slate::locate_draw_window_renderthread_fn(); + if (alternate) { + SPDLOG_INFO("Using alternate method to hook FSlateRHIRenderer::DrawWindow_RenderThread!"); + m_attempted_hook_slate_thread_alternate = true; + } else { + m_attempted_hook_slate_thread = true; + } + + auto func = alternate ? sdk::slate::locate_draw_window_renderthread_fn_alternate() : sdk::slate::locate_draw_window_renderthread_fn(); if (!func && return_address == 0) { SPDLOG_ERROR("Cannot hook FSlateRHIRenderer::DrawWindow_RenderThread"); @@ -3026,6 +3035,14 @@ void FFakeStereoRenderingHook::pre_render_viewfamily_renderthread(ISceneViewExte return; } + static size_t execution_count{0}; + + if (g_hook->m_attempted_hook_slate_thread && !g_hook->m_slate_thread_hook && !g_hook->m_attempted_hook_slate_thread_alternate && execution_count++ >= 50) { + SPDLOG_INFO("DrawWindow_RenderThread was not hooked after {} render calls, trying alternative hook", execution_count); + + g_hook->attempt_hook_slate_thread(0, true); + } + auto& vr = VR::get(); if (!vr->is_hmd_active()) { diff --git a/src/mods/vr/FFakeStereoRenderingHook.hpp b/src/mods/vr/FFakeStereoRenderingHook.hpp index 906fe556..45683891 100644 --- a/src/mods/vr/FFakeStereoRenderingHook.hpp +++ b/src/mods/vr/FFakeStereoRenderingHook.hpp @@ -194,7 +194,7 @@ class FFakeStereoRenderingHook : public ModComponent { void attempt_hooking(); void attempt_hook_game_engine_tick(uintptr_t return_address = 0); - void attempt_hook_slate_thread(uintptr_t return_address = 0); + void attempt_hook_slate_thread(uintptr_t return_address = 0, bool alternate = false); void attempt_hook_update_viewport_rhi(uintptr_t return_address); void attempt_hook_fsceneview_constructor(); @@ -433,6 +433,7 @@ class FFakeStereoRenderingHook : public ModComponent { bool m_hooked_slate_thread{false}; bool m_attempted_hook_game_engine_tick{false}; bool m_attempted_hook_slate_thread{false}; + bool m_attempted_hook_slate_thread_alternate{false}; bool m_attempted_hook_update_viewport_rhi{false}; bool m_attempted_hook_fsceneview_constructor{false}; bool m_uses_old_rendertarget_manager{false};