diff --git a/CMakeLists.txt b/CMakeLists.txt index a82701153..f406142e9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -134,13 +134,13 @@ FetchContent_Declare( ) FetchContent_MakeAvailable(bddisasm) -message(STATUS "Fetching kananlib (203dc31c5d8ba2cffdb780ae38b2eb2080bb099c)...") +message(STATUS "Fetching kananlib (65c205e9f3f0985fd298281a77098d48b9065e87)...") FetchContent_Declare( kananlib GIT_REPOSITORY https://github.com/cursey/kananlib GIT_TAG - 203dc31c5d8ba2cffdb780ae38b2eb2080bb099c + 65c205e9f3f0985fd298281a77098d48b9065e87 ) FetchContent_MakeAvailable(kananlib) @@ -608,6 +608,7 @@ if(REF_BUILD_RE2_SDK OR REF_BUILD_FRAMEWORK) # build-re2-sdk "shared/sdk/SystemArray.cpp" "shared/sdk/helpers/NativeObject.cpp" "shared/sdk/renderer/RenderResource.cpp" + "shared/sdk/resources/MasterMaterialResource.cpp" "shared/sdk/Application.hpp" "shared/sdk/Enums_Internal.hpp" "shared/sdk/GUIPrimitiveSystem.hpp" @@ -1381,7 +1382,10 @@ if(REF_BUILD_RE2_SDK OR REF_BUILD_FRAMEWORK) # build-re2-sdk "shared/sdk/regenny/sf6/via/typeinfo/TypeInfo.hpp" "shared/sdk/regenny/sf6/via/vec3.hpp" "shared/sdk/regenny/sf6/via/vec4.hpp" + "shared/sdk/renderer/PipelineState.hpp" "shared/sdk/renderer/RenderResource.hpp" + "shared/sdk/resources/MasterMaterialResource.hpp" + "shared/sdk/resources/ShaderResource.hpp" ) list(APPEND RE2SDK_SOURCES @@ -1455,6 +1459,7 @@ if(REF_BUILD_RE2_TDB66SDK OR REF_BUILD_FRAMEWORK) # build-re2tdb66-sdk "shared/sdk/SystemArray.cpp" "shared/sdk/helpers/NativeObject.cpp" "shared/sdk/renderer/RenderResource.cpp" + "shared/sdk/resources/MasterMaterialResource.cpp" "shared/sdk/Application.hpp" "shared/sdk/Enums_Internal.hpp" "shared/sdk/GUIPrimitiveSystem.hpp" @@ -2228,7 +2233,10 @@ if(REF_BUILD_RE2_TDB66SDK OR REF_BUILD_FRAMEWORK) # build-re2tdb66-sdk "shared/sdk/regenny/sf6/via/typeinfo/TypeInfo.hpp" "shared/sdk/regenny/sf6/via/vec3.hpp" "shared/sdk/regenny/sf6/via/vec4.hpp" + "shared/sdk/renderer/PipelineState.hpp" "shared/sdk/renderer/RenderResource.hpp" + "shared/sdk/resources/MasterMaterialResource.hpp" + "shared/sdk/resources/ShaderResource.hpp" ) list(APPEND RE2_TDB66SDK_SOURCES @@ -2731,6 +2739,7 @@ if(REF_BUILD_RE3_SDK OR REF_BUILD_FRAMEWORK) # build-re3-sdk "shared/sdk/SystemArray.cpp" "shared/sdk/helpers/NativeObject.cpp" "shared/sdk/renderer/RenderResource.cpp" + "shared/sdk/resources/MasterMaterialResource.cpp" "shared/sdk/Application.hpp" "shared/sdk/Enums_Internal.hpp" "shared/sdk/GUIPrimitiveSystem.hpp" @@ -3504,7 +3513,10 @@ if(REF_BUILD_RE3_SDK OR REF_BUILD_FRAMEWORK) # build-re3-sdk "shared/sdk/regenny/sf6/via/typeinfo/TypeInfo.hpp" "shared/sdk/regenny/sf6/via/vec3.hpp" "shared/sdk/regenny/sf6/via/vec4.hpp" + "shared/sdk/renderer/PipelineState.hpp" "shared/sdk/renderer/RenderResource.hpp" + "shared/sdk/resources/MasterMaterialResource.hpp" + "shared/sdk/resources/ShaderResource.hpp" ) list(APPEND RE3SDK_SOURCES @@ -3578,6 +3590,7 @@ if(REF_BUILD_RE3_TDB67SDK OR REF_BUILD_FRAMEWORK) # build-re3tdb67-sdk "shared/sdk/SystemArray.cpp" "shared/sdk/helpers/NativeObject.cpp" "shared/sdk/renderer/RenderResource.cpp" + "shared/sdk/resources/MasterMaterialResource.cpp" "shared/sdk/Application.hpp" "shared/sdk/Enums_Internal.hpp" "shared/sdk/GUIPrimitiveSystem.hpp" @@ -4351,7 +4364,10 @@ if(REF_BUILD_RE3_TDB67SDK OR REF_BUILD_FRAMEWORK) # build-re3tdb67-sdk "shared/sdk/regenny/sf6/via/typeinfo/TypeInfo.hpp" "shared/sdk/regenny/sf6/via/vec3.hpp" "shared/sdk/regenny/sf6/via/vec4.hpp" + "shared/sdk/renderer/PipelineState.hpp" "shared/sdk/renderer/RenderResource.hpp" + "shared/sdk/resources/MasterMaterialResource.hpp" + "shared/sdk/resources/ShaderResource.hpp" ) list(APPEND RE3_TDB67SDK_SOURCES @@ -5068,6 +5084,7 @@ if(REF_BUILD_RE4_SDK OR REF_BUILD_FRAMEWORK) # build-re4-sdk "shared/sdk/SystemArray.cpp" "shared/sdk/helpers/NativeObject.cpp" "shared/sdk/renderer/RenderResource.cpp" + "shared/sdk/resources/MasterMaterialResource.cpp" "shared/sdk/Application.hpp" "shared/sdk/Enums_Internal.hpp" "shared/sdk/GUIPrimitiveSystem.hpp" @@ -5841,7 +5858,10 @@ if(REF_BUILD_RE4_SDK OR REF_BUILD_FRAMEWORK) # build-re4-sdk "shared/sdk/regenny/sf6/via/typeinfo/TypeInfo.hpp" "shared/sdk/regenny/sf6/via/vec3.hpp" "shared/sdk/regenny/sf6/via/vec4.hpp" + "shared/sdk/renderer/PipelineState.hpp" "shared/sdk/renderer/RenderResource.hpp" + "shared/sdk/resources/MasterMaterialResource.hpp" + "shared/sdk/resources/ShaderResource.hpp" ) list(APPEND RE4SDK_SOURCES @@ -5917,6 +5937,7 @@ if(REF_BUILD_RE7_SDK OR REF_BUILD_FRAMEWORK) # build-re7-sdk "shared/sdk/SystemArray.cpp" "shared/sdk/helpers/NativeObject.cpp" "shared/sdk/renderer/RenderResource.cpp" + "shared/sdk/resources/MasterMaterialResource.cpp" "shared/sdk/Application.hpp" "shared/sdk/Enums_Internal.hpp" "shared/sdk/GUIPrimitiveSystem.hpp" @@ -6690,7 +6711,10 @@ if(REF_BUILD_RE7_SDK OR REF_BUILD_FRAMEWORK) # build-re7-sdk "shared/sdk/regenny/sf6/via/typeinfo/TypeInfo.hpp" "shared/sdk/regenny/sf6/via/vec3.hpp" "shared/sdk/regenny/sf6/via/vec4.hpp" + "shared/sdk/renderer/PipelineState.hpp" "shared/sdk/renderer/RenderResource.hpp" + "shared/sdk/resources/MasterMaterialResource.hpp" + "shared/sdk/resources/ShaderResource.hpp" ) list(APPEND RE7SDK_SOURCES @@ -6764,6 +6788,7 @@ if(REF_BUILD_RE7_TDB49SDK OR REF_BUILD_FRAMEWORK) # build-re7tdb49-sdk "shared/sdk/SystemArray.cpp" "shared/sdk/helpers/NativeObject.cpp" "shared/sdk/renderer/RenderResource.cpp" + "shared/sdk/resources/MasterMaterialResource.cpp" "shared/sdk/Application.hpp" "shared/sdk/Enums_Internal.hpp" "shared/sdk/GUIPrimitiveSystem.hpp" @@ -7537,7 +7562,10 @@ if(REF_BUILD_RE7_TDB49SDK OR REF_BUILD_FRAMEWORK) # build-re7tdb49-sdk "shared/sdk/regenny/sf6/via/typeinfo/TypeInfo.hpp" "shared/sdk/regenny/sf6/via/vec3.hpp" "shared/sdk/regenny/sf6/via/vec4.hpp" + "shared/sdk/renderer/PipelineState.hpp" "shared/sdk/renderer/RenderResource.hpp" + "shared/sdk/resources/MasterMaterialResource.hpp" + "shared/sdk/resources/ShaderResource.hpp" ) list(APPEND RE7_TDB49SDK_SOURCES @@ -8040,6 +8068,7 @@ if(REF_BUILD_RE8_SDK OR REF_BUILD_FRAMEWORK) # build-re8-sdk "shared/sdk/SystemArray.cpp" "shared/sdk/helpers/NativeObject.cpp" "shared/sdk/renderer/RenderResource.cpp" + "shared/sdk/resources/MasterMaterialResource.cpp" "shared/sdk/Application.hpp" "shared/sdk/Enums_Internal.hpp" "shared/sdk/GUIPrimitiveSystem.hpp" @@ -8813,7 +8842,10 @@ if(REF_BUILD_RE8_SDK OR REF_BUILD_FRAMEWORK) # build-re8-sdk "shared/sdk/regenny/sf6/via/typeinfo/TypeInfo.hpp" "shared/sdk/regenny/sf6/via/vec3.hpp" "shared/sdk/regenny/sf6/via/vec4.hpp" + "shared/sdk/renderer/PipelineState.hpp" "shared/sdk/renderer/RenderResource.hpp" + "shared/sdk/resources/MasterMaterialResource.hpp" + "shared/sdk/resources/ShaderResource.hpp" ) list(APPEND RE8SDK_SOURCES @@ -9103,6 +9135,7 @@ if(REF_BUILD_DMC5_SDK OR REF_BUILD_FRAMEWORK) # build-dmc5-sdk "shared/sdk/SystemArray.cpp" "shared/sdk/helpers/NativeObject.cpp" "shared/sdk/renderer/RenderResource.cpp" + "shared/sdk/resources/MasterMaterialResource.cpp" "shared/sdk/Application.hpp" "shared/sdk/Enums_Internal.hpp" "shared/sdk/GUIPrimitiveSystem.hpp" @@ -9876,7 +9909,10 @@ if(REF_BUILD_DMC5_SDK OR REF_BUILD_FRAMEWORK) # build-dmc5-sdk "shared/sdk/regenny/sf6/via/typeinfo/TypeInfo.hpp" "shared/sdk/regenny/sf6/via/vec3.hpp" "shared/sdk/regenny/sf6/via/vec4.hpp" + "shared/sdk/renderer/PipelineState.hpp" "shared/sdk/renderer/RenderResource.hpp" + "shared/sdk/resources/MasterMaterialResource.hpp" + "shared/sdk/resources/ShaderResource.hpp" ) list(APPEND DMC5SDK_SOURCES @@ -10164,6 +10200,7 @@ if(REF_BUILD_MHRISE_SDK OR REF_BUILD_FRAMEWORK) # build-mhrise-sdk "shared/sdk/SystemArray.cpp" "shared/sdk/helpers/NativeObject.cpp" "shared/sdk/renderer/RenderResource.cpp" + "shared/sdk/resources/MasterMaterialResource.cpp" "shared/sdk/Application.hpp" "shared/sdk/Enums_Internal.hpp" "shared/sdk/GUIPrimitiveSystem.hpp" @@ -10937,7 +10974,10 @@ if(REF_BUILD_MHRISE_SDK OR REF_BUILD_FRAMEWORK) # build-mhrise-sdk "shared/sdk/regenny/sf6/via/typeinfo/TypeInfo.hpp" "shared/sdk/regenny/sf6/via/vec3.hpp" "shared/sdk/regenny/sf6/via/vec4.hpp" + "shared/sdk/renderer/PipelineState.hpp" "shared/sdk/renderer/RenderResource.hpp" + "shared/sdk/resources/MasterMaterialResource.hpp" + "shared/sdk/resources/ShaderResource.hpp" ) list(APPEND MHRISESDK_SOURCES @@ -11227,6 +11267,7 @@ if(REF_BUILD_SF6_SDK OR REF_BUILD_FRAMEWORK) # build-sf6-sdk "shared/sdk/SystemArray.cpp" "shared/sdk/helpers/NativeObject.cpp" "shared/sdk/renderer/RenderResource.cpp" + "shared/sdk/resources/MasterMaterialResource.cpp" "shared/sdk/Application.hpp" "shared/sdk/Enums_Internal.hpp" "shared/sdk/GUIPrimitiveSystem.hpp" @@ -12000,7 +12041,10 @@ if(REF_BUILD_SF6_SDK OR REF_BUILD_FRAMEWORK) # build-sf6-sdk "shared/sdk/regenny/sf6/via/typeinfo/TypeInfo.hpp" "shared/sdk/regenny/sf6/via/vec3.hpp" "shared/sdk/regenny/sf6/via/vec4.hpp" + "shared/sdk/renderer/PipelineState.hpp" "shared/sdk/renderer/RenderResource.hpp" + "shared/sdk/resources/MasterMaterialResource.hpp" + "shared/sdk/resources/ShaderResource.hpp" ) list(APPEND SF6SDK_SOURCES @@ -12290,6 +12334,7 @@ if(REF_BUILD_DD2_SDK OR REF_BUILD_FRAMEWORK) # build-dd2-sdk "shared/sdk/SystemArray.cpp" "shared/sdk/helpers/NativeObject.cpp" "shared/sdk/renderer/RenderResource.cpp" + "shared/sdk/resources/MasterMaterialResource.cpp" "shared/sdk/Application.hpp" "shared/sdk/Enums_Internal.hpp" "shared/sdk/GUIPrimitiveSystem.hpp" @@ -13063,7 +13108,10 @@ if(REF_BUILD_DD2_SDK OR REF_BUILD_FRAMEWORK) # build-dd2-sdk "shared/sdk/regenny/sf6/via/typeinfo/TypeInfo.hpp" "shared/sdk/regenny/sf6/via/vec3.hpp" "shared/sdk/regenny/sf6/via/vec4.hpp" + "shared/sdk/renderer/PipelineState.hpp" "shared/sdk/renderer/RenderResource.hpp" + "shared/sdk/resources/MasterMaterialResource.hpp" + "shared/sdk/resources/ShaderResource.hpp" ) list(APPEND DD2SDK_SOURCES diff --git a/cmake.toml b/cmake.toml index d1cf54c4b..48e6e3eec 100644 --- a/cmake.toml +++ b/cmake.toml @@ -184,7 +184,7 @@ tag = "v1.34.10" [fetch-content.kananlib] git = "https://github.com/cursey/kananlib" -tag = "203dc31c5d8ba2cffdb780ae38b2eb2080bb099c" +tag = "65c205e9f3f0985fd298281a77098d48b9065e87" [target.utility] type = "static" diff --git a/shared/sdk/renderer/PipelineState.hpp b/shared/sdk/renderer/PipelineState.hpp new file mode 100644 index 000000000..8ada5710e --- /dev/null +++ b/shared/sdk/renderer/PipelineState.hpp @@ -0,0 +1,7 @@ +#pragma once + +namespace sdk::renderer { +struct PipelineState { + // Opaque data (for now) +}; +} \ No newline at end of file diff --git a/shared/sdk/resources/MasterMaterialResource.cpp b/shared/sdk/resources/MasterMaterialResource.cpp new file mode 100644 index 000000000..d44aba119 --- /dev/null +++ b/shared/sdk/resources/MasterMaterialResource.cpp @@ -0,0 +1,73 @@ +#include +#include +#include + +#include "../MurmurHash.hpp" + +#include "MasterMaterialResource.hpp" + +namespace sdk::renderer { +MasterMaterialResource::FindFn MasterMaterialResource::get_find_fn() { + static FindFn fn = []() -> FindFn { + spdlog::info("[MasterMaterialResource::get_find_fn] Scanning for MasterMaterialResource::find"); + + const auto game = utility::get_executable(); + const auto string_data = utility::scan_string(game, "UpdateDepthBlockerState"); + + if (!string_data) { + spdlog::error("[MasterMaterialResource::get_find_fn] Failed to find UpdateDepthBlockerState string"); + return nullptr; + } + + const auto string_ref = utility::scan_displacement_reference(game, *string_data); + + if (!string_ref) { + spdlog::error("[MasterMaterialResource::get_find_fn] Failed to find UpdateDepthBlockerState reference"); + return nullptr; + } + + const auto next_fn_call = utility::scan_mnemonic(*string_ref + 4, 100, "CALL"); + + if (!next_fn_call) { + spdlog::error("[MasterMaterialResource::get_find_fn] Failed to find next CALL instruction"); + return nullptr; + } + + const auto next_next_fn_call = utility::scan_mnemonic(*next_fn_call + 5, 100, "CALL"); + + if (!next_next_fn_call) { + spdlog::error("[MasterMaterialResource::get_find_fn] Failed to find next next CALL instruction"); + return nullptr; + } + + const auto result = utility::resolve_displacement(*next_next_fn_call); + + if (!result) { + spdlog::error("[MasterMaterialResource::get_find_fn] Failed to resolve displacement"); + return nullptr; + } + + spdlog::info("[MasterMaterialResource::get_find_fn] Found MasterMaterialResource::find at {0:x}", *result); + + return (FindFn)*result; + }(); + + return fn; +} + +sdk::renderer::PipelineState* MasterMaterialResource::find(uint32_t murmur_hash, uint8_t unk) { + auto fn = get_find_fn(); + + if (fn == nullptr) { + return nullptr; + } + + return fn(this, murmur_hash, unk); +} + +sdk::renderer::PipelineState* MasterMaterialResource::find(std::string_view name, uint8_t unk) { + const auto murmur_hash = sdk::murmur_hash::calc32_as_utf8(name.data()); + + return find(murmur_hash, unk); +} +} \ No newline at end of file diff --git a/shared/sdk/resources/MasterMaterialResource.hpp b/shared/sdk/resources/MasterMaterialResource.hpp new file mode 100644 index 000000000..19b20d3d4 --- /dev/null +++ b/shared/sdk/resources/MasterMaterialResource.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include + +#include "ShaderResource.hpp" +#include "../renderer/PipelineState.hpp" + +namespace sdk::renderer { +class MasterMaterialResource : public ShaderResource { +public: + using FindFn = PipelineState* (*)(MasterMaterialResource*, uint32_t, uint8_t); + static FindFn get_find_fn(); + + PipelineState* find(uint32_t murmur_hash, uint8_t unk); + PipelineState* find(std::string_view name, uint8_t unk); + +private: +}; +} \ No newline at end of file diff --git a/shared/sdk/resources/ShaderResource.hpp b/shared/sdk/resources/ShaderResource.hpp new file mode 100644 index 000000000..a77c0dd47 --- /dev/null +++ b/shared/sdk/resources/ShaderResource.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "../ResourceManager.hpp" + +namespace sdk::renderer { +class ShaderResource : public sdk::Resource { +public: + +private: +}; +} \ No newline at end of file diff --git a/src/mods/Graphics.cpp b/src/mods/Graphics.cpp index 2f086be44..57f1dba82 100644 --- a/src/mods/Graphics.cpp +++ b/src/mods/Graphics.cpp @@ -114,6 +114,7 @@ void Graphics::on_draw_ui() { m_ray_tracing_tweaks->draw("Enable Ray Tracing Tweaks"); if (m_ray_tracing_tweaks->value()) { + m_ray_trace_disable_raster_shadows->draw("Disable Raster Shadows (with PT)"); m_ray_trace_type->draw("Ray Trace Type"); const auto clone_tooltip = @@ -817,15 +818,35 @@ void Graphics::apply_ray_tracing_tweaks() { static const auto setBounce = rt_t->get_method("setBounce"); static const auto setSpp = rt_t->get_method("setSpp"); - auto fix = [this](sdk::ManagedObject* target, int32_t rt_type) { + bool any_pt = false; + + static const auto renderer_t = sdk::find_type_definition("via.render.Renderer"); + + static const auto set_DynamicShadowEnable = renderer_t != nullptr ? renderer_t->get_method("set_DynamicShadowEnable") : nullptr; + static const auto get_DynamicShadowEnable = renderer_t != nullptr ? renderer_t->get_method("get_DynamicShadowEnable") : nullptr; + + const auto context = sdk::get_thread_context(); + + auto fix = [this, &any_pt, &context](sdk::ManagedObject* target, int32_t rt_type) { if (target == nullptr) { return; } - const auto context = sdk::get_thread_context(); - if (set_RaytracingMode != nullptr && rt_type > (int32_t)RayTraceType::Disabled) { + any_pt = any_pt || rt_type == (int32_t)RayTraceType::Pure; set_RaytracingMode->call(context, target, rt_type - 1); + + if (rt_type == (int32_t)RayTraceType::Pure && m_ray_trace_disable_raster_shadows->value()) { + if (get_DynamicShadowEnable != nullptr && set_DynamicShadowEnable != nullptr) { + const bool is_shadow_enabled = get_DynamicShadowEnable->call(context); + + if (is_shadow_enabled) { + set_DynamicShadowEnable->call(context, false); + } + + m_was_shadows_disabled = true; + } + } } if (rt_type == (int32_t)RayTraceType::Hybrid || rt_type == (int32_t)RayTraceType::Pure) { @@ -841,6 +862,13 @@ void Graphics::apply_ray_tracing_tweaks() { fix(m_rt_component.get(), m_ray_trace_type->value()); fix(m_rt_cloned_component.get(), m_ray_trace_clone_type_true->value()); + + // Restore shadows if they were disabled + if ((!any_pt || !m_ray_trace_disable_raster_shadows->value()) && m_was_shadows_disabled && set_DynamicShadowEnable != nullptr) { + spdlog::info("[Graphics] Restoring shadows"); + set_DynamicShadowEnable->call(context, true); + m_was_shadows_disabled = false; + } } void* Graphics::rt_draw_hook(REComponent* rt, void* draw_context, void* r8, void* r9) { diff --git a/src/mods/Graphics.hpp b/src/mods/Graphics.hpp index 3f3e4a709..b0b33f6a2 100644 --- a/src/mods/Graphics.hpp +++ b/src/mods/Graphics.hpp @@ -114,6 +114,8 @@ class Graphics : public Mod { }; const ModCombo::Ptr m_ray_trace_type{ ModCombo::create(generate_name("RayTraceType"), s_ray_trace_type) }; + const ModToggle::Ptr m_ray_trace_disable_raster_shadows{ ModToggle::create(generate_name("RayTraceDisableRasterShadowsWithPT"), true) }; + bool m_was_shadows_disabled{ false }; const ModCombo::Ptr m_ray_trace_clone_type_true{ ModCombo::create(generate_name("RayTraceTrueCloneType"), s_ray_trace_type) }; const ModCombo::Ptr m_ray_trace_clone_type_pre{ ModCombo::create(generate_name("RayTraceCloneTypePre"), s_ray_trace_type) }; const ModCombo::Ptr m_ray_trace_clone_type_post{ ModCombo::create(generate_name("RayTraceCloneTypePost"), s_ray_trace_type) }; @@ -142,6 +144,7 @@ class Graphics : public Mod { #if TDB_VER >= 69 *m_ray_tracing_tweaks, *m_ray_trace_type, + *m_ray_trace_disable_raster_shadows, *m_ray_trace_clone_type_true, *m_ray_trace_clone_type_pre, *m_ray_trace_clone_type_post,