From 186a83ded716920f89ac97d7e81511bdb665fb9b Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Thu, 15 Jan 2026 20:17:39 -0500 Subject: More WIP Signed-off-by: Andrew Opalach --- Config.cs | 19 +- Plugin.cs | 1185 ++++++++++++++++++++++++++++++++----------------------------- 2 files changed, 639 insertions(+), 565 deletions(-) diff --git a/Config.cs b/Config.cs index 83635fa..1d78110 100755 --- a/Config.cs +++ b/Config.cs @@ -57,7 +57,7 @@ namespace MHWNewCamera } public String Name => "MHWNewCamera"; - public String Version => "3.1"; + public String Version => "4.0"; private static Dictionary buttonMap = new Dictionary { @@ -118,15 +118,16 @@ namespace MHWNewCamera public bool ApplyShadowRadius { get; set; } = false; public bool HigherShadowDetailInHoarfrost { get; set; } = false; public bool SSAOAdjustments { get; set; } = false; - public bool DisableLodLimits { get; set; } = false; - public bool ApplyLodFactors { get; set; } = false; - public float FoliageLodBias { get; set; } = 3.0f; - public float TerrainLodBias { get; set; } = 6.0f; - public float SnowLodBias { get; set; } = 32.0f; - public float FoliageLodFactor { get; set; } = 0.0f; - public float TerrainLodFactor { get; set; } = 0.0f; + public bool SSRAdjustments { get; set; } = false; + public bool EnableHQMode { get; set; } = false; + public bool DisableLODLimits { get; set; } = false; + public float FoliageLODBias { get; set; } = 3.0f; + public float TerrainLODBias { get; set; } = 16.0f; + public float FoliageLODFactor { get; set; } = 0.0f; + public float TerrainLODFactor { get; set; } = 0.0f; + public float SnowLODBias { get; set; } = 32.0f; + public bool ApplyLODFactors { get; set; } = false; public bool LargerFoliageSwayRange { get; set; } = false; public bool DisableReducedRateAnimations { get; set; } = false; - public bool HQMode { get; set; } = false; } } diff --git a/Plugin.cs b/Plugin.cs index d0946e4..3446961 100755 --- a/Plugin.cs +++ b/Plugin.cs @@ -20,9 +20,14 @@ using SharpPluginLoader.Core.Components; using SharpPluginLoader.Core.Configuration; // @TODO: +// - Crash leaving gallery? +// - Better name for unknownPtr. +// - Hook for snow lod bias settings. +// - hook for "is underwater". +// - Read lod bias setting from in-game value. // - List out all binds and try to work out better mappings. +// - Layers concept? // - Attempt to reduce noise in binds table. -// - Overall cleanup // - Make left stick input a curve like Wilds. // - Option to ignore camera change (update position, test open book and close). // - Simplify and document input handling/blocking logic. @@ -50,15 +55,18 @@ using SharpPluginLoader.Core.Configuration; // - For all cases roll should an extra consideration. // Constant FOV: // - In quest book/board GUI (uses player camera). -// previousCameraAnimState = 5 (Don't apply offset): +// previousCameraAnimState = 8 (FOV Only): +// - Push through roots. +// previousCameraAnimState = 5 (FOV Only): // - Zoom into quest board or The Handler's book. // - Open map animation. // - Entering/Leaving tent. -// previousCameraAnimState = 4 (We choose to apply offset): +// previousCameraAnimState = 4 (FOV Only): // - Quest depart/return. // - Traveling on the lift in Astera. // previousCameraAnimState = 2 (Apply offset): // - Point camera towards quest board. +// - Crawl under object. // Player camera is the target of a transition: // - Leaving dialoge with NPC (The Handler, The Smithy, pub lasses, etc). // - Getting up from hot spring. @@ -69,6 +77,7 @@ using SharpPluginLoader.Core.Configuration; // - Look at monster. // - Scoutflies point in a direction. // - Mount monster. +// - Dive. // // Free Camera: // - Toggle rapidly and there should be no visual jump. @@ -108,7 +117,7 @@ namespace MHWNewCamera }; public struct SSLRParameters { - public float sslrLoopCount; // +0xE628 + public int sslrLoopCount; // +0xE628 public float sslrLoopCountFactorForCBR; // +0xE62C public float sslrEliminateDepth; // +0xE630 public float sslrAccurateThreshold; // +0xE644 @@ -117,12 +126,12 @@ namespace MHWNewCamera public float sslrImportanceBias; // +0xE638 public float sslrMipScale; // +0xE63C public float sslrMipBias; // +0xE640 - public float sslrDitherResolve; // +0xB43F + public bool sslrDitherResolve; // +0xB43F public float sslrEdgeAttenRate; // +0xB428 - public float sslrMip0CountThreshold; // +0xB438 + public int sslrMip0CountThreshold; // +0xB438 public float sslrDepthEliminateRate; // +0xB42C - public float sslrUseMipmap; // +0xE650 - public float sslrGBufferJitter; // +0xB440 + public bool sslrUseMipmap; // +0xE650 + public bool sslrGBufferJitter; // +0xB440 }; public unsafe class Plugin : IPlugin @@ -135,6 +144,9 @@ namespace MHWNewCamera private bool disableMod = false; + private static readonly MtObject sMain = SingletonManager.GetSingleton("sMhMain")!; + private static readonly MtObject sTime = SingletonManager.GetSingleton("sTime")!; + #if SIMPLE_KEYBOARD_LAYER private bool keyboardEnabled = false; private int keyboardLookValue; @@ -211,31 +223,26 @@ namespace MHWNewCamera return (lastPadDown & (uint)button) != (uint)button && (prevPadDown & (uint)button) == (uint)button; } - private float alternateNearClip = 2.0f; - - private bool skipDofHook = true; - private bool forceOffDof = false; - private bool? wasDofAllowed = null; - private nint dofPointer = 0x0; - - private bool HQMode = false; - - private bool ssaoOverrides = false; - private SSAOParameters internalSSAOParams; - private SSAOParameters overrideSSAOParams; - private float snowField4GlobalLODParam = 8.0f; // +0x5718 - //private float snowField4AllowTesselationHQ; // +0x5741 - //private float snowField4LODBiasHQ; // +0x5748 - private bool applyRendererOverrides = false; - private float plusRight = 0.0f; private float plusForward = 0.0f; - private delegate void SetCameraDelegate(nint unknownPtr); - private Hook? setCameraHook; - - private delegate void CalculateCameraDelegate(nint unknownPtr); - private Hook? calculateCameraHook; + private delegate void ProcessCameraDelegate(nint cameraPointer); + private Hook? setCameraHook; + private Hook? calculateCameraHook; + private Hook? checkCameraHook; + private delegate void ViewModeDelegate(nint viewModeObject); + private Hook? startViewModeHook; + /* + private NativeAction startViewMode; + private NativeAction stopViewMode; + private NativeAction processViewMode; + private Patch viewMode1; + private Patch viewMode1_1; + private Patch viewMode2; + private Patch viewMode3; + private Patch viewMode4; + private nint psuedoViewModeObject; + */ private delegate void SetCameraTentDelegate(nint unknownPtr); private Hook? setCameraTentHook; @@ -251,9 +258,6 @@ namespace MHWNewCamera private delegate void ShadowCascadeDelegate(nint unknownPtr, nint unknownPtr2); private Hook? shadowCascadeHook; - private delegate void EvalDepthOfFieldDelegate(nint unknownPtr, nint unknownPtr2); - private Hook? evalDepthOfFieldHook; - private delegate void RendererSetDelegate(nint unknownPtr, nint unknownPtr2, nint unknownPtr3); private Hook? rendererSetHook; @@ -266,7 +270,7 @@ namespace MHWNewCamera private delegate void CollisionCheckDelegate(nint unknownPtr, nint unknownPtr2); private Hook? collisionCheckHook; - private delegate void CameraEffectDelegate(nint unknownPtr, nint unknownPtr2, nint unknownPtr3, double unknownF); + private delegate void CameraEffectDelegate(nint unknownPtr, nint unknownPtr2, nint unknownPtr3); private Hook? cameraEffectHook; private Patch swapMinimapFollowsCamera; @@ -274,6 +278,11 @@ namespace MHWNewCamera private bool uiToggled = false; private Patch jmpOverUi; + private bool dofDisabled = false; + private Patch jmpOverDof; + + private float alternateNearClip = 2.0f; + private bool disableCharacterFade = false; private Patch noopCharacterFade; @@ -317,41 +326,47 @@ namespace MHWNewCamera shadowRes4_3x.Disable(); } - private float foliageLodBias; - private float terrainLodBias; - private float prevFoliageLodBias = 0.0f; - private float prevTerrainLodBias = 0.0f; - private float foliageLodFactor; - private float terrainLodFactor; - private bool applyLodFactors; + private bool ssaoAdjustments = false; + private SSAOParameters internalSSAOParams; + + private bool ssrAdjustments = false; + private SSLRParameters internalSSRParams; + + private bool enableHQMode = false; + + private float foliageLODBias; + private float terrainLODBias; + private float prevFoliageLODBias = 0.0f; + private float prevTerrainLODBias = 0.0f; + private float foliageLODFactor; + private float terrainLODFactor; + private float snowField4GlobalLODParam = 8.0f; // +0x5718 + //private float snowField4AllowTesselationHQ; // +0x5741 + //private float snowField4LODBiasHQ; // +0x5748 + private bool applyLODFactors; - private bool disableLodLimits = false; - private Patch defaultViewModeLodLimit; - private Patch defaultViewModeLodLimit_1; - private Patch defaultViewModeLodLimit_2; + private bool disableLODLimits = false; + private Patch defaultViewModeLODLimit; + private Patch defaultViewModeLODLimit_1; + private Patch defaultViewModeLODLimit_2; - private void disableLodLimitsEnable() + private void disableLODLimitsEnable() { - defaultViewModeLodLimit.Enable(); - defaultViewModeLodLimit_1.Enable(); - defaultViewModeLodLimit_2.Enable(); + defaultViewModeLODLimit.Enable(); + defaultViewModeLODLimit_1.Enable(); + defaultViewModeLODLimit_2.Enable(); } - private void disableLodLimitsDisable() + private void disableLODLimitsDisable() { - defaultViewModeLodLimit.Disable(); - defaultViewModeLodLimit_1.Disable(); - defaultViewModeLodLimit_2.Disable(); + defaultViewModeLODLimit.Disable(); + defaultViewModeLODLimit_1.Disable(); + defaultViewModeLODLimit_2.Disable(); } private bool largerFoliageSwayRange = false; private Patch addressHigherValueForFoliageSway; - private bool disableVolumeDownsample = false; - private Patch zeroVolumetricDownsample; - //private Patch zeroVolumetricDownsample2; - //private Patch zeroVolumetricDownsample3; - private bool disableReducedRateAnimations = false; private Patch zeroFrameSkip; @@ -361,8 +376,9 @@ namespace MHWNewCamera private Patch underwaterCamera3; private Patch underwaterCamera4; private Patch underwaterCamera5; - private byte[] prevUnderwaterValues = new byte[120]; - private nint prevUnderwaterPointer = 0x0; + + private bool disableVolumeDownsample = false; + private Patch zeroVolumetricDownsample; private bool disableCollision = false; private bool disableExtraCollision = false; @@ -429,6 +445,15 @@ namespace MHWNewCamera private bool disableHotSpringsSteam = false; private Patch jmpOverHotSpringsSteam; + private NativeAction setPassiveMode; + private NativeAction setPlayerController1; + private NativeAction setPlayerController2; + + private bool enableCrawl = false; + private NativeAction procEnvironmentCollision; + private nint psuedoObject1; + private nint psuedoObject2; + private static readonly MtObject sOtomo = SingletonManager.GetSingleton("sOtomo")!; // Gui strings. @@ -442,15 +467,6 @@ namespace MHWNewCamera private int frameTick = 0; #endif - private NativeAction setPassiveMode; - private NativeAction setPlayerController1; - private NativeAction setPlayerController2; - - private bool enableCrawl = false; - private NativeAction procEnvironmentCollision; - private nint psuedoObject1; - private nint psuedoObject2; - private void debugLog(string message) { #if LOG_DEBUG_MESSAGES @@ -504,9 +520,10 @@ namespace MHWNewCamera applyShadowBias = config.ApplyShadowRange; applyShadowRadius = config.ApplyShadowRadius; lowShadowDetailOverride = config.HigherShadowDetailInHoarfrost; - ssaoOverrides = config.SSAOAdjustments; - HQMode = config.HQMode; - disableLodLimits = config.DisableLodLimits; + ssaoAdjustments = config.SSAOAdjustments; + ssrAdjustments = config.SSRAdjustments; + enableHQMode = config.EnableHQMode; + disableLODLimits = config.DisableLODLimits; largerFoliageSwayRange = config.LargerFoliageSwayRange; disableReducedRateAnimations = config.DisableReducedRateAnimations; @@ -532,19 +549,64 @@ namespace MHWNewCamera // Asserts based on version 15.23.00. // @TODO: Handle addr not found. + // @TODO: Pick camera functions out of the upper function (they happen in immediate succession). // Place where we can check camera state early. nint addr = PatternScanner.FindFirst(Pattern.FromString("40 53 48 81 EC 80 00 00 00 8B 81 B0 17 00 00 48 8B D9 85 C0 ?? ??")); #if ADDR_ASSERTS Trace.Assert(addr == 0x141FA11A0); // nint #endif - setCameraHook = Hook.Create(addr, SetCameraHook); + setCameraHook = Hook.Create(addr, SetCameraHook); // Place where we can adjust the camera position. addr = PatternScanner.FindFirst(Pattern.FromString("48 8B C4 55 41 57 48 81 EC D8 00 00 00 44 0F 29 40 B8 45 33 FF ?? ?? ?? ?? ?? ?? ?? ?? ?? 48 8B E9")); #if ADDR_ASSERTS Trace.Assert(addr == 0x141FA5380); // nint #endif - calculateCameraHook = Hook.Create(addr, CalculateCameraHook); + calculateCameraHook = Hook.Create(addr, CalculateCameraHook); + + checkCameraHook = Hook.Create(0x141FA2130, CheckCameraHook); + + startViewModeHook = Hook.Create(0x1405842E0, StartViewModeHook); + /* + unchecked + { + // @TODO: View mode collision check here + // MonsterHunterWorld.exe+23268DF - E8 2C020000 - call MonsterHunterWorld.exe+2326B10 + // can be overridden by the player collision function here + // MonsterHunterWorld.exe+23268DF - E8 0C010000 - call MonsterHunterWorld.exe+23269F0 + // to evaluate differences. + // Other TODOs for View Mode interop. + // - Don't colide with water. + // - Disable box around player collision. + // - View mode fade on close to player. + // - Weird LOD differences when in view mode. + startViewMode = new NativeAction(0x1405842E0); + stopViewMode = new NativeAction(0x1405825A0); + processViewMode = new NativeAction(0x140582820); + viewMode1 = new Patch((nint)0x141ADFAB9, [0x90, 0x90]); // Check input. + viewMode1.Enable(); + // rax = 0x73 -> 0x43 + //viewMode2 = new Patch((nint)0x1405843F8, [0x48, 0x8B, 0x43, 0x10, 0x90]); + //viewMode2.Enable(); + viewMode3 = new Patch((nint)0x1405844ED, [0x90, 0x90, 0x90, 0x90, 0x90]); // Screen flash related. + viewMode3.Enable(); + //viewMode2 = new Patch((nint)0x1405844CB, [0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90]); // Disables view mode from starting. + //viewMode2.Enable(); + // + //viewMode1 = new Patch((nint)0x140582578, [0xEB]); + ////viewMode1.Enable(); + //viewMode1_1 = new Patch((nint)0x140582F13, [0xEB]); + ////viewMode1_1.Enable(); + //viewMode2 = new Patch((nint)0x1405831A5, [0x90, 0x90, 0x90, 0x90]); + ////viewMode2.Enable(); + //viewMode3 = new Patch((nint)0x1405831A5 + 0xC, [0x90, 0x90, 0x90, 0x90, 0x90]); + ////viewMode3.Enable(); + //viewMode4 = new Patch((nint)0x1405831A5 + 0xC + 0x11, [0x90, 0x90, 0x90, 0x90, 0x90]); + ////viewMode4.Enable(); + psuedoViewModeObject = (nint)NativeMemory.AllocZeroed(240); + MemoryUtil.WriteBytes(psuedoViewModeObject, [0x28, 0x23, 0xFB, 0x42, 0x01, 0x00, 0x00, 0x00]); + } + */ // Very special case for inside tent. addr = PatternScanner.FindFirst(Pattern.FromString("48 89 5C 24 10 48 89 6C 24 18 48 89 7C 24 20 41 56 48 83 EC 60 48 8B D9 0F 57 DB ?? ?? ?? ?? ?? ?? ?? 0F 57 D2 33 D2")); @@ -573,12 +635,6 @@ namespace MHWNewCamera #endif shadowCascadeHook = Hook.Create(addr, ShadowCascadeHook); - addr = PatternScanner.FindFirst(Pattern.FromString("40 53 57 41 57 48 83 EC 20 80 B9 DD 01 00 00 00 4C 8B FA 48 8B D9 74 2B 48 8B 0D 99 0F DA 02 48 8B 01 FF 90 A8 00 00 00 84 C0 74 17 80 BB DE 01 00 00 00")); -#if ADDR_ASSERTS - Trace.Assert(addr == 0x1424233B0); // nint, nint -#endif - evalDepthOfFieldHook = Hook.Create(addr, EvalDepthOfFieldHook); - rendererSetHook = Hook.Create(0x141ABDED0, RendererSetHook); // nint, nint, nint addr = PatternScanner.FindFirst(Pattern.FromString("48 89 5C 24 08 57 44 8B 9A 60 01 00 00 48 8B DA 41 0F BF 40 08 4D 8B D0 89 82 80 01 00 00 BF 00 10 00 00 41 0F BF 40 0A 89 82 84 01 00 00 41 0F BF 40 0C 89 82 78 01 00 00 41 0F BF 40 0E 89 82 7C 01 00 00")); @@ -596,7 +652,8 @@ namespace MHWNewCamera collisionCheckHook = Hook.Create(0x1411C4E50, CollisionCheckHook); - cameraEffectHook = Hook.Create(0x1416D4890, CameraEffectHook); + //cameraEffectHook = Hook.Create(0x1416D4890, CameraEffectHook); + cameraEffectHook = Hook.Create(0x141AB6AE0, CameraEffectHook); unchecked { @@ -612,6 +669,8 @@ namespace MHWNewCamera #endif jmpOverUi = new Patch(addr + 0x1c, [0xE9, 0x65, 0x01, 0x00, 0x00, 0x90]); + jmpOverDof = new Patch((nint)0x1424233C6, [0xEB]); // je -> jmp + addr = PatternScanner.FindFirst(Pattern.FromString("CC 48 89 5C 24 18 57 48 83 EC 30 48 89 74 24 48 48 8B D9 E8 ?? ?? ?? ?? 48 8B 8B B0 0D 00 00 8B 81 54 89 00 00 C1 E8 0D A8 01")); #if ADDR_ASSERTS Trace.Assert(addr == 0x1411A6A9F); @@ -632,14 +691,15 @@ namespace MHWNewCamera shadowRes1_2 = new Patch(addr + 0x68, [0x59]); // movss -> mulss shadowRes1_3 = new Patch(addr + 0x77, [0x59]); // movss -> mulss + // shadowRes2/3 control the detail of the infrequently updated fallback shadows. addr = PatternScanner.FindFirst(Pattern.FromString("83 FA FF 74 06 89 91 1C 55 00 00 8B 91 30 55 00 00 83 FA FF 7F 06 8B 91 1C 55 00 00 85 D2 74 4B 83 EA 01 74 3B 83 EA 01 74 2B 83 EA 01 74 1B 83 FA 01 74 0B C7 81 20 55 00 00 01 00 00 00 C3 C7 81 20 55 00 00 00 10 00 00")); #if ADDR_ASSERTS Trace.Assert(addr == 0x142287A50); #endif shadowRes2 = new Patch(addr + 0x3F, [ - 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xC3, - 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xC3, - 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xC3, // Has to be 8192 for the fallback lower res shadow to be aligned. + 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC3, + 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC3, + 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC3, // Value the game picks. 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC3, 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xC3 ]); @@ -649,9 +709,9 @@ namespace MHWNewCamera Trace.Assert(addr == 0x142287AD0); #endif shadowRes3 = new Patch(addr + 0x34, [ - 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xC3, - 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xC3, - 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xC3, + 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC3, + 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC3, + 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC3, 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0xC3, 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xC3 ]); @@ -667,7 +727,7 @@ namespace MHWNewCamera // Shadow Quality: High the result will be 15360. Going past some number around 16384 will crash // the game. I think it's related to N/64 >= 256. shadowRes4_3x = new Patch(addr + 0x29, [ - 0xB8, 0x00, 0x14, 0x00, 0x00, 0xEB, 0x21 // This case is used for Low, Medium and High in-game. + 0xB8, 0x40, 0x15, 0x00, 0x00, 0xEB, 0x21 // This case is used for Low, Medium and High in-game. ]); if (tripleShadowRes && !disableMod) { @@ -679,24 +739,24 @@ namespace MHWNewCamera #if ADDR_ASSERTS Trace.Assert(addr == 0x141B1A0B4); #endif - defaultViewModeLodLimit = new Patch(addr + 0x40, [0x07, 0x74, 0x0A, 0xC7, 0x83, 0xDC, 0xEB, 0x00, 0x00, 0x07]); + defaultViewModeLODLimit = new Patch(addr + 0x40, [0x07, 0x74, 0x0A, 0xC7, 0x83, 0xDC, 0xEB, 0x00, 0x00, 0x07]); // In room. addr = PatternScanner.FindFirst(Pattern.FromString("8B 9F CC 00 00 00 81 FB F9 01 00 00 74 0C 8B CB E8 95 3F 65 01 83 F8 05 75 11 48 8B 0D 61 C8 F6 04 BA 02 00 00 00 E8 DF 2D 8C 01 48 8B 0D A0 C7 F6 04 8B D3")); #if ADDR_ASSERTS Trace.Assert(addr == 0x140257AE6); #endif - defaultViewModeLodLimit_1 = new Patch(addr + 0x22, [0x07]); + defaultViewModeLODLimit_1 = new Patch(addr + 0x22, [0x07]); // Forging/Changing Equipment. addr = PatternScanner.FindFirst(Pattern.FromString("BA 02 00 00 00 E8 6E C0 80 00 48 8B 74 24 38 48 8B 57 28 48 8D 4F 30 E8 4C 79 B4 FE 48 8B 0D 0D FF A6 03 BA 04 00 00 00 E8 8B 64 3C 00 48 8B 05 D4 01 A7 03 80 B8 FD 46 01 00 00")); #if ADDR_ASSERTS Trace.Assert(addr == 0x141754438); #endif - defaultViewModeLodLimit_2 = new Patch(addr + 0x24, [0x07]); - if (disableLodLimits && !disableMod) + defaultViewModeLODLimit_2 = new Patch(addr + 0x24, [0x07]); + if (disableLODLimits && !disableMod) { - disableLodLimitsEnable(); + disableLODLimitsEnable(); } addr = PatternScanner.FindFirst(Pattern.FromString("74 4D 33 C0 48 81 C1 00 02 00 00 F3 0F 10 11 0F 2F CA 72 0C FF C0 48 83 C1 04 83 F8 03 72 EC C3")); @@ -806,49 +866,49 @@ namespace MHWNewCamera } } - private bool areLodFactorsDefault() + private bool areLODFactorsDefault() { - return foliageLodBias == 3.0f && terrainLodBias == 3.0f && foliageLodFactor == 1.0f && terrainLodFactor == 1.0f && snowField4GlobalLODParam == 8.0f; + return foliageLODBias == 3.0f && terrainLODBias == 3.0f && foliageLODFactor == 1.0f && terrainLODFactor == 1.0f && snowField4GlobalLODParam == 8.0f; } - private bool areLodFactorsSet() + private bool areLODFactorsSet() { nint baseAddr = MemoryUtil.Read(0x1451C4368); - float foliageLod1 = MemoryUtil.Read(baseAddr + 0x21C); - float terrainLod1 = MemoryUtil.Read(baseAddr + 0x220); - float foliageLod2 = MemoryUtil.Read(baseAddr + 0x224); - float terrainLod2 = MemoryUtil.Read(baseAddr + 0x228); - float snowLod1 = MemoryUtil.Read(baseAddr + 0x5718); - return foliageLod1 == foliageLodBias && terrainLod1 == terrainLodBias && - foliageLod2 == foliageLodFactor && terrainLod2 == terrainLodFactor && - snowLod1 == snowField4GlobalLODParam; + float foliageLOD1 = MemoryUtil.Read(baseAddr + 0x21C); + float terrainLOD1 = MemoryUtil.Read(baseAddr + 0x220); + float foliageLOD2 = MemoryUtil.Read(baseAddr + 0x224); + float terrainLOD2 = MemoryUtil.Read(baseAddr + 0x228); + float snowLOD1 = MemoryUtil.Read(baseAddr + 0x5718); + return foliageLOD1 == foliageLODBias && terrainLOD1 == terrainLODBias && + foliageLOD2 == foliageLODFactor && terrainLOD2 == terrainLODFactor && + snowLOD1 == snowField4GlobalLODParam; } - private void setLodFactors(bool toggleOn) + private void setLODFactors(bool toggleOn) { nint baseAddr = MemoryUtil.Read(0x1451C4368); if (toggleOn) { - if (prevFoliageLodBias <= 0.0f) + if (prevFoliageLODBias <= 0.0f) { - prevFoliageLodBias = MemoryUtil.Read(baseAddr + 0x21C); - if (prevFoliageLodBias > 3.0f) prevFoliageLodBias = 3.0f; + prevFoliageLODBias = MemoryUtil.Read(baseAddr + 0x21C); + if (prevFoliageLODBias > 3.0f) prevFoliageLODBias = 3.0f; } - MemoryUtil.WriteBytes(baseAddr + 0x21C, BitConverter.GetBytes(foliageLodBias)); - if (prevTerrainLodBias <= 0.0f) + MemoryUtil.WriteBytes(baseAddr + 0x21C, BitConverter.GetBytes(foliageLODBias)); + if (prevTerrainLODBias <= 0.0f) { - prevTerrainLodBias = MemoryUtil.Read(baseAddr + 0x220); - if (prevTerrainLodBias > 3.0f) prevTerrainLodBias = 3.0f; + prevTerrainLODBias = MemoryUtil.Read(baseAddr + 0x220); + if (prevTerrainLODBias > 3.0f) prevTerrainLODBias = 3.0f; } - MemoryUtil.WriteBytes(baseAddr + 0x220, BitConverter.GetBytes(terrainLodBias)); - MemoryUtil.WriteBytes(baseAddr + 0x224, BitConverter.GetBytes(foliageLodFactor)); - MemoryUtil.WriteBytes(baseAddr + 0x228, BitConverter.GetBytes(terrainLodFactor)); + MemoryUtil.WriteBytes(baseAddr + 0x220, BitConverter.GetBytes(terrainLODBias)); + MemoryUtil.WriteBytes(baseAddr + 0x224, BitConverter.GetBytes(foliageLODFactor)); + MemoryUtil.WriteBytes(baseAddr + 0x228, BitConverter.GetBytes(terrainLODFactor)); MemoryUtil.WriteBytes(baseAddr + 0x5718, BitConverter.GetBytes(snowField4GlobalLODParam)); } else { - MemoryUtil.WriteBytes(baseAddr + 0x21C, BitConverter.GetBytes(prevFoliageLodBias)); - MemoryUtil.WriteBytes(baseAddr + 0x220, BitConverter.GetBytes(prevTerrainLodBias)); + MemoryUtil.WriteBytes(baseAddr + 0x21C, BitConverter.GetBytes(prevFoliageLODBias)); + MemoryUtil.WriteBytes(baseAddr + 0x220, BitConverter.GetBytes(prevTerrainLODBias)); MemoryUtil.WriteBytes(baseAddr + 0x224, BitConverter.GetBytes(1.0f)); MemoryUtil.WriteBytes(baseAddr + 0x228, BitConverter.GetBytes(1.0f)); MemoryUtil.WriteBytes(baseAddr + 0x5718, BitConverter.GetBytes(8.0f)); @@ -858,15 +918,15 @@ namespace MHWNewCamera public void OnLoad() { Config config = ConfigManager.GetConfig(this); - foliageLodBias = config.FoliageLodBias; - terrainLodBias = config.TerrainLodBias; - foliageLodFactor = config.FoliageLodFactor; - terrainLodFactor = config.TerrainLodFactor; - snowField4GlobalLODParam = config.SnowLodBias; - applyLodFactors = config.ApplyLodFactors; - if (applyLodFactors) + foliageLODBias = config.FoliageLODBias; + terrainLODBias = config.TerrainLODBias; + foliageLODFactor = config.FoliageLODFactor; + terrainLODFactor = config.TerrainLODFactor; + snowField4GlobalLODParam = config.SnowLODBias; + applyLODFactors = config.ApplyLODFactors; + if (applyLODFactors) { - setLodFactors(true); + setLODFactors(true); } } @@ -875,7 +935,7 @@ namespace MHWNewCamera if (disableMod) return; #if HOOK_ORDER_ASSERTS - Trace.Assert(hookOrder == 0 || hookOrder == 3); + Trace.Assert(hookOrder == 0 || hookOrder == 4); hookOrder = 0; if (frameTick == int.MaxValue) frameTick = 0; else frameTick++; @@ -891,19 +951,27 @@ namespace MHWNewCamera } if (Input.IsPressed(Key.NumPadPeriod)) { + uiToggled = !uiToggled; if (uiToggled) { - jmpOverUi.Disable(); + jmpOverUi.Enable(); } else { - jmpOverUi.Enable(); + jmpOverUi.Disable(); } - uiToggled = !uiToggled; } if (Input.IsPressed(Key.NumPadSlash)) { - forceOffDof = !forceOffDof; + dofDisabled = !dofDisabled; + if (dofDisabled) + { + jmpOverDof.Enable(); + } + else + { + jmpOverDof.Disable(); + } } } #endif @@ -1011,6 +1079,7 @@ namespace MHWNewCamera vCamera.NearClip = DEFAULT_NEAR_CLIP; } swapMinimapFollowsCamera.Disable(); + //stopViewMode.Invoke(psuedoViewModeObject); } private double adjustedZoomSpeed(float deltaTime) @@ -1020,7 +1089,9 @@ namespace MHWNewCamera private void updateFreeCamera(Camera camera) { - float deltaTime = camera.DeltaTime; + //float deltaTime = camera.DeltaTime; + //float deltaTime = 60.0f / MemoryUtil.Read(sMain.Instance + 0x68); + float deltaTime = MemoryUtil.Read(sMain.Instance + 0x94); bool lockVerticalAndModifySpeed = buttonWasDown(Button.L2) || lockVerticalToggled; double adjustedSpeed = cameraSpeed * deltaTime * (lockVerticalAndModifySpeed ? cameraSpeedModifier : 1.0f); @@ -1349,12 +1420,12 @@ namespace MHWNewCamera if (pCamera != null) { previousCameraAnimState = MemoryUtil.Read(pCamera.Instance + 0x240); - if (previousCameraAnimState == 5 || previousCameraAnimState == 8) + if (previousCameraAnimState == 5) { - // 1:314 = Wingdrake landing on area enter. - // 1:319 = Disoriented wingdrake landing next to monster. Player player = Player.MainPlayer!; ActionInfo currentActionInfo = player.ActionController.CurrentAction; + // 1:314 = Wingdrake landing on area enter. + // 1:319 = Disoriented wingdrake landing next to monster. if (currentActionInfo.ActionSet == 1 && (currentActionInfo.ActionId == 314 || currentActionInfo.ActionId == 319)) { // Temporarily disable evaluation of cameraAnimState != 5. @@ -1373,16 +1444,16 @@ namespace MHWNewCamera } } - private void SetCameraHook(nint unknownPtr) + private void SetCameraHook(nint cameraPointer) { if (disableMod) { - setCameraHook!.Original(unknownPtr); + setCameraHook!.Original(cameraPointer); return; } #if HOOK_ORDER_ASSERTS - debugLog($"SetCameraHook({unknownPtr:x}) @ {frameTick}"); + debugLog($"SetCameraHook({cameraPointer:x}) @ {frameTick}"); Trace.Assert(hookOrder == 0); hookOrder = 1; #endif @@ -1391,11 +1462,11 @@ namespace MHWNewCamera checkCurrentVisibleCamera(player); checkCameraAnimState(); - // CalculateCameraHook() within this function. - setCameraHook!.Original(unknownPtr); + // CalculateCameraHook() is within this function. + setCameraHook!.Original(cameraPointer); #if HOOK_ORDER_ASSERTS - Trace.Assert(hookOrder == 2); - hookOrder = 3; + Trace.Assert(hookOrder == 3); + hookOrder = 4; #endif if (applyPerspective) @@ -1422,18 +1493,18 @@ namespace MHWNewCamera } // If camera.Move = false, this hook won't run. - private void CalculateCameraHook(nint unknownPtr) + private void CalculateCameraHook(nint cameraPointer) { if (disableMod) { - calculateCameraHook!.Original(unknownPtr); + calculateCameraHook!.Original(cameraPointer); return; } #if HOOK_ORDER_ASSERTS - debugLog($"CalculateCameraHook({unknownPtr:x}) @ {frameTick}"); - Trace.Assert(hookOrder == 1); - hookOrder = 2; + debugLog($"CalculateCameraHook({cameraPointer:x}) @ {frameTick}"); + Trace.Assert(hookOrder == 2); + hookOrder = 3; #endif if (enableOffsetPerspective && !offsetPerspective) @@ -1452,23 +1523,26 @@ namespace MHWNewCamera } applyPerspective = offsetPerspective && !freeCamera && pCamera != null; + bool perspectiveFovOnly = false; if (applyPerspective) { - applyPerspective &= ((previousCameraAnimState != 5 && previousCameraAnimState != 8) || ignoreAnimState); applyPerspective &= !assumeInQuestBoard(previousFov); + perspectiveFovOnly = applyPerspective; + applyPerspective &= (previousCameraAnimState != 5 || ignoreAnimState) && previousCameraAnimState != 4 && previousCameraAnimState != 8; } if (applyPerspective) { // Applying Y offset here keeps crosshair UI centered, but affects the angle of the camera. pCamera!.Position.Y += cameraYOffset; - if (cameraFov != DEFAULT_FOV) - { - pCamera!.FieldOfView = (float)Math.Clamp((cameraFov * previousFov) / DEFAULT_FOV, 1.0, 179.0); - } } - calculateCameraHook!.Original(unknownPtr); + if (perspectiveFovOnly && cameraFov != DEFAULT_FOV) + { + pCamera!.FieldOfView = (float)Math.Clamp((cameraFov * previousFov) / DEFAULT_FOV, 1.0, 179.0); + } + + calculateCameraHook!.Original(cameraPointer); // Setting the perspective after calculateCameraHook.Original() allows the offset to not // negatively affect the right stick camera movement. If set earlier, camera movement @@ -1503,6 +1577,15 @@ namespace MHWNewCamera setDisableFadingObjects(vCameraViewportIndex, true); setDisableCharacterFade(true); swapMinimapFollowsCamera.Enable(); + /* + //MemoryUtil.WriteBytes(psuedoViewModeObject + 0x10, BitConverter.GetBytes(vCamera.Instance)); + Player? player = Player.MainPlayer; + if (player != null) + { + MemoryUtil.WriteBytes(psuedoViewModeObject + 0x118, BitConverter.GetBytes(player.Instance)); + } + //startViewMode.Invoke(psuedoViewModeObject); + */ } } // No else if because we want to updateFreeCamera() if freeCamera was enabled above. @@ -1513,6 +1596,51 @@ namespace MHWNewCamera } } + private void CheckCameraHook(nint cameraPointer) + { + /* + if (vCamera != null && freeCamera) + { + updateFreeCamera(vCamera); + + MemoryUtil.WriteBytes(psuedoViewModeObject + 0xE0, BitConverter.GetBytes((float)cameraFrameX)); + MemoryUtil.WriteBytes(psuedoViewModeObject + 0xE4, BitConverter.GetBytes((float)cameraFrameY)); + MemoryUtil.WriteBytes(psuedoViewModeObject + 0xE8, BitConverter.GetBytes((float)cameraFrameZ)); + + processViewMode.Invoke(psuedoViewModeObject); + + cameraPosition.X = MemoryUtil.Read(psuedoViewModeObject + 0x90); + cameraPosition.Y = MemoryUtil.Read(psuedoViewModeObject + 0x94); + cameraPosition.Z = MemoryUtil.Read(psuedoViewModeObject + 0x98); + } + */ +#if HOOK_ORDER_ASSERTS + debugLog($"CheckCameraHook({cameraPointer:x}) @ {frameTick}"); + Trace.Assert(hookOrder == 1); + hookOrder = 2; +#endif + if (!freeCamera) + { + checkCameraHook!.Original(cameraPointer); + } + } + + private void StartViewModeHook(nint viewModeObject) + { + if (disableMod) + { + startViewModeHook!.Original(viewModeObject); + return; + } +#if HOOK_ORDER_ASSERTS + debugLog($"StartViewMode({viewModeObject:x}) @ {frameTick}"); +#endif + if (vCamera != null) + { + enableFreeCamera = true; + } + } + private void SetCameraTentHook(nint unknownPtr) { if (disableMod) @@ -1582,89 +1710,34 @@ namespace MHWNewCamera #endif nint rax = MemoryUtil.Read(unknownPtr2 + 0x170); nint shadowCascadeValue = rax >> 32; - // After this function the value is written to the render params then maxss'd with the HQ value before use. - float biasOverride = MemoryUtil.Read(unknownPtr2 + 0x17C); - lastShadowBias = biasOverride; - biasOverride += shadowBiasOffset; - if (lowShadowDetailOverride) - { - if (shadowCascadeValue == 1) - { - biasOverride *= 2.0f; - MemoryUtil.WriteBytes(unknownPtr2 + 0x170, BitConverter.GetBytes((shadowCascadeValue + 1) << 32 | (rax & 0x00000000FFFFFFFF))); - } - } if (shadowCascadeValue != 3) { lastShadowCascadeValue = shadowCascadeValue; lastShadowBias = MemoryUtil.Read(unknownPtr2 + 0x17C); - if (applyShadowBias) - { - MemoryUtil.WriteBytes(unknownPtr2 + 0x17C, BitConverter.GetBytes(biasOverride)); - } lastShadowRadius = MemoryUtil.Read(unknownPtr2 + 0x1EC); - if (applyShadowRadius) - { - MemoryUtil.WriteBytes(unknownPtr2 + 0x1EC, BitConverter.GetBytes(lastShadowRadius + shadowRadiusOffset)); - } } - shadowCascadeHook!.Original(unknownPtr, unknownPtr2); - } - - private void EvalDepthOfFieldHook(nint unknownPtr, nint unknownPtr2) - { - if (disableMod || (skipDofHook = !skipDofHook)) + float biasOverride = lastShadowBias + shadowBiasOffset; + if (lowShadowDetailOverride && shadowCascadeValue == 1) { - evalDepthOfFieldHook!.Original(unknownPtr, unknownPtr2); - return; + shadowCascadeValue++; + MemoryUtil.WriteBytes(unknownPtr2 + 0x170, BitConverter.GetBytes((shadowCascadeValue << 32) | (rax & 0x00000000FFFFFFFF))); + biasOverride += shadowBiasOffset; + //biasOverride *= 2.0f; } -#if HOOK_ORDER_ASSERTS - debugLog($"EvalDepthOfFieldHook({unknownPtr}, {unknownPtr2}) @ {frameTick}"); -#endif - // Possibly of interest: +0x1DE, +0x1DF. - // We're assuming the previous dofPointer will still be valid, but that might not be true. - if (dofPointer != 0x0 && unknownPtr != dofPointer && wasDofAllowed != null) - { - MemoryUtil.WriteBytes(dofPointer + 0x1DD, ((bool)wasDofAllowed) ? [0x1] : [0x0]); - wasDofAllowed = null; - } - dofPointer = unknownPtr; - if (!forceOffDof) + if (shadowCascadeValue != 3) { - if (wasDofAllowed != null) + if (applyShadowBias) { - MemoryUtil.WriteBytes(dofPointer + 0x1DD, ((bool)wasDofAllowed) ? [0x1] : [0x0]); - wasDofAllowed = null; + // After this function this value is written to the render params then maxss'd with the HQ value before use. + MemoryUtil.WriteBytes(unknownPtr2 + 0x17C, BitConverter.GetBytes(biasOverride)); } - } - else - { - if (wasDofAllowed == null) + if (applyShadowRadius) { - wasDofAllowed = MemoryUtil.Read(dofPointer + 0x1DD) == 0x1; + float radiusOverride = lastShadowRadius + shadowRadiusOffset; + MemoryUtil.WriteBytes(unknownPtr2 + 0x1EC, BitConverter.GetBytes(radiusOverride)); } - MemoryUtil.WriteBytes(dofPointer + 0x1DD, [0x0]); } - evalDepthOfFieldHook!.Original(unknownPtr, unknownPtr2); - } - - private void writeSSAOParams(nint baseAddr, SSAOParameters ssaoParams) - { - MemoryUtil.WriteBytes(baseAddr + 0xB4B0, BitConverter.GetBytes(ssaoParams.ssaoDepthBias)); - MemoryUtil.WriteBytes(baseAddr + 0xB4B4, BitConverter.GetBytes(ssaoParams.ssaoSlopedDepthBias)); - MemoryUtil.WriteBytes(baseAddr + 0xB4B8, BitConverter.GetBytes(ssaoParams.ssaoMaxDepthBias)); - MemoryUtil.WriteBytes(baseAddr + 0xB4BC, BitConverter.GetBytes(ssaoParams.ssaoDispersion)); - MemoryUtil.WriteBytes(baseAddr + 0xB430, BitConverter.GetBytes(ssaoParams.ssaoEffect)); - MemoryUtil.WriteBytes(baseAddr + 0xB434, BitConverter.GetBytes(ssaoParams.ssaoEffectGI)); - MemoryUtil.WriteBytes(baseAddr + 0xB4C0, BitConverter.GetBytes(ssaoParams.ssaoDepthDifference)); - MemoryUtil.WriteBytes(baseAddr + 0xB4C4, BitConverter.GetBytes(ssaoParams.ssaoSamplesPerPixel)); - MemoryUtil.WriteBytes(baseAddr + 0xB4C8, BitConverter.GetBytes(ssaoParams.ssaoMaxSampleNum)); - MemoryUtil.WriteBytes(baseAddr + 0xB4D0, BitConverter.GetBytes(ssaoParams.ssaoMaxSampleNumHQ)); - MemoryUtil.WriteBytes(baseAddr + 0xB4D4, BitConverter.GetBytes(ssaoParams.ssaoRadius)); - MemoryUtil.WriteBytes(baseAddr + 0xB4D8, BitConverter.GetBytes(ssaoParams.ssaoBias)); - MemoryUtil.WriteBytes(baseAddr + 0xB4E0, BitConverter.GetBytes(ssaoParams.ssaoIntensity)); - MemoryUtil.WriteBytes(baseAddr + 0xB4E5, ssaoParams.ssaoUseHiZ ? [0x1] : [0x0]); - MemoryUtil.WriteBytes(baseAddr + 0xB4DC, BitConverter.GetBytes(ssaoParams.ssaoEdgeAttenRate)); + shadowCascadeHook!.Original(unknownPtr, unknownPtr2); } private void setSSAOAdjustements(bool enable) @@ -1676,25 +1749,54 @@ namespace MHWNewCamera // SSAO Effect > 1.0 will never look right with these values. MemoryUtil.WriteBytes(baseAddr + 0xB430, BitConverter.GetBytes(1.0f)); MemoryUtil.WriteBytes(baseAddr + 0xB434, BitConverter.GetBytes(0.5f)); - MemoryUtil.WriteBytes(baseAddr + 0xB4D0, BitConverter.GetBytes(24)); + MemoryUtil.WriteBytes(baseAddr + 0xB4C8, BitConverter.GetBytes(18)); + MemoryUtil.WriteBytes(baseAddr + 0xB4D0, BitConverter.GetBytes(18)); MemoryUtil.WriteBytes(baseAddr + 0xB4D8, BitConverter.GetBytes(0.001f)); - MemoryUtil.WriteBytes(baseAddr + 0xB4E0, BitConverter.GetBytes(110.0f)); + MemoryUtil.WriteBytes(baseAddr + 0xB4E0, BitConverter.GetBytes(105.0f)); } else { MemoryUtil.WriteBytes(baseAddr + 0xB4BC, BitConverter.GetBytes(internalSSAOParams.ssaoDispersion)); MemoryUtil.WriteBytes(baseAddr + 0xB430, BitConverter.GetBytes(internalSSAOParams.ssaoEffect)); MemoryUtil.WriteBytes(baseAddr + 0xB434, BitConverter.GetBytes(internalSSAOParams.ssaoEffectGI)); + MemoryUtil.WriteBytes(baseAddr + 0xB4C8, BitConverter.GetBytes(internalSSAOParams.ssaoMaxSampleNum)); MemoryUtil.WriteBytes(baseAddr + 0xB4D0, BitConverter.GetBytes(internalSSAOParams.ssaoMaxSampleNumHQ)); MemoryUtil.WriteBytes(baseAddr + 0xB4D8, BitConverter.GetBytes(internalSSAOParams.ssaoBias)); MemoryUtil.WriteBytes(baseAddr + 0xB4E0, BitConverter.GetBytes(internalSSAOParams.ssaoIntensity)); } } + private void setSSRAdjustements(bool enable) + { + nint baseAddr = MemoryUtil.Read(0x1451C4368); + if (enable) + { + MemoryUtil.WriteBytes(baseAddr + 0xE628, BitConverter.GetBytes(72)); + MemoryUtil.WriteBytes(baseAddr + 0xE630, BitConverter.GetBytes(40.0f)); + MemoryUtil.WriteBytes(baseAddr + 0xE644, BitConverter.GetBytes(0.215f)); + MemoryUtil.WriteBytes(baseAddr + 0xE64C, BitConverter.GetBytes(0.215f)); + MemoryUtil.WriteBytes(baseAddr + 0xE634, BitConverter.GetBytes(3.0f)); + MemoryUtil.WriteBytes(baseAddr + 0xB428, BitConverter.GetBytes(2.0f)); + MemoryUtil.WriteBytes(baseAddr + 0xB42C, BitConverter.GetBytes(140.0f)); + MemoryUtil.WriteBytes(baseAddr + 0xE650, [0x1]); + } + else + { + MemoryUtil.WriteBytes(baseAddr + 0xE628, BitConverter.GetBytes(internalSSRParams.sslrLoopCount)); + MemoryUtil.WriteBytes(baseAddr + 0xE630, BitConverter.GetBytes(internalSSRParams.sslrEliminateDepth)); + MemoryUtil.WriteBytes(baseAddr + 0xE644, BitConverter.GetBytes(internalSSRParams.sslrAccurateThreshold)); + MemoryUtil.WriteBytes(baseAddr + 0xE64C, BitConverter.GetBytes(internalSSRParams.sslrAccurateThresholdHQ)); + MemoryUtil.WriteBytes(baseAddr + 0xE634, BitConverter.GetBytes(internalSSRParams.sslrDitherRadius)); + MemoryUtil.WriteBytes(baseAddr + 0xB428, BitConverter.GetBytes(internalSSRParams.sslrEdgeAttenRate)); + MemoryUtil.WriteBytes(baseAddr + 0xB42C, BitConverter.GetBytes(internalSSRParams.sslrDepthEliminateRate)); + MemoryUtil.WriteBytes(baseAddr + 0xE650, internalSSRParams.sslrUseMipmap ? [0x1] : [0x0]); + } + } + private void setHQMode(bool enable) { nint baseAddr = MemoryUtil.Read(0x1451C4368); - MemoryUtil.WriteBytes(baseAddr + 0xE9A3, HQMode ? [0x1] : [0x0]); + MemoryUtil.WriteBytes(baseAddr + 0xE9A3, enableHQMode ? [0x1] : [0x0]); } private void RendererSetHook(nint unknownPtr, nint unknownPtr2, nint unknownPtr3) @@ -1717,16 +1819,35 @@ namespace MHWNewCamera internalSSAOParams.ssaoRadius = MemoryUtil.Read(baseAddr + 0xB4D4); internalSSAOParams.ssaoBias = MemoryUtil.Read(baseAddr + 0xB4D8); internalSSAOParams.ssaoIntensity = MemoryUtil.Read(baseAddr + 0xB4E0); - internalSSAOParams.ssaoUseHiZ = MemoryUtil.Read(baseAddr + 0xB4E5) == 1; + internalSSAOParams.ssaoUseHiZ = MemoryUtil.Read(baseAddr + 0xB4E5) == 0x1; internalSSAOParams.ssaoEdgeAttenRate = MemoryUtil.Read(baseAddr + 0xB4DC); - if (ssaoOverrides) + if (ssaoAdjustments) { setSSAOAdjustements(true); } - setHQMode(HQMode); - if (applyLodFactors) + internalSSRParams.sslrLoopCount = MemoryUtil.Read(baseAddr + 0xE628); + internalSSRParams.sslrLoopCountFactorForCBR = MemoryUtil.Read(baseAddr + 0xE62C); + internalSSRParams.sslrEliminateDepth = MemoryUtil.Read(baseAddr + 0xE630); + internalSSRParams.sslrAccurateThreshold = MemoryUtil.Read(baseAddr + 0xE644); + internalSSRParams.sslrAccurateThresholdHQ = MemoryUtil.Read(baseAddr + 0xE64C); + internalSSRParams.sslrDitherRadius = MemoryUtil.Read(baseAddr + 0xE634); + internalSSRParams.sslrImportanceBias = MemoryUtil.Read(baseAddr + 0xE638); + internalSSRParams.sslrMipScale = MemoryUtil.Read(baseAddr + 0xE63C); + internalSSRParams.sslrMipBias = MemoryUtil.Read(baseAddr + 0xE640); + internalSSRParams.sslrDitherResolve = MemoryUtil.Read(baseAddr + 0xB43F) == 0x1; + internalSSRParams.sslrEdgeAttenRate = MemoryUtil.Read(baseAddr + 0xB428); + internalSSRParams.sslrMip0CountThreshold = MemoryUtil.Read(baseAddr + 0xB438); + internalSSRParams.sslrDepthEliminateRate = MemoryUtil.Read(baseAddr + 0xB42C); + internalSSRParams.sslrUseMipmap = MemoryUtil.Read(baseAddr + 0xE650) == 0x1; + internalSSRParams.sslrGBufferJitter = MemoryUtil.Read(baseAddr + 0xB440) == 0x1; + if (ssrAdjustments) + { + setSSRAdjustements(true); + } + setHQMode(enableHQMode); + if (applyLODFactors) { - setLodFactors(true); + setLODFactors(true); } } } @@ -2014,33 +2135,50 @@ namespace MHWNewCamera { if (buttonWasPressed(Button.Down)) { - if (Player.MainPlayer != null) + Player? player = Player.MainPlayer; + if (player != null) { // Y - 150 to approximately align the players head with the camera. - Player.MainPlayer.Position = new Vector3(cameraPosition.X, cameraPosition.Y - 150.0f, cameraPosition.Z); + player.Position = new Vector3(cameraPosition.X, cameraPosition.Y - 150.0f, cameraPosition.Z); } } } + if (buttonWasDown(Button.Share)) { /* if (buttonWasPressed(Button.Cross)) { + uiToggled = !uiToggled; if (uiToggled) { - jmpOverUi.Disable(); + jmpOverUi.Enable(); } else { - jmpOverUi.Enable(); + jmpOverUi.Disable(); } - uiToggled = !uiToggled; } */ if (buttonWasPressed(Button.Circle)) { - forceOffDof = !forceOffDof; + dofDisabled = !dofDisabled; + if (dofDisabled) + { + jmpOverDof.Enable(); + } + else + { + jmpOverDof.Disable(); + } + } + } + else + { + if (buttonWasPressed(Button.Circle)) + { + enableFreeCamera = false; } } } @@ -2074,41 +2212,40 @@ namespace MHWNewCamera collisionCheckHook!.Original(unknownPtr, unknownPtr2); } - private void CameraEffectHook(nint unknownPtr, nint unknownPtr2, nint unknownPtr3, double unknownF) + // @TODO: Crashes in rotten vale? + private void CameraEffectHook(nint unknownPtr, nint unknownPtr2, nint unknownPtr3) { nint baseAddr = MemoryUtil.Read(0x14500E180); - byte[] curUnderwaterValues = MemoryUtil.ReadArray(unknownPtr2 + 0x8, 120); bool underwater = MemoryUtil.Read(baseAddr + 0x9F8) == 0x1; - // Pretty unsafe seeming. - if (prevUnderwaterPointer != 0x0 && unknownPtr2 != prevUnderwaterPointer) + + byte[]? underwaterValues = null; + nint targetAddr = 0x0; + + nint addr1 = MemoryUtil.Read(unknownPtr + 0x550); + int index1 = MemoryUtil.Read(unknownPtr + 0xA50); + nint addr2 = MemoryUtil.Read(addr1 + (index1 * 0x8)); + if (addr2 != 0x0) { - MemoryUtil.WriteBytes(prevUnderwaterPointer + 0x8, prevUnderwaterValues); - prevUnderwaterPointer = 0x0; + nint addr3 = MemoryUtil.Read(addr2 + 0x188); + if (addr3 != 0x0) + { + targetAddr = addr3 + 0x140; + } } + if (underwater) { - if (prevUnderwaterPointer == 0x0) - { - prevUnderwaterValues = curUnderwaterValues; - prevUnderwaterPointer = unknownPtr2; - } - // Straight copy from The Great Forest. - MemoryUtil.WriteBytes(unknownPtr2 + 0x8, [0x01, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x6F, 0x12, 0x03, 0x3B, 0x01, 0x00, 0x00, 0x00, 0xCE, 0xCC, 0xCC, 0x3E, 0x01, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x3F, 0x8F, 0xC2, 0xF5, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x46, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42]); - /* - MemoryUtil.WriteBytes(unknownPtr2 + 0x8, [0x01, 0x01]); - MemoryUtil.WriteBytes(unknownPtr2 + 0x38, [0x01, 0x00, 0x00, 0x00]); - MemoryUtil.WriteBytes(unknownPtr2 + 0x3C, [0xCE, 0xCC, 0xCC, 0x3E]); // 0.40 with extra bit set. - MemoryUtil.WriteBytes(unknownPtr2 + 0x40, [0x01, 0x00, 0x80, 0x3F]); - MemoryUtil.WriteBytes(unknownPtr2 + 0x48, [0x01, 0x00, 0x80, 0x3F]); - MemoryUtil.WriteBytes(unknownPtr2 + 0x4C, BitConverter.GetBytes(0.03f)); - */ + underwaterValues = MemoryUtil.ReadArray(targetAddr + 0x8, 120); + // Straight copy-paste from The Great Forest. + MemoryUtil.WriteBytes(targetAddr + 0x8, [0x01, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x6F, 0x12, 0x03, 0x3B, 0x01, 0x00, 0x00, 0x00, 0xCE, 0xCC, 0xCC, 0x3E, 0x01, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x3F, 0x8F, 0xC2, 0xF5, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x46, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x42]); } - else if (prevUnderwaterPointer != 0x0) + + cameraEffectHook!.Original(unknownPtr, unknownPtr2, unknownPtr3); + + if (underwater && underwaterValues != null) { - MemoryUtil.WriteBytes(prevUnderwaterPointer + 0x8, prevUnderwaterValues); - prevUnderwaterPointer = 0x0; + MemoryUtil.WriteBytes(targetAddr + 0x8, underwaterValues); } - cameraEffectHook!.Original(unknownPtr, unknownPtr2, unknownPtr3, unknownF); } private void disableAllCollisionHooks() @@ -2135,6 +2272,36 @@ namespace MHWNewCamera } } + private static void drawRenderParameter(string name, nint baseAddr, nint offset) where T : unmanaged + { + nint addr = baseAddr + offset; + T currentValue = MemoryUtil.Read(addr); + if (typeof(T) == typeof(float)) + { + float valueF = Convert.ToSingle(currentValue); + if (ImGui.InputFloat(name, ref valueF, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue)) + { + MemoryUtil.WriteBytes(addr, BitConverter.GetBytes(valueF)); + } + } + else if (typeof(T) == typeof(int)) + { + int valueI = Convert.ToInt32(currentValue); + if (ImGui.InputInt(name, ref valueI, 0, 0, ImGuiInputTextFlags.EnterReturnsTrue)) + { + MemoryUtil.WriteBytes(addr, BitConverter.GetBytes(valueI)); + } + } + else if (typeof(T) == typeof(byte)) + { + bool valueSwitch = Convert.ToByte(currentValue) == 0x1; + if (ImGui.Checkbox(name, ref valueSwitch)) + { + MemoryUtil.WriteBytes(addr, valueSwitch ? [0x1] : [0x0]); + } + } + } + private void drawViewportInfo(int i, float width, Config config, bool debug) { Viewport vp = CameraSystem.GetViewport(i); @@ -2388,17 +2555,17 @@ namespace MHWNewCamera player.Rotation.X = 0.0f; player.Rotation.Z = 0.0f; } - if (areLodFactorsSet() && !areLodFactorsDefault()) + if (areLODFactorsSet() && !areLODFactorsDefault()) { - setLodFactors(false); + setLODFactors(false); } if (tripleShadowRes) { tripleShadowResDisable(); } - if (disableLodLimits) + if (disableLODLimits) { - disableLodLimitsDisable(); + disableLODLimitsDisable(); } if (largerFoliageSwayRange) { @@ -2411,17 +2578,17 @@ namespace MHWNewCamera } else { - if (applyLodFactors && !areLodFactorsDefault()) + if (applyLODFactors && !areLODFactorsDefault()) { - setLodFactors(true); + setLODFactors(true); } if (tripleShadowRes) { tripleShadowResEnable(); } - if (disableLodLimits) + if (disableLODLimits) { - disableLodLimitsEnable(); + disableLODLimitsEnable(); } if (largerFoliageSwayRange) { @@ -2705,7 +2872,17 @@ namespace MHWNewCamera { ImGui.PopStyleVar(); } - ImGui.Checkbox("Disable Depth of Field", ref forceOffDof); + if (ImGui.Checkbox("Disable Depth of Field", ref dofDisabled)) + { + if (dofDisabled) + { + jmpOverDof.Enable(); + } + else + { + jmpOverDof.Disable(); + } + } if (ImGui.BeginItemTooltip()) { ImGui.Text("Hold Select + Press B. Works to disable depth of field in cutscenes. Credit to Otis_Inf."); @@ -2953,7 +3130,7 @@ namespace MHWNewCamera ImGui.TableNextRow(); ImGui.TableSetColumnIndex(0); - ImGui.Text("Up/Down/Left/Right"); + ImGui.Text("Arrow Up/Down/Left/Right"); ImGui.TableSetColumnIndex(1); ImGui.Text("Move Camera"); @@ -3002,62 +3179,6 @@ namespace MHWNewCamera ImGui.PushID("Player"); if (ImGui.CollapsingHeader("Player") && player != null) { - nint controlsAddr = MemoryUtil.Read(player.Instance + 0x12608); - nint zoneStateAddr = MemoryUtil.Read(0x1451C42B8); - if (controlsAddr != 0x0 || zoneStateAddr == 0x0) - { - bool passiveFlag = MemoryUtil.Read(zoneStateAddr + 0xD2EA) == 1; - if (ImGui.Checkbox("Passive", ref passiveFlag)) - { - MemoryUtil.WriteBytes(zoneStateAddr + 0xD2EA, passiveFlag ? [0x1] : [0x0]); - setPassiveMode.Invoke(player.Instance, 0x00010780); - /* - MemoryUtil.WriteBytes(player.Instance + 0x7626, passiveMode ? [0x1] : [0x0]); - setPlayerController1.Invoke(player.Instance); - setPlayerController2.Invoke(controlsAddr); - */ - } - bool passiveMode = MemoryUtil.Read(player.Instance + 0x7626) == 1; - if (ImGui.Checkbox("Passive Mode", ref passiveMode)) - { - MemoryUtil.WriteBytes(player.Instance + 0x7626, passiveMode ? [0x1] : [0x0]); - } - bool combatControls = MemoryUtil.Read(controlsAddr + 0xb18) == 0x80; - if (ImGui.Checkbox("Combat Controls", ref combatControls)) - { - MemoryUtil.WriteBytes(player.Instance + 0x7626, combatControls ? [0x0] : [0x1]); - setPlayerController1.Invoke(player.Instance); - setPlayerController2.Invoke(controlsAddr); - MemoryUtil.WriteBytes(player.Instance + 0x7626, passiveMode ? [0x1] : [0x0]); - } - } - if (ImGui.Checkbox("Force Crawl", ref enableCrawl)) - { - if (enableCrawl) - { - MemoryUtil.WriteBytes(psuedoObject2 + 0x70, BitConverter.GetBytes(player.Position.X + player.Forward.X)); - MemoryUtil.WriteBytes(psuedoObject2 + 0x74, BitConverter.GetBytes(player.Position.Y + player.Forward.Y)); - MemoryUtil.WriteBytes(psuedoObject2 + 0x78, BitConverter.GetBytes(player.Position.Z + player.Forward.Z)); - - Quaternion playerRotation = new Quaternion(player.Forward.X, player.Forward.Y, player.Forward.Z, 0.0f); - Quaternion objectRotation = getReverse(playerRotation); - - MemoryUtil.WriteBytes(psuedoObject2 + 0x40, BitConverter.GetBytes(objectRotation.X)); - MemoryUtil.WriteBytes(psuedoObject2 + 0x44, BitConverter.GetBytes(objectRotation.Y)); - MemoryUtil.WriteBytes(psuedoObject2 + 0x48, BitConverter.GetBytes(objectRotation.Z)); - MemoryUtil.WriteBytes(psuedoObject2 + 0x4C, BitConverter.GetBytes(objectRotation.W)); - - MemoryUtil.WriteBytes(psuedoObject2 + 0x50, BitConverter.GetBytes(0.0f)); - MemoryUtil.WriteBytes(psuedoObject2 + 0x54, BitConverter.GetBytes(1.0f)); - MemoryUtil.WriteBytes(psuedoObject2 + 0x58, BitConverter.GetBytes(0.0f)); - MemoryUtil.WriteBytes(psuedoObject2 + 0x5C, BitConverter.GetBytes(0.0f)); - - MemoryUtil.WriteBytes(psuedoObject2 + 0x60, BitConverter.GetBytes(playerRotation.X)); - MemoryUtil.WriteBytes(psuedoObject2 + 0x64, BitConverter.GetBytes(playerRotation.Y)); - MemoryUtil.WriteBytes(psuedoObject2 + 0x68, BitConverter.GetBytes(playerRotation.Z)); - MemoryUtil.WriteBytes(psuedoObject2 + 0x6C, BitConverter.GetBytes(playerRotation.W)); - } - } ImGui.DragFloat3("Position", ref player.Position, 0.5f); Vector3 forward; forward.X = player.Forward.X; @@ -3201,11 +3322,79 @@ namespace MHWNewCamera ImGui.PopStyleVar(); } + nint controlsAddr = MemoryUtil.Read(player.Instance + 0x12608); + nint zoneStateAddr = MemoryUtil.Read(0x1451C42B8); + bool combatControls = false; + if (controlsAddr != 0x0 || zoneStateAddr == 0x0) + { + bool passiveFlag = MemoryUtil.Read(zoneStateAddr + 0xD2EA) == 1; + if (ImGui.Checkbox("Passive", ref passiveFlag)) + { + MemoryUtil.WriteBytes(zoneStateAddr + 0xD2EA, passiveFlag ? [0x1] : [0x0]); + setPassiveMode.Invoke(player.Instance, 0x00010780); + /* + MemoryUtil.WriteBytes(player.Instance + 0x7626, passiveMode ? [0x1] : [0x0]); + setPlayerController1.Invoke(player.Instance); + setPlayerController2.Invoke(controlsAddr); + */ + } + bool passiveMode = MemoryUtil.Read(player.Instance + 0x7626) == 1; + if (ImGui.Checkbox("Passive Mode", ref passiveMode)) + { + MemoryUtil.WriteBytes(player.Instance + 0x7626, passiveMode ? [0x1] : [0x0]); + } + combatControls = MemoryUtil.Read(controlsAddr + 0xb18) == 0x80; + if (ImGui.Checkbox("Combat Controls", ref combatControls)) + { + MemoryUtil.WriteBytes(player.Instance + 0x7626, combatControls ? [0x0] : [0x1]); + setPlayerController1.Invoke(player.Instance); + setPlayerController2.Invoke(controlsAddr); + MemoryUtil.WriteBytes(player.Instance + 0x7626, passiveMode ? [0x1] : [0x0]); + } + } + if (ImGui.Checkbox("Force Crawl", ref enableCrawl)) + { + if (enableCrawl) + { + MemoryUtil.WriteBytes(psuedoObject2 + 0x70, BitConverter.GetBytes(player.Position.X + player.Forward.X)); + MemoryUtil.WriteBytes(psuedoObject2 + 0x74, BitConverter.GetBytes(player.Position.Y + player.Forward.Y)); + MemoryUtil.WriteBytes(psuedoObject2 + 0x78, BitConverter.GetBytes(player.Position.Z + player.Forward.Z)); + + Quaternion playerRotation = new Quaternion(player.Forward.X, player.Forward.Y, player.Forward.Z, 0.0f); + Quaternion objectRotation = getReverse(playerRotation); + + MemoryUtil.WriteBytes(psuedoObject2 + 0x40, BitConverter.GetBytes(objectRotation.X)); + MemoryUtil.WriteBytes(psuedoObject2 + 0x44, BitConverter.GetBytes(objectRotation.Y)); + MemoryUtil.WriteBytes(psuedoObject2 + 0x48, BitConverter.GetBytes(objectRotation.Z)); + MemoryUtil.WriteBytes(psuedoObject2 + 0x4C, BitConverter.GetBytes(objectRotation.W)); + + MemoryUtil.WriteBytes(psuedoObject2 + 0x50, BitConverter.GetBytes(0.0f)); + MemoryUtil.WriteBytes(psuedoObject2 + 0x54, BitConverter.GetBytes(1.0f)); + MemoryUtil.WriteBytes(psuedoObject2 + 0x58, BitConverter.GetBytes(0.0f)); + MemoryUtil.WriteBytes(psuedoObject2 + 0x5C, BitConverter.GetBytes(0.0f)); + + MemoryUtil.WriteBytes(psuedoObject2 + 0x60, BitConverter.GetBytes(playerRotation.X)); + MemoryUtil.WriteBytes(psuedoObject2 + 0x64, BitConverter.GetBytes(playerRotation.Y)); + MemoryUtil.WriteBytes(psuedoObject2 + 0x68, BitConverter.GetBytes(playerRotation.Z)); + MemoryUtil.WriteBytes(psuedoObject2 + 0x6C, BitConverter.GetBytes(playerRotation.W)); + } + } + + if (combatControls) + { + ImGui.PushItemFlag(ImGuiItemFlags.Disabled, true); + ImGui.PushStyleVar(ImGuiStyleVar.Alpha, ImGui.GetStyle().Alpha * 0.5f); + } if (ImGui.Button("Sit in Hot Springs")) { MemoryUtil.WriteBytes(player.ActionController.Instance + 0xC0, [0x65, 0x00, 0x00, 0x00]); MemoryUtil.WriteBytes(player.ActionController.Instance + 0xBC, [0x01, 0x00, 0x00, 0x00]); } + if (combatControls) + { + ImGui.PopItemFlag(); + ImGui.PopStyleVar(); + } if (ImGui.Checkbox("Allow Hot Springs Anywhere", ref allowHotSpringsAnywhere)) { @@ -3304,35 +3493,42 @@ namespace MHWNewCamera } if (ImGui.BeginItemTooltip()) { - ImGui.Text("Disable reduced detail/range shadows in Hoarfrost Reach and Seliana Gathering Hub."); + ImGui.Text("Disable reduced detail/range shadows in Hoarfrost Reach and Seliana Gathering Hub.\nAlso doubles the Shadow Range offset in those areas."); ImGui.EndTooltip(); } - if (ImGui.Checkbox("SSAO Adjustments", ref ssaoOverrides)) + if (ImGui.Checkbox("SSAO Adjustments", ref ssaoAdjustments)) + { + setSSAOAdjustements(ssaoAdjustments); + config.SSAOAdjustments = ssaoAdjustments; + ConfigManager.SaveConfig(this); + } + + if (ImGui.Checkbox("SSR Adjustments", ref ssrAdjustments)) { - setSSAOAdjustements(ssaoOverrides); - config.SSAOAdjustments = ssaoOverrides; + setSSRAdjustements(ssrAdjustments); + config.SSRAdjustments = ssrAdjustments; ConfigManager.SaveConfig(this); } - if (ImGui.Checkbox("HQ Mode", ref HQMode)) + if (ImGui.Checkbox("HQ Mode", ref enableHQMode)) { - setHQMode(HQMode); - config.HQMode = HQMode; + setHQMode(enableHQMode); + config.EnableHQMode = enableHQMode; ConfigManager.SaveConfig(this); } - if (ImGui.Checkbox("Disable Player/Palico/NPC LOD Limit in Gameplay", ref disableLodLimits)) + if (ImGui.Checkbox("Disable Player/Palico/NPC LOD Limit in Gameplay", ref disableLODLimits)) { - if (disableLodLimits) + if (disableLODLimits) { - disableLodLimitsEnable(); + disableLODLimitsEnable(); } else { - disableLodLimitsDisable(); + disableLODLimitsDisable(); } - config.DisableLodLimits = disableLodLimits; + config.DisableLODLimits = disableLODLimits; ConfigManager.SaveConfig(this); } if (ImGui.BeginItemTooltip()) @@ -3342,27 +3538,27 @@ namespace MHWNewCamera } ImGui.PushItemWidth(width * 0.1f); - ImGui.InputFloat("##Foliage LOD Bias", ref foliageLodBias, 0.0f, 0.0f, "%.2f"); + ImGui.InputFloat("##Foliage LOD Bias", ref foliageLODBias, 0.0f, 0.0f, "%.2f"); if (ImGui.BeginItemTooltip()) { ImGui.Text("In-Game Settings:\n - High: 3.0\n - Mid: 1.0\n - Low: 0.9\n - Variable: -1.0\nHigher value = Farther distance before plants switch to a lower LOD."); ImGui.EndTooltip(); } ImGui.SameLine(); - ImGui.InputFloat("Foliage LOD Bias", ref foliageLodFactor, 0.0f, 0.0f, "%.2f"); + ImGui.InputFloat("Foliage LOD Bias", ref foliageLODFactor, 0.0f, 0.0f, "%.2f"); if (ImGui.BeginItemTooltip()) { ImGui.Text("Controls the distance at which the game decides to no longer render some plants.\nCan be effectively overridden by a high first value.\nDefault: 1.0, Best Quality: 0.0."); ImGui.EndTooltip(); } - ImGui.InputFloat("##Terrain/Object LOD Bias", ref terrainLodBias, 0.0f, 0.0f, "%.2f"); + ImGui.InputFloat("##Terrain/Object LOD Bias", ref terrainLODBias, 0.0f, 0.0f, "%.2f"); if (ImGui.BeginItemTooltip()) { ImGui.Text("In-Game Settings:\n - High: 3.0\n - Mid: 1.0\n - Low: 0.9\n - Variable: -1.0\nHigher value = Farther distance before objects switch to a lower LOD."); ImGui.EndTooltip(); } ImGui.SameLine(); - ImGui.InputFloat("Terrain/Object LOD Bias", ref terrainLodFactor, 0.0f, 0.0f, "%.2f"); + ImGui.InputFloat("Terrain/Object LOD Bias", ref terrainLODFactor, 0.0f, 0.0f, "%.2f"); if (ImGui.BeginItemTooltip()) { ImGui.Text("Controls the distance at which the game decides to no longer render some objects.\nCan be effectively overridden by a high first value.\nDefault: 1.0, Best Quality: 0.0."); @@ -3370,9 +3566,9 @@ namespace MHWNewCamera } ImGui.InputFloat("Snow LOD Param", ref snowField4GlobalLODParam, 0.0f, 0.0f, "%.2f", ImGuiInputTextFlags.EnterReturnsTrue); ImGui.PopItemWidth(); - bool lodsSet = areLodFactorsSet(); - bool disableLodButton = lodsSet && areLodFactorsDefault(); - if (disableLodButton) + bool lodsSet = areLODFactorsSet(); + bool disableLODButton = lodsSet && areLODFactorsDefault(); + if (disableLODButton) { ImGui.PushItemFlag(ImGuiItemFlags.Disabled, true); ImGui.PushStyleVar(ImGuiStyleVar.Alpha, ImGui.GetStyle().Alpha * 0.5f); @@ -3380,20 +3576,20 @@ namespace MHWNewCamera } if (ImGui.Checkbox("Apply LOD Biases", ref lodsSet)) { - setLodFactors(lodsSet); - applyLodFactors = lodsSet && !areLodFactorsDefault(); + setLODFactors(lodsSet); + applyLODFactors = lodsSet && !areLODFactorsDefault(); if (lodsSet) { - config.FoliageLodBias = foliageLodBias; - config.TerrainLodBias = terrainLodBias; - config.FoliageLodFactor = foliageLodFactor; - config.TerrainLodFactor = terrainLodFactor; - config.SnowLodBias = snowField4GlobalLODParam; + config.FoliageLODBias = foliageLODBias; + config.TerrainLODBias = terrainLODBias; + config.FoliageLODFactor = foliageLODFactor; + config.TerrainLODFactor = terrainLODFactor; + config.SnowLODBias = snowField4GlobalLODParam; } - config.ApplyLodFactors = applyLodFactors; + config.ApplyLODFactors = applyLODFactors; ConfigManager.SaveConfig(this); } - if (disableLodButton) + if (disableLODButton) { ImGui.PopItemFlag(); ImGui.PopStyleVar(); @@ -3438,7 +3634,7 @@ namespace MHWNewCamera } if (ImGui.BeginItemTooltip()) { - ImGui.Text("Stop monsters' animation rate from being reduced when far from the camera."); + ImGui.Text("Don't reduce an animals animation rate when they're far from the camera."); ImGui.EndTooltip(); } @@ -3467,7 +3663,7 @@ namespace MHWNewCamera ImGui.EndTooltip(); } - if (ImGui.Checkbox("Disable Volumetric Downsample", ref disableVolumeDownsample)) + if (ImGui.Checkbox("Disable Volumetric Downsample and Blur", ref disableVolumeDownsample)) { if (disableVolumeDownsample) { @@ -3478,34 +3674,48 @@ namespace MHWNewCamera zeroVolumetricDownsample.Disable(); } } + if (ImGui.BeginItemTooltip()) + { + ImGui.Text("Disabling blur is likely an undesirable compromise but skipping the downsample without skipping blur is a more involved change."); + ImGui.EndTooltip(); + } } ImGui.PopID(); ImGui.PushID("Debug"); if (ImGui.CollapsingHeader("DEBUG")) { - /* - if (ImGui.InputText("ObjectAddr", ref objectAddrStr, 32, ImGuiInputTextFlags.EnterReturnsTrue)) + float gameSpeed = MemoryUtil.Read(sMain.Instance + 0xA4); + if (ImGui.InputFloat("Game Speed", ref gameSpeed, 0.0f, 0.0f, null, ImGuiInputTextFlags.EnterReturnsTrue)) { - objectAddr = (nint)Int64.Parse(objectAddrStr, NumberStyles.HexNumber); + MemoryUtil.WriteBytes(sMain.Instance + 0xA4, BitConverter.GetBytes(gameSpeed)); } - if (ImGui.InputText("Object2Addr", ref object2AddrStr, 32, ImGuiInputTextFlags.EnterReturnsTrue)) - { - object2Addr = (nint)Int64.Parse(object2AddrStr, NumberStyles.HexNumber); - } - if (ImGui.InputText("Object3Addr", ref object3AddrStr, 32, ImGuiInputTextFlags.EnterReturnsTrue)) + ImGui.Text($"Fps: {MemoryUtil.Read(sMain.Instance + 0x58)}"); + ImGui.Text($"Max Fps: {MemoryUtil.Read(sMain.Instance + 0x5C)}"); + ImGui.Text($"Actual Fps: {MemoryUtil.Read(sMain.Instance + 0x64)}"); + ImGui.Text($"Real Fps: {MemoryUtil.Read(sMain.Instance + 0x68)}"); + ImGui.Text($"Delta Time Adjust: {MemoryUtil.Read(sMain.Instance + 0x92)}"); + ImGui.Text($"Delta Time: {MemoryUtil.Read(sMain.Instance + 0x94)}"); + ImGui.Text($"Delta Time Border: {MemoryUtil.Read(sMain.Instance + 0x98)}"); + ImGui.Text($"Delta Time Limit: {MemoryUtil.Read(sMain.Instance + 0x9C)}"); + ImGui.Text($"Delta Sec: {MemoryUtil.Read(sMain.Instance + 0xA0)}"); + + nint timeAddr = MemoryUtil.Read(sMain.Instance + 0xAF878); + float gameTime = MemoryUtil.Read(timeAddr + 0x38); + if (ImGui.SliderFloat("Game Time", ref gameTime, 0.0f, 24.0f)) { - object3Addr = (nint)Int64.Parse(object3AddrStr, NumberStyles.HexNumber); + MemoryUtil.WriteBytes(timeAddr + 0x38, BitConverter.GetBytes(gameTime)); } - if (ImGui.InputText("Object4Addr", ref object4AddrStr, 32, ImGuiInputTextFlags.EnterReturnsTrue)) + /* + if (ImGui.InputFloat("Game Time", ref gameTime, 0.0f, 0.0f, null, ImGuiInputTextFlags.EnterReturnsTrue)) { - object4Addr = (nint)Int64.Parse(object4AddrStr, NumberStyles.HexNumber); + MemoryUtil.WriteBytes(timeAddr + 0x38, BitConverter.GetBytes(gameTime)); } - ImGui.Checkbox("Run Collision Func", ref runFunc); */ if (pCamera != null) { + //ImGui.Text($"viewModeObject: {psuedoViewModeObject:x}"); ImGui.Text("Perspective Camera"); ImGui.Text($"Player Camera: {pCamera.Instance:x}"); ImGui.Text($"Applying Offset: {applyPerspective}"); @@ -3516,7 +3726,6 @@ namespace MHWNewCamera ImGui.Separator(); } - if (ImGui.CollapsingHeader("Monsters")) { Monster[] monsters = Monster.GetAllMonsters(); @@ -3558,8 +3767,8 @@ namespace MHWNewCamera ImGui.PushID("Player"); ImGui.Text("Player"); ImGui.Text($"Pointer: {player.Instance:x}"); - ImGui.Text($"ActionController: {player.ActionController.Instance:x}"); + ImGui.Text($"ActionController: {player.ActionController.Instance:x}"); ActionInfo currentActionInfo = player.ActionController.CurrentAction; SharpPluginLoader.Core.Actions.Action? currentAction = null; if (currentActionInfo.ActionSet >= 0 && currentActionInfo.ActionSet <= 3) @@ -3585,6 +3794,7 @@ namespace MHWNewCamera // An experiment to test potential animation error could be try to keep deltasec as consistent as possible. ImGui.Text($" Delta Sec: {currentAction.DeltaSec}"); } + bool move = player.Move; if (ImGui.Checkbox("Move", ref move)) { @@ -3624,196 +3834,59 @@ namespace MHWNewCamera ImGui.Separator(); ImGui.Text("Graphics"); - nint baseAddr = MemoryUtil.Read(0x1451C4368); - ImGui.Text($"dofPointer: {dofPointer:x}"); - ImGui.Text($"prevFoliageLodBias: {prevFoliageLodBias}"); - ImGui.Text($"prevTerrainLodBias: {prevTerrainLodBias}"); + ImGui.Text($"prevFoliageLODBias: {prevFoliageLODBias}"); + ImGui.Text($"prevTerrainLODBias: {prevTerrainLODBias}"); ImGui.Text($"shadowCascadeValue: {lastShadowCascadeValue}"); ImGui.Text($"shadowBias: {lastShadowBias}"); ImGui.Text($"shadowRadius: {lastShadowRadius}"); - ImGui.PushItemWidth(width * 0.2f); - ImGui.Text("SSAO Depth Bias"); - ImGui.SameLine(); - ImGui.InputFloat("##SSAO Depth Bias", ref overrideSSAOParams.ssaoDepthBias, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue); - ImGui.SameLine(); - ImGui.Text($"Internal: {internalSSAOParams.ssaoDepthBias}"); - - ImGui.Text("SSAO Sloped Depth Bias"); - ImGui.SameLine(); - ImGui.InputFloat("##SSAO Sloped Depth Bias", ref overrideSSAOParams.ssaoSlopedDepthBias, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue); - ImGui.SameLine(); - ImGui.Text($"Internal: {internalSSAOParams.ssaoSlopedDepthBias}"); - - ImGui.Text("SSAO Max Depth Bias"); - ImGui.SameLine(); - ImGui.InputFloat("##SSAO Max Depth Bias", ref overrideSSAOParams.ssaoMaxDepthBias, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue); - ImGui.SameLine(); - ImGui.Text($"Internal: {internalSSAOParams.ssaoMaxDepthBias}"); - - ImGui.Text("SSAO Dispersion"); - ImGui.SameLine(); - ImGui.InputFloat("##SSAO Dispersion", ref overrideSSAOParams.ssaoDispersion, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue); - ImGui.SameLine(); - ImGui.Text($"Internal: {internalSSAOParams.ssaoDispersion}"); - ImGui.SameLine(); - ImGui.Text($"Set: {MemoryUtil.Read(baseAddr + 0xB4BC)}"); - - ImGui.Text("SSAO Effect"); - ImGui.SameLine(); - ImGui.InputFloat("##SSAO Effect", ref overrideSSAOParams.ssaoEffect, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue); - ImGui.SameLine(); - ImGui.Text($"Internal: {internalSSAOParams.ssaoEffect}"); - ImGui.SameLine(); - ImGui.Text($"Set: {MemoryUtil.Read(baseAddr + 0xB430)}"); - - ImGui.Text("SSAO Effect GI"); - ImGui.SameLine(); - ImGui.InputFloat("##SSAO Effect GI", ref overrideSSAOParams.ssaoEffectGI, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue); - ImGui.SameLine(); - ImGui.Text($"Internal: {internalSSAOParams.ssaoEffectGI}"); - ImGui.SameLine(); - ImGui.Text($"Set: {MemoryUtil.Read(baseAddr + 0xB434)}"); - - ImGui.Text("SSAO Depth Difference"); - ImGui.SameLine(); - ImGui.InputFloat("##SSAO Depth Difference", ref overrideSSAOParams.ssaoDepthDifference, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue); - ImGui.SameLine(); - ImGui.Text($"Internal: {internalSSAOParams.ssaoDepthDifference}"); - - ImGui.Text("SSAO Samples Per Pixel"); - ImGui.SameLine(); - ImGui.InputFloat("##SSAO Samples Per Pixel", ref overrideSSAOParams.ssaoSamplesPerPixel, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue); - ImGui.SameLine(); - ImGui.Text($"Internal: {internalSSAOParams.ssaoSamplesPerPixel}"); - - ImGui.Text("SSAO Max Samples"); - ImGui.SameLine(); - ImGui.InputInt("##SSAO Max Samples", ref overrideSSAOParams.ssaoMaxSampleNum, 0, 0, ImGuiInputTextFlags.EnterReturnsTrue); - ImGui.SameLine(); - ImGui.Text($"Internal: {internalSSAOParams.ssaoMaxSampleNum}"); - ImGui.SameLine(); - ImGui.Text($"Set: {MemoryUtil.Read(baseAddr + 0xB4C8)}"); - - ImGui.Text("SSAO Max Samples HQ"); - ImGui.SameLine(); - ImGui.InputInt("##SSAO Max Samples HQ", ref overrideSSAOParams.ssaoMaxSampleNumHQ, 0, 0, ImGuiInputTextFlags.EnterReturnsTrue); - ImGui.SameLine(); - ImGui.Text($"Internal: {internalSSAOParams.ssaoMaxSampleNumHQ}"); - ImGui.SameLine(); - ImGui.Text($"Set: {MemoryUtil.Read(baseAddr + 0xB4D0)}"); - - ImGui.Text("SSAO Radius"); - ImGui.SameLine(); - ImGui.InputFloat("##SSAO Radius", ref overrideSSAOParams.ssaoRadius, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue); - ImGui.SameLine(); - ImGui.Text($"Internal: {internalSSAOParams.ssaoRadius}"); - - ImGui.Text("SSAO Intensity"); - ImGui.SameLine(); - ImGui.InputFloat("##SSAO Intensity", ref overrideSSAOParams.ssaoIntensity, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue); - ImGui.SameLine(); - ImGui.Text($"Internal: {internalSSAOParams.ssaoIntensity}"); - ImGui.SameLine(); - ImGui.Text($"Set: {MemoryUtil.Read(baseAddr + 0xB4E0)}"); - - ImGui.Text("SSAO Bias"); - ImGui.SameLine(); - ImGui.InputFloat("##SSAO Bias", ref overrideSSAOParams.ssaoBias, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue); - ImGui.SameLine(); - ImGui.Text($"Internal: {internalSSAOParams.ssaoBias}"); - ImGui.SameLine(); - ImGui.Text($"Set: {MemoryUtil.Read(baseAddr + 0xB4D8)}"); - - ImGui.Text("SSAO Use HiZ"); - ImGui.SameLine(); - ImGui.Checkbox("##SSAO Use HiZ", ref overrideSSAOParams.ssaoUseHiZ); - ImGui.SameLine(); - ImGui.Text($"Internal: {internalSSAOParams.ssaoUseHiZ}"); - - ImGui.Text("SSAO Edge Atten Rate"); - ImGui.SameLine(); - ImGui.InputFloat("##SSAO Edge Atten Rate", ref overrideSSAOParams.ssaoEdgeAttenRate, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue); - ImGui.SameLine(); - ImGui.Text($"Internal: {internalSSAOParams.ssaoEdgeAttenRate}"); - ImGui.PopItemWidth(); - - float cbAlphaUnrollNear = MemoryUtil.Read(baseAddr + 0xE964); - if (ImGui.InputFloat("cbAlphaUnrollNear", ref cbAlphaUnrollNear, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue)) - { - MemoryUtil.WriteBytes(baseAddr + 0xE964, BitConverter.GetBytes(cbAlphaUnrollNear)); - } - - float cbAlphaUnrollFar = MemoryUtil.Read(baseAddr + 0xE968); - if (ImGui.InputFloat("cbAlphaUnrollFar", ref cbAlphaUnrollFar, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue)) - { - MemoryUtil.WriteBytes(baseAddr + 0xE968, BitConverter.GetBytes(cbAlphaUnrollNear)); - } - - float cbHistoryBlendRate = MemoryUtil.Read(baseAddr + 0xE96C); - if (ImGui.InputFloat("cbHistoryBlendRate", ref cbHistoryBlendRate, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue)) - { - MemoryUtil.WriteBytes(baseAddr + 0xE96C, BitConverter.GetBytes(cbHistoryBlendRate)); - } - - int cbSanitizeColor = MemoryUtil.Read(baseAddr + 0xE972); - if (ImGui.InputInt("cbSanitizeColor", ref cbSanitizeColor, 0, 0, ImGuiInputTextFlags.EnterReturnsTrue)) - { - MemoryUtil.WriteBytes(baseAddr + 0xE972, BitConverter.GetBytes(cbSanitizeColor)); - } - - float cbBlendDither = MemoryUtil.Read(baseAddr + 0xE973); - if (ImGui.InputFloat("cbBlendDither", ref cbBlendDither, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue)) - { - MemoryUtil.WriteBytes(baseAddr + 0xE973, BitConverter.GetBytes(cbBlendDither)); - } - - float cbDitherBBoxStrength = MemoryUtil.Read(baseAddr + 0xE974); - if (ImGui.InputFloat("cbDitherBBoxStrength", ref cbDitherBBoxStrength, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue)) - { - MemoryUtil.WriteBytes(baseAddr + 0xE974, BitConverter.GetBytes(cbDitherBBoxStrength)); - } - - float cbDitherPassthruWeight = MemoryUtil.Read(baseAddr + 0xE978); - if (ImGui.InputFloat("cbDitherPassthruWeight", ref cbDitherPassthruWeight, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue)) - { - MemoryUtil.WriteBytes(baseAddr + 0xE978, BitConverter.GetBytes(cbDitherPassthruWeight)); - } - - float cbDitherFilteredWeight = MemoryUtil.Read(baseAddr + 0xE97C); - if (ImGui.InputFloat("cbDitherFilteredWeight", ref cbDitherFilteredWeight, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue)) - { - MemoryUtil.WriteBytes(baseAddr + 0xE97C, BitConverter.GetBytes(cbDitherFilteredWeight)); - } - - bool cbContinuousHistoryReset = MemoryUtil.Read(baseAddr + 0xE971) == 1; - if (ImGui.Checkbox("cbContinuousHistoryReset", ref cbContinuousHistoryReset)) - { - MemoryUtil.WriteBytes(baseAddr + 0xE971, cbContinuousHistoryReset ? [0x1] : [0x0]); - } - - if (ImGui.Checkbox("Renderer Param Overrides", ref applyRendererOverrides)) - { - writeSSAOParams(baseAddr, applyRendererOverrides ? overrideSSAOParams : internalSSAOParams); - } - ImGui.SameLine(); - if (ImGui.Button("Copy from internal")) - { - overrideSSAOParams.ssaoDepthBias = internalSSAOParams.ssaoDepthBias; - overrideSSAOParams.ssaoSlopedDepthBias = internalSSAOParams.ssaoSlopedDepthBias; - overrideSSAOParams.ssaoMaxDepthBias = internalSSAOParams.ssaoMaxDepthBias; - overrideSSAOParams.ssaoDispersion = internalSSAOParams.ssaoDispersion; - overrideSSAOParams.ssaoEffect = internalSSAOParams.ssaoEffect; - overrideSSAOParams.ssaoEffectGI = internalSSAOParams.ssaoEffectGI; - overrideSSAOParams.ssaoDepthDifference = internalSSAOParams.ssaoDepthDifference; - overrideSSAOParams.ssaoSamplesPerPixel = internalSSAOParams.ssaoSamplesPerPixel; - overrideSSAOParams.ssaoMaxSampleNum = internalSSAOParams.ssaoMaxSampleNum; - overrideSSAOParams.ssaoMaxSampleNumHQ = internalSSAOParams.ssaoMaxSampleNumHQ; - overrideSSAOParams.ssaoRadius = internalSSAOParams.ssaoRadius; - overrideSSAOParams.ssaoBias = internalSSAOParams.ssaoBias; - overrideSSAOParams.ssaoIntensity = internalSSAOParams.ssaoIntensity; - overrideSSAOParams.ssaoUseHiZ = internalSSAOParams.ssaoUseHiZ; - overrideSSAOParams.ssaoEdgeAttenRate = internalSSAOParams.ssaoEdgeAttenRate; + if (ImGui.CollapsingHeader("Renderer Parameters")) + { + nint baseAddr = MemoryUtil.Read(0x1451C4368); + ImGui.Text($"Address: {baseAddr:x}"); + ImGui.PushItemWidth(width * 0.2f); + drawRenderParameter("SSAO Depth Bias", baseAddr, 0xB4B0); + drawRenderParameter("SSAO Sloped Depth Bias", baseAddr, 0xB4B4); + drawRenderParameter("SSAO Max Depth Bias", baseAddr, 0xB4B8); + drawRenderParameter("SSAO Dispersion", baseAddr, 0xB4BC); + drawRenderParameter("SSAO Effect", baseAddr, 0xB430); + drawRenderParameter("SSAO Effect GI", baseAddr, 0xB434); + drawRenderParameter("SSAO Depth Difference", baseAddr, 0xB4C0); + drawRenderParameter("SSAO Samples Per Pixel", baseAddr, 0xB4C4); + drawRenderParameter("SSAO Max Sample Num", baseAddr, 0xB4C8); + drawRenderParameter("SSAO Max Sample Num HQ", baseAddr, 0xB4D0); + drawRenderParameter("SSAO Radius", baseAddr, 0xB4D4); + drawRenderParameter("SSAO Bias", baseAddr, 0xB4D8); + drawRenderParameter("SSAO Intensity", baseAddr, 0xB4E0); + drawRenderParameter("SSAO Use HiZ", baseAddr, 0xB4E5); + drawRenderParameter("SSAO Edge Atten Rate", baseAddr, 0xB4DC); + drawRenderParameter("SSLR Loop Count", baseAddr, 0xE628); + drawRenderParameter("SSLR Loop Count Factor For CBR", baseAddr, 0xE62C); + drawRenderParameter("SSLR Eliminate Depth", baseAddr, 0xE630); + drawRenderParameter("SSLR Accurate Threshold", baseAddr, 0xE644); + drawRenderParameter("SSLR Accurate Threshold HQ", baseAddr, 0xE64C); + drawRenderParameter("SSLR Dither Radius", baseAddr, 0xE634); + drawRenderParameter("SSLR Importance Bias", baseAddr, 0xE638); + drawRenderParameter("SSLR Mip Scale", baseAddr, 0xE63C); + drawRenderParameter("SSLR Mip Bias", baseAddr, 0xE640); + drawRenderParameter("SSLR Dither Resolve", baseAddr, 0xB43F); + drawRenderParameter("SSLR Edge Atten Rate", baseAddr, 0xB428); + drawRenderParameter("SSLR Mip 0 Count Threshold", baseAddr, 0xB438); + drawRenderParameter("SSLR Depth Eliminate Rate", baseAddr, 0xB42C); + drawRenderParameter("SSLR Use Mipmap", baseAddr, 0xE650); + drawRenderParameter("SSLR GBuffer Jitter", baseAddr, 0xB440); + /* + drawRenderParameter("Checkerboard Alpha Unroll Near", baseAddr, 0xE964); + drawRenderParameter("Checkerboard Alpha Unroll Far", baseAddr, 0xE968); + drawRenderParameter("Checkerboard History Blend Rate", baseAddr, 0xE96C); + drawRenderParameter("Checkerboard Sanitize Color", baseAddr, 0xE972); + drawRenderParameter("Checkerboard Blend Dither", baseAddr, 0xE973); + drawRenderParameter("Checkerboard BBox Strength", baseAddr, 0xE974); + drawRenderParameter("Checkerboard Dither Passthru Weight", baseAddr, 0xE978); + drawRenderParameter("Checkerboard Dither Filtered Weight", baseAddr, 0xE97C); + drawRenderParameter("Checkerboard Continous History Reset", baseAddr, 0xE971); + */ + ImGui.PopItemWidth(); } ImGui.Separator(); -- cgit v1.2.3-101-g0448