From 0147b74beab3ede53f8fb3946d6d9f6da928d822 Mon Sep 17 00:00:00 2001 From: praydog Date: Mon, 11 Nov 2024 14:32:54 -0800 Subject: [PATCH] GameObjectsDisplay: Slight perf improvement + flicker reduction fix --- src/mods/BackBufferRenderer.cpp | 9 ++++++++- src/mods/BackBufferRenderer.hpp | 1 + src/mods/tools/GameObjectsDisplay.cpp | 13 ++++--------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/mods/BackBufferRenderer.cpp b/src/mods/BackBufferRenderer.cpp index 7b937bd2..88095eab 100644 --- a/src/mods/BackBufferRenderer.cpp +++ b/src/mods/BackBufferRenderer.cpp @@ -122,7 +122,6 @@ void BackBufferRenderer::render_d3d12() { { std::scoped_lock _{m_d3d12.render_work_mtx}; works = m_d3d12.render_work; - m_d3d12.render_work.clear(); } const RenderWorkData data{ @@ -153,4 +152,12 @@ void BackBufferRenderer::on_present() { } else { render_d3d11(); } +} + +void BackBufferRenderer::on_frame() { + // Clearing this here instead of every time whenever we present fixes flickering in some games + if (g_framework->is_dx12() && !m_d3d12.render_work.empty()) { + std::scoped_lock _{m_d3d12.render_work_mtx}; + m_d3d12.render_work.clear(); + } } \ No newline at end of file diff --git a/src/mods/BackBufferRenderer.hpp b/src/mods/BackBufferRenderer.hpp index 3e973483..39a72408 100644 --- a/src/mods/BackBufferRenderer.hpp +++ b/src/mods/BackBufferRenderer.hpp @@ -27,6 +27,7 @@ class BackBufferRenderer : public Mod { std::optional on_initialize_d3d_thread() override; void on_present() override; + void on_frame() override; void on_device_reset() override; public: diff --git a/src/mods/tools/GameObjectsDisplay.cpp b/src/mods/tools/GameObjectsDisplay.cpp index 0302796f..2b60f76e 100644 --- a/src/mods/tools/GameObjectsDisplay.cpp +++ b/src/mods/tools/GameObjectsDisplay.cpp @@ -152,6 +152,7 @@ void GameObjectsDisplay::on_frame() { static auto get_gameobject_method = transform_def->get_method("get_GameObject"); static auto get_position_method = transform_def->get_method("get_Position"); static auto get_axisz_method = transform_def->get_method("get_AxisZ"); + static auto get_world_matrix_method = transform_def->get_method("get_WorldMatrix"); auto math = sdk::get_native_singleton("via.math"); auto math_t = sdk::find_type_definition("via.math"); @@ -229,6 +230,8 @@ void GameObjectsDisplay::on_frame() { }); } + __declspec(align(16)) Matrix4x4f world_matrix{}; + for (auto transform = first_transform; transform != nullptr; transform = next_transform_method->call(context, transform)) @@ -264,15 +267,7 @@ void GameObjectsDisplay::on_frame() { } if (is_d3d12) { - // Billboard rotation to make the quad face the camera - /*DirectX::SimpleMath::Matrix rotation = DirectX::SimpleMath::Matrix::CreateBillboard( - DirectX::SimpleMath::Vector3(pos.x, pos.y, pos.z), - DirectX::SimpleMath::Vector3(camera_origin.x, camera_origin.y, camera_origin.z), - DirectX::SimpleMath::Vector3::Up - );*/ - - Matrix4x4f world_matrix{}; - sdk::call_object_func(transform, "get_WorldMatrix", &world_matrix, context, transform); + get_world_matrix_method->call(&world_matrix, context, transform); DirectX::SimpleMath::Matrix world = DirectX::SimpleMath::Matrix{&world_matrix[0][0]};