From 50779390ff2a2c36eacae05e951e7aad7b18af7c Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Wed, 18 Feb 2026 23:53:30 -0500 Subject: Bunch of graphics stuff Signed-off-by: Andrew Opalach --- Plugin.cs | 534 +++++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 333 insertions(+), 201 deletions(-) diff --git a/Plugin.cs b/Plugin.cs index e24ae26..fe9631c 100755 --- a/Plugin.cs +++ b/Plugin.cs @@ -2,6 +2,7 @@ //#define HOOK_ORDER_ASSERTS //#define LOG_DEBUG_MESSAGES #define MOUSE_AND_KEYBOARD_LAYER +//#define SHADER_FEATURES //#define QUARANTINED_FEATURES using ImGuiNET; @@ -45,6 +46,9 @@ using SharpPluginLoader.Core.Configuration; // - Open Poses Menu // @TODO: +// - Cleanup volume rendering test stuff. +// - Better hook for renderer params. +// - Alternate settings for your room. // - Centralize all bindings to get a better idea of how to structure custom binds. // - Use GetRef<>. // - Hide Hunter's Knife/Slinger. @@ -84,7 +88,7 @@ using SharpPluginLoader.Core.Configuration; // - Exit of central camp in Horfrost Reach. // - Sporepuff area in The Ancient Forest. // - Wildspire Waste entrence to enclosed area past the waterfall. -// - The Rotten Vale jump out of camp (fill out camp name). +// - The Rotten Vale jump out of Southeast Camp. Wall on the opposite side slightly to the left. // - Camera pitch wrap around while in the tent will sometimes flicker at the point of wrapping. // - Likely due to the unpredictable position of SetCameraTentHook() in the chain of hooks. Updating // free camera state within SetCameraTentHook() is not a solution because it comes out laggy. @@ -197,6 +201,7 @@ namespace MHWNewCamera private bool disableMod = false; private static readonly MtObject sMain = SingletonManager.GetSingleton("sMhMain")!; + private static readonly MtObject sUmbra = SingletonManager.GetSingleton("sUmbra")!; private bool freezeGame = false; private float cameraSpeed; @@ -210,9 +215,8 @@ namespace MHWNewCamera private float cameraFov = DEFAULT_FOV; private float cameraForward = 0.0f; private float cameraRight = 0.0f; - private float cameraXOffset = 0.0f; - private float cameraYOffset = 0.0f; - private float cameraZOffset = 0.0f; + private float cameraUp = 0.0f; + private Vector3 cameraOffset; private float cameraYaw = 0.0f; private float cameraPitch = 0.0f; private float cameraRoll = 0.0f; @@ -350,9 +354,31 @@ namespace MHWNewCamera private delegate void CameraEffectDelegate(nint unknownPtr, nint unknownPtr2, nint unknownPtr3); private Hook? cameraEffectHook; - private nint fxaaAddr = 0x0; - private delegate void FXAADelegate(nint unknownPtr, nint unknownPtr2); - private Hook? fxaaHook; + private bool higherVolumeQuality = false; + private Patch value2ForVolumeQuality; + + private bool disableVolumeDownsample = false; + private Patch volumeSars1; + private Patch volumeSars2; + private Patch volumeSars3; + private Patch volumeSars4; + private Patch volumeSars5; + private Patch volumeSars6; + private Patch volumeSars7; + private Patch volumeSars8; + private Patch volumeSars9; + + private delegate nint CreateLightingObject(nint unknownPtr); + private delegate nint DestroyLightingObject(nint unknownPtr, nint unknownPtr2); + private Hook? createLightingObject; + private Hook? destroyLightingObject; + private nint lightingObject = 0x0; + + private delegate nint CreateFXAAObject(nint unknownPtr, int unknownInt); + private delegate nint DestroyFXAAObject(nint unknownPtr, int unknownInt); + private Hook? createFXAAObject; + private Hook? destroyFXAAObject; + private nint fxaaObject = 0x0; private Patch swapMinimapFollowsCamera; @@ -373,7 +399,7 @@ namespace MHWNewCamera private Patch shadowRes1_3; private Patch shadowRes2; private Patch shadowRes3; - private Patch shadowRes4_Limit; + //private Patch shadowRes4_Limit; private float shadowBiasOffset = 0.0f; private float shadowRadiusOffset = 0.0f; @@ -383,6 +409,18 @@ namespace MHWNewCamera private float lastShadowRadius = -1.0f; private nint lastShadowCascadeValue = -1; + private bool applyShadowAdjust = false; + private float lastShadowDistance; + private float lastShadowDistribution; + private float lastShadowBackforwardDistance; + //private float lastBroadAreaShadowRange; + //private float lastShadowFov; + private float shadowDistance = 5000.0f; + private float shadowDistribution = 0.200000003f; + private float shadowBackforwardDistance = 15000.0f; + //private float broadAreaShadowRange = 50000.0f; + //private float shadowFov = 40.0f; + private void tripleShadowResEnable() { shadowRes1_3x.Enable(); @@ -391,7 +429,7 @@ namespace MHWNewCamera shadowRes1_3.Enable(); shadowRes2.Enable(); shadowRes3.Enable(); - shadowRes4_Limit.Enable(); + //shadowRes4_Limit.Enable(); } private void tripleShadowResDisable() @@ -402,7 +440,7 @@ namespace MHWNewCamera shadowRes1_3.Disable(); shadowRes2.Disable(); shadowRes3.Disable(); - shadowRes4_Limit.Disable(); + //shadowRes4_Limit.Disable(); } private int internalShadowSampleNumHQ; // +0xE5CC @@ -450,18 +488,6 @@ namespace MHWNewCamera defaultViewModeLODLimit_2.Disable(); } - /* - private NativeAction setCharacterCreatorParams; - private NativeAction setSaveSelectParams; - private delegate void LODLimitDelegate(nint unknownPtr); - private Hook? setLODLimitsHook; - private bool characterCreatorRendering = false; - private bool saveSelectRendering = false; - private nint psuedoCharacterCreatorObject; - */ - //private Patch defaultCharacterCreatorParam; - //private bool characterCreatorFace = false; - private bool largerFoliageSwayRange = false; private Patch addressHigherValueForFoliageSway; @@ -496,24 +522,6 @@ namespace MHWNewCamera underwaterCamera5.Disable(); } - private bool forceOffVolumeDownsampleAndBlur = false; - private Patch zeroVolumeDownsample; - - private bool disableVolumeDownsample = false; - private Patch volumeSars1; - private Patch volumeSars2; - private Patch volumeSars3; - private Patch volumeSars4; - private Patch volumeSars5; - private Patch volumeSars6; - private Patch volumeSars7; - private Patch volumeSars8; - private Patch volumeSars9; - - private delegate nint CreateLightingObject(nint unknownPtr); - private Hook? createLightingObject; - private nint lightingObject = 0x0; - private bool hideWeapon = false; private bool disableCollision = false; @@ -671,7 +679,7 @@ namespace MHWNewCamera shadowRadiusOffset = graphics.ShadowRadiusOffset; applyShadowBias = graphics.ApplyShadowRange; applyShadowRadius = graphics.ApplyShadowRadius; - lowShadowDetailOverride = graphics.HigherShadowDetailInHoarfrost; + //lowShadowDetailOverride = graphics.HigherShadowDetailInHoarfrost; enableHQMode = graphics.EnableHQMode; ssaoAdjustments = enableHQMode; ssrAdjustments = enableHQMode; @@ -822,8 +830,6 @@ namespace MHWNewCamera cameraEffectHook = Hook.Create(0x141AB6AE0, CameraEffectHook); // nint, nint, nint - fxaaHook = Hook.Create(0x1423939D0, FXAAHook); // nint, nint - unchecked { addr = PatternScanner.FindFirst(Pattern.FromString("84 C0 0F 84 ?? ?? ?? ?? 48 8B 57 28 45 33 C0 48 8B CE E8 ?? ?? ?? ?? 48 8B 97 E0 01 00 00 41 B0 01 48 8B CE E8 ?? ?? ?? ?? 48 8B 0D ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 8B D8")); @@ -885,18 +891,18 @@ namespace MHWNewCamera 0xC7, 0x81, 0x20, 0x55, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xC3 ]); + /* addr = PatternScanner.FindFirst(Pattern.FromString("89 91 00 55 00 00 83 FA 05 77 41 48 63 C2 4C 8D 05 ?? ?? ?? ?? 41 8B 94 80 84 8B 28 02 49 03 D0 FF E2 B8 00 08 00 00")); #if ADDR_ASSERTS Trace.Assert(addr == 0x142288B00); #endif - // It's hard to tell exactly what this value does. It appears to be labeled "iPrimaryShadowSampleNum", - // but I may be reading the code wrong. Nevertheless, shadows in the Seliana smithy break if this value - // isn't increased. The value is already multiplied by the shadow resolution so directly increasing - // it here will result in an even bigger multiplier. Original value is 2816, with this offset and - // Shadow Quality: High the result will be 16320. Going past some number around N/64 >= 256 will crash. + // This value controls the shadow map texture resolution. 16384x16384 is likely the limit for many drivers + // and any value higher would crash. Keeping this at the default value *should* work unless the game + // does something unpredictable. At 3x Shadow Resolution, the shadow map will be 8448x8448. shadowRes4_Limit = new Patch(addr + 0x29, [ // N/64 = 255, fractional values closer to 256 not tested. 0xB8, 0x40, 0x15, 0x00, 0x00, 0xEB, 0x21 // This case is used for Low, Medium and High in-game. ]); + */ if (tripleShadowRes && !disableMod) { tripleShadowResEnable(); @@ -983,7 +989,8 @@ namespace MHWNewCamera underwaterCamera5 = new Patch((nint)0x141FA5A74, [0x0F, 0x57, 0xF6, 0x31, 0xD2, 0x48, 0x8D, 0x4D, 0x80, 0xE8, 0x9E, 0x41, 0x38, 0xFE, 0xC1, 0xE8, 0x14, 0x66, 0x25, 0xD8, 0x03, 0xFF, 0xC8, 0x66, 0x3D, 0x48, 0x00, 0x77]); underwaterCheckHook = Hook.Create(0x1412AD500, UnderwaterCheckHook); // nint - zeroVolumeDownsample = new Patch((nint)0x1424D09B2, [0x31, 0xDB, 0x90, 0x90, 0x90, 0x90, 0x90]); + value2ForVolumeQuality = new Patch((nint)0x142389652, [0xB8, 0x02, 0x00, 0x00, 0x00, 0x90]); + volumeSars1 = new Patch((nint)0x1424D0159, [0x90, 0x90]); volumeSars2 = new Patch((nint)0x1424D01A0, [0x90, 0x90]); volumeSars3 = new Patch((nint)0x1424D01C6, [0x90, 0x90]); @@ -1005,7 +1012,12 @@ namespace MHWNewCamera volumeSars8.Enable(); volumeSars9.Enable(); } - createLightingObject = Hook.Create(0x1424CE130, CreateLightingObjectHook); + + createLightingObject = Hook.Create(0x1424CE130, CreateLightingObjectHook); // nint + destroyLightingObject = Hook.Create(0x1424CE380, DestroyLightingObjectHook); // nint, nint + + createFXAAObject = Hook.Create(0x1423936E0, CreateFXAAObjectHook); // nint, int + destroyFXAAObject = Hook.Create(0x142393740, DestroyFXAAObjectHook); // nint, int // Player + ECCC = How far underwater is the player. jmpOverHotSpringsEval = new Patch((nint)0x1417C1B03, [0xEB]); @@ -1152,9 +1164,7 @@ namespace MHWNewCamera orbitDistance += cameraForward - preset.Forward; cameraForward = preset.Forward; cameraRight = preset.Right; - cameraXOffset = 0.0f; - cameraYOffset = preset.Up; - cameraZOffset = 0.0f; + cameraUp = preset.Up; cameraRoll = preset.Roll; if (restoreRoll != null) { @@ -1188,6 +1198,19 @@ namespace MHWNewCamera } } + private void resetStatePerFrame() + { + primaryPad = 0x0; + + // Zero pad input in case no controllers are connected. + PadLx = 0; PadLy = 0; + PadRx = 0; PadRy = 0; + + cameraOffset.X = 0.0f; + cameraOffset.Y = 0.0f; + cameraOffset.Z = 0.0f; + } + public void OnUpdate(float deltaTime) { if (disableMod) @@ -1203,6 +1226,8 @@ namespace MHWNewCamera debugLog($"OnUpdate() @ {frameTick}"); #endif + resetStatePerFrame(); + #if MOUSE_AND_KEYBOARD_LAYER if (keyboardEnabled) { @@ -1237,11 +1262,6 @@ namespace MHWNewCamera } #endif - primaryPad = 0x0; - // Zero pad input in case no controllers are connected. - PadLx = 0; PadLy = 0; - PadRx = 0; PadRy = 0; - if (freeCameraFallback) { Player? player = checkPlayerChange(); @@ -1289,8 +1309,6 @@ namespace MHWNewCamera } } } - - fxaaAddr = 0x0; } private static Quaternion getForward(Vector3 pos, Vector3 target) @@ -1373,13 +1391,14 @@ namespace MHWNewCamera forward = Quaternion.Normalize(forward); right = Quaternion.Normalize(right); Vector3 pos = camera.Position; - pos.X += forward.X * cameraForward; - pos.Y += forward.Y * cameraForward; - pos.Z += forward.Z * cameraForward; - pos.X += right.X * cameraRight; - pos.Z += right.Z * cameraRight; - pos.X += cameraXOffset; - pos.Z += cameraZOffset; + cameraOffset.X = forward.X * cameraForward; + cameraOffset.Y = forward.Y * cameraForward; + cameraOffset.Z = forward.Z * cameraForward; + cameraOffset.X += right.X * cameraRight; + cameraOffset.Z += right.Z * cameraRight; + pos.X += cameraOffset.X; + pos.Y += cameraOffset.Y; + pos.Z += cameraOffset.Z; camera.Position = pos; if (cameraFov != DEFAULT_FOV) { @@ -1969,7 +1988,7 @@ namespace MHWNewCamera if (applyPerspective) { // Applying Y offset here keeps crosshair UI centered, but affects the angle of the camera. - pCamera!.Position.Y += cameraYOffset; + pCamera!.Position.Y += cameraUp; } if (perspectiveFovOnly && cameraFov != DEFAULT_FOV) @@ -2128,10 +2147,12 @@ namespace MHWNewCamera private void CalculateViewHook(nint unknownPtr) { calculateViewHook!.Original(unknownPtr); + if (disableMod) { return; } + if (vCameraViewportIndex >= 0 && cameraRoll != 0.0f) { Viewport vp = CameraSystem.GetViewport(vCameraViewportIndex); @@ -2152,7 +2173,7 @@ namespace MHWNewCamera debugLog($"ShadowCascadeHook({unknownPtr:x}, {unknownPtr2:x}) @ {frameTick}"); #endif - nint rax = MemoryUtil.Read(unknownPtr2 + 0x170); + ref nint rax = ref MemoryUtil.GetRef(unknownPtr2 + 0x170); nint shadowCascadeValue = rax >> 32; if (shadowCascadeValue != 3) { @@ -2165,7 +2186,7 @@ namespace MHWNewCamera if (lowShadowDetailOverride && shadowCascadeValue == 1) { shadowCascadeValue++; - MemoryUtil.WriteBytes(unknownPtr2 + 0x170, BitConverter.GetBytes((shadowCascadeValue << 32) | (rax & 0x00000000FFFFFFFF))); + rax = (nint)((shadowCascadeValue << 32) | (rax & 0x00000000FFFFFFFF)); biasOverride += shadowBiasOffset; } @@ -2174,23 +2195,47 @@ namespace MHWNewCamera if (applyShadowBias) { // If HQ Mode is enabled, this value will be maxss'd with the HQ value before use. - MemoryUtil.WriteBytes(unknownPtr2 + 0x17C, BitConverter.GetBytes(biasOverride)); + MemoryUtil.GetRef(unknownPtr2 + 0x17C) = biasOverride; } if (applyShadowRadius) { - float radiusOverride = lastShadowRadius + shadowRadiusOffset; - MemoryUtil.WriteBytes(unknownPtr2 + 0x1EC, BitConverter.GetBytes(radiusOverride)); + MemoryUtil.GetRef(unknownPtr2 + 0x1EC) = lastShadowRadius + shadowRadiusOffset; } } - // @TODO: Find a better place where we can update snow parameters. if (applyLODFactors) { + // @TODO: Find a more proper place where we can update snow parameters. nint baseAddr = MemoryUtil.Read(0x1451C4368); - MemoryUtil.WriteBytes(baseAddr + 0x5718, BitConverter.GetBytes(snowField4GlobalLODParam)); + MemoryUtil.GetRef(baseAddr + 0x5718) = snowField4GlobalLODParam; } shadowCascadeHook!.Original(unknownPtr, unknownPtr2); + + if (shadowCascadeValue != 3) + { + lastShadowDistance = MemoryUtil.GetRef(unknownPtr + 0x6C); + lastShadowDistribution = MemoryUtil.GetRef(unknownPtr + 0x74); + lastShadowBackforwardDistance = MemoryUtil.GetRef(unknownPtr + 0x7C); + //lastBroadAreaShadowRange = MemoryUtil.GetRef(unknownPtr + 0x1B0); + //lastShadowFov = MemoryUtil.GetRef(unknownPtr + 0x1F4); + + /* + if (Area.CurrentStage == Stage.Astera) + { + // @TODO: Account for moving values. + } + */ + + if (applyShadowAdjust) + { + MemoryUtil.GetRef(unknownPtr + 0x6C) = shadowDistance; + MemoryUtil.GetRef(unknownPtr + 0x74) = shadowDistribution; + MemoryUtil.GetRef(unknownPtr + 0x7C) = shadowBackforwardDistance; + //MemoryUtil.GetRef(unknownPtr + 0x1B0) = broadAreaShadowRange; + //MemoryUtil.GetRef(unknownPtr + 0x1F4) = shadowFov; + } + } } private void setSSAOAdjustements(bool enable, bool b) @@ -2777,6 +2822,7 @@ namespace MHWNewCamera collisionCheckHook!.Original(unknownPtr, unknownPtr2); } +#if QUARANTINED_FEATURES private void SetZoneStateHook(nint player, int flags) { nint zoneStateAddr = MemoryUtil.Read(0x1451C42B8); @@ -2800,6 +2846,7 @@ namespace MHWNewCamera } setZoneStateHook!.Original(player, flags); } +#endif private void RefreshEntityParamsHook(nint entity, nint unknownPtr2) { @@ -2817,12 +2864,6 @@ namespace MHWNewCamera } } - private nint CreateLightingObjectHook(nint unknownPtr) - { - lightingObject = createLightingObject!.Original(unknownPtr); - return lightingObject; - } - private void toggleFreezeGame() { freezeGame = !freezeGame; @@ -2916,20 +2957,28 @@ namespace MHWNewCamera } } - private void FXAAHook(nint unknownPtr, nint unknownPtr2) + private nint CreateLightingObjectHook(nint unknownPtr) { - fxaaHook!.Original(unknownPtr, unknownPtr2); + lightingObject = createLightingObject!.Original(unknownPtr); + return lightingObject; + } - if (disableMod) - { - return; - } + private nint DestroyLightingObjectHook(nint unknownPtr, nint unknownPtr2) + { + lightingObject = 0x0; + return destroyLightingObject!.Original(unknownPtr, unknownPtr2); + } -#if HOOK_ORDER_ASSERTS - debugLog($"FXAAHook({unknownPtr:x}, {unknownPtr2:x}) @ {frameTick}"); -#endif + private nint CreateFXAAObjectHook(nint unknownPtr, int unknownInt) + { + fxaaObject = createFXAAObject!.Original(unknownPtr, unknownInt); + return fxaaObject; + } - fxaaAddr = unknownPtr; + private nint DestroyFXAAObjectHook(nint unknownPtr, int unknownInt) + { + fxaaObject = 0x0; + return destroyFXAAObject!.Original(unknownPtr, unknownInt); } private void drawViewportInfo(int i, float width, Config config, bool debug) @@ -3162,7 +3211,7 @@ namespace MHWNewCamera } } - private static T drawRenderParameter(string name, nint baseAddr = 0x0, nint offset = 0x0, bool zeroToOne = false) where T : unmanaged + private static T drawRenderParameter(string name, nint baseAddr = 0x0, nint offset = 0x0, bool zeroToOne = false, float step = 0.0f) where T : unmanaged { nint addr = baseAddr + offset; T? currentValue = null; @@ -3192,7 +3241,8 @@ namespace MHWNewCamera else if (typeof(T) == typeof(int)) { int valueI = Convert.ToInt32(currentValue); - if (ImGui.InputInt(name, ref valueI, 0, 0, ImGuiInputTextFlags.EnterReturnsTrue)) + int stepI = (int)Math.Round(step); + if (ImGui.InputInt(name, ref valueI, stepI, 0, ImGuiInputTextFlags.EnterReturnsTrue)) { MemoryUtil.WriteBytes(addr, BitConverter.GetBytes(valueI)); } @@ -3309,12 +3359,7 @@ namespace MHWNewCamera { zeroFrameSkip.Disable(); } - /* - if (disableVolumeDownsample) - { - zeroVolumetricDownsample.Disable(); - } - */ + // @TODO: Volume rendering. if (disableCharacterFade) { noopCharacterFade.Disable(); @@ -3371,12 +3416,6 @@ namespace MHWNewCamera { zeroFrameSkip.Enable(); } - /* - if (disableVolumeDownsample) - { - zeroVolumetricDownsample.Enable(); - } - */ if (pCameraViewportIndex >= 0) { setDisableFadingObjects(pCameraViewportIndex, disableFading); @@ -3403,6 +3442,43 @@ namespace MHWNewCamera } } +#if SHADER_FEATURES + public unsafe void OnCreateShader(ShaderInfo *info) + { + string hash = new string(info->DxbcHash); + if (hash == "2e4e18fd-6ea5eeae-2de3d65c-26ab36dd") + { + byte[] shaderData; + try + { + shaderData = System.IO.File.ReadAllBytes("./volume_upsample.shdr"); + } + catch (Exception) + { + return; + } + info->NewSourceType = SourceType.BINARY; + info->NewSourceLength = shaderData.Length; + info->NewSource = (byte*)Marshal.UnsafeAddrOfPinnedArrayElement(shaderData, 0); + } + else if (hash == "e2c8c13e-45bc99b2-4c3d7699-3d66188e") + { + byte[] shaderData; + try + { + shaderData = System.IO.File.ReadAllBytes("./volume_upsample2.shdr"); + } + catch (Exception) + { + return; + } + info->NewSourceType = SourceType.BINARY; + info->NewSourceLength = shaderData.Length; + info->NewSource = (byte*)Marshal.UnsafeAddrOfPinnedArrayElement(shaderData, 0); + } + } +#endif + public void OnImGuiRender() { #if HOOK_ORDER_ASSERTS @@ -3463,7 +3539,7 @@ namespace MHWNewCamera ImGui.DragFloat("Field of View", ref cameraFov, 0.4f, 1.0f, 179.0f); ImGui.DragFloat("Forward", ref cameraForward, 0.25f); ImGui.DragFloat("Right", ref cameraRight, 0.25f); - ImGui.DragFloat("Up", ref cameraYOffset, 0.025f); + ImGui.DragFloat("Up", ref cameraUp, 0.025f); if (ImGui.DragFloat("Roll", ref cameraRoll, 0.25f)) { if (restoreRoll != null) @@ -3498,9 +3574,7 @@ namespace MHWNewCamera cameraFov = DEFAULT_FOV; cameraForward = 0.0f; cameraRight = 0.0f; - cameraXOffset = 0.0f; - cameraYOffset = 0.0f; - cameraZOffset = 0.0f; + cameraUp = 0.0f; cameraRoll = 0.0f; if (restoreRoll != null) { @@ -3528,7 +3602,7 @@ namespace MHWNewCamera preset.FieldOfView = cameraFov; preset.Forward = cameraForward; preset.Right = cameraRight; - preset.Up = cameraYOffset; + preset.Up = cameraUp; preset.Roll = cameraRoll; preset.DisableFading = (pCameraViewportIndex >= 0) ? getDisableFadingObjects(pCameraViewportIndex) : false; if (config.Presets.ContainsKey(name)) @@ -4660,6 +4734,7 @@ namespace MHWNewCamera } ImGui.PopItemWidth(); + /* if (ImGui.Checkbox("Higher Shadow Detail in Hoarfrost Reach/Seliana Gathering Hub", ref lowShadowDetailOverride)) { Config.GraphicalTweaks graphics = config.Graphics; @@ -4672,6 +4747,7 @@ namespace MHWNewCamera 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("Enable \"HQ Mode\"", ref enableHQMode)) { @@ -4691,7 +4767,7 @@ namespace MHWNewCamera ImGui.EndTooltip(); } - if (ImGui.Checkbox("Full Resolution Volume Rendering", ref disableVolumeDownsample)) + if (ImGui.Checkbox("Volume Rendering Full Resolution Blur Pass (Requires Area Change)", ref disableVolumeDownsample)) { if (disableVolumeDownsample) { @@ -4722,6 +4798,28 @@ namespace MHWNewCamera config.Graphics = graphics; ConfigManager.SaveConfig(this); } + if (ImGui.BeginItemTooltip()) + { + ImGui.Text("This can get rid of excessive aliasing when an object is in front of a volumetric effect.\nYou have to move to a different area one time for this to apply. It will remain applied after that."); + ImGui.EndTooltip(); + } + + if (ImGui.Checkbox("Higher Than \"Highest\" Volume Rendering Quality", ref higherVolumeQuality)) + { + if (higherVolumeQuality) + { + value2ForVolumeQuality.Enable(); + } + else + { + value2ForVolumeQuality.Disable(); + } + } + if (ImGui.BeginItemTooltip()) + { + ImGui.Text("*Extremely Resource Intensive* Only noticeable effect is likely in areas that had visible breakup with Volume Rendering Quality: Highest.\nThis takes mostly the same path as Highest, so expect the same visual artifacts."); + ImGui.EndTooltip(); + } if (ImGui.Checkbox("Disable Player/Palico/NPC LOD Limit in Gameplay", ref disableLODLimits)) { @@ -4853,6 +4951,127 @@ namespace MHWNewCamera ImGui.EndTooltip(); } + if (ImGui.CollapsingHeader("Shadow Distance Parameters")) + { + ImGui.PushItemWidth(width * 0.2f); + ImGui.Text($"sUmbra: {sUmbra.Instance:x}"); + nint obj = MemoryUtil.Read(sUmbra.Instance + 0x00149740); + ImGui.Text($"Object Address: {obj:x}"); + ImGui.Checkbox("Apply Adjust", ref applyShadowAdjust); + ImGui.InputFloat("Shadow Distance", ref shadowDistance); + ImGui.Text($"Original: {lastShadowDistance}"); + ImGui.InputFloat("Shadow Distribution", ref shadowDistribution); + ImGui.Text($"Original: {lastShadowDistribution}"); + ImGui.InputFloat("Shadow Backforward Distance", ref shadowBackforwardDistance); + ImGui.Text($"Original: {lastShadowBackforwardDistance}"); + /* + ImGui.InputFloat("Broad Area Shadow Range", ref broadAreaShadowRange); + ImGui.Text($"Original: {lastBroadAreaShadowRange}"); + ImGui.InputFloat("Shadow FOV", ref shadowFov); + ImGui.Text($"Original: {lastShadowFov}"); + */ + ImGui.PopItemWidth(); + } + + if (ImGui.CollapsingHeader("Lighting Parameters")) + { + ImGui.Text($"Address: {lightingObject:x}"); + if (lightingObject != 0x0) + { + ImGui.PushItemWidth(width * 0.2f); + drawRenderParameter("Tone Map Type", lightingObject, 0x16C, false, 1.0f); + drawRenderParameter("Compute Luminance", lightingObject, 0x170); + //drawRenderParameter("Luminance Version", lightingObject, 0x168); + drawRenderParameter("Shoulder Strength", lightingObject, 0x174); + drawRenderParameter("Linear Strength", lightingObject, 0x178); + drawRenderParameter("Linear Angle", lightingObject, 0x17C); + drawRenderParameter("Toe Strength", lightingObject, 0x180); + drawRenderParameter("Toe Num", lightingObject, 0x184); + drawRenderParameter("Toe Denum", lightingObject, 0x188); + drawRenderParameter("White Point", lightingObject, 0x18C); + //drawRenderParameter("LUT Blend", lightingObject, 0x1C8); + //drawRenderParameter("Vfx LUT Blend", lightingObject, 0x1D0); + drawRenderParameter("Enable Color Grading", lightingObject, 0x1D8); + drawRenderParameter("Input Color Linear to PQ", lightingObject, 0x1A1); + drawRenderParameter("Output Color PQ to Linear", lightingObject, 0x1A0); + drawRenderParameter("Dispersion", lightingObject, 0x19C); + drawRenderParameter("Edge Sharpness", lightingObject, 0x198); + drawRenderParameter("Downsample Volume", lightingObject, 0x210); + ImGui.PopItemWidth(); + } + } + + if (ImGui.CollapsingHeader("FXAA Parameters")) + { + ImGui.Text($"Address: {fxaaObject:x}"); + if (fxaaObject != 0x0) + { + ImGui.PushItemWidth(width * 0.2f); + drawRenderParameter("FXAA Subpix", fxaaObject, 0x178, true); + drawRenderParameter("FXAA Edge Threshold", fxaaObject, 0x17C, true); + drawRenderParameter("FXAA Edge Threshold Min", fxaaObject, 0x180, true); + ImGui.PopItemWidth(); + } + } + + if (ImGui.CollapsingHeader("Misc Parameters")) + { + nint baseAddr = MemoryUtil.Read(0x1451C4368); + ImGui.Text($"Address: {baseAddr:x}"); + ImGui.PushItemWidth(width * 0.2f); + drawRenderParameter("HQ Mode", baseAddr, 0xE9A3); + drawRenderParameter("Primary Shadow Sample Num", baseAddr, 0xE5C4); + drawRenderParameter("Primary Shadow Sample Num HQ", baseAddr, 0xE5CC); + drawRenderParameter("Primary Shadow HQ", baseAddr, 0xE5C0); + if (ImGui.BeginItemTooltip()) + { + ImGui.Text("This seems to refer to softening the edges of shadows."); + ImGui.EndTooltip(); + } + drawRenderParameter("Primary Shadow HQ HQ", baseAddr, 0xE5C2); + drawRenderParameter("LOD Length Bias HQ", baseAddr, 0x1FC); + drawRenderParameter("LOD Pixel Size Bias HQ", baseAddr, 0x1FC); + inputSSAOParameters(null, baseAddr); + 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("Contact Shadows Enabled", baseAddr, 0xB4EC); + drawRenderParameter("Force Disable Contact Shadows", baseAddr, 0xB4ED); + drawRenderParameter("Facial Contact Shadows Enabled", baseAddr, 0xB4EE); + drawRenderParameter("Contact Shadows Enable Noise", baseAddr, 0xB500); + drawRenderParameter("Facial Contact Shadows Enable Noise", baseAddr, 0xB501); + drawRenderParameter("Contact Shadow Intensity", baseAddr, 0xB4F0); + drawRenderParameter("Contact Shadow Length", baseAddr, 0xB4F4); + drawRenderParameter("Contact Shadow Accept Maximum Length", baseAddr, 0xB4F8); + drawRenderParameter("Contact Shadow Accept Minimum Length", baseAddr, 0xB4FC); + /* + drawRenderParameter("Capsule AO Enabled", baseAddr, 0xB502); + drawRenderParameter("Force Disable Capsule AO", baseAddr, 0xB503); + 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(); } ImGui.PopID(); @@ -4874,9 +5093,9 @@ namespace MHWNewCamera ImGui.Text($"Player Camera: {pCamera.Instance:x}"); ImGui.Text($"Applying Offset: {applyPerspective}"); ImGui.Text($"previousCameraAnimState: {previousCameraAnimState}"); - ImGui.DragFloat("X Offset", ref cameraXOffset, 0.425f); - ImGui.DragFloat("Y Offset", ref cameraYOffset, 0.425f); - ImGui.DragFloat("Z Offset", ref cameraZOffset, 0.425f); + ImGui.PushItemFlag(ImGuiItemFlags.Disabled, true); + ImGui.DragFloat3("Offset", ref cameraOffset); + ImGui.PopItemFlag(); } ImGui.Separator(); } @@ -4955,93 +5174,6 @@ namespace MHWNewCamera ImGui.Text($"shadowBias: {lastShadowBias}"); ImGui.Text($"shadowRadius: {lastShadowRadius}"); - if (ImGui.Checkbox("Disable Volume Downsample and Blur", ref forceOffVolumeDownsampleAndBlur)) - { - if (forceOffVolumeDownsampleAndBlur) - { - zeroVolumeDownsample.Enable(); - } - else - { - zeroVolumeDownsample.Disable(); - } - } - - if (ImGui.CollapsingHeader("Lighting Object")) - { - if (lightingObject != 0x0) - { - drawRenderParameter("Dispersion", lightingObject, 0x19C); - drawRenderParameter("Edge Sharpness", lightingObject, 0x198); - } - } - - if (ImGui.CollapsingHeader("Renderer Parameters")) - { - ImGui.Text($"FXAA Address: {fxaaAddr:x}"); - if (fxaaAddr != 0x0) - { - drawRenderParameter("FXAA Subpix", fxaaAddr, 0x178, true); - drawRenderParameter("FXAA Edge Threshold", fxaaAddr, 0x17C, true); - drawRenderParameter("FXAA Edge Threshold Min", fxaaAddr, 0x180, true); - } - ImGui.Separator(); - nint baseAddr = MemoryUtil.Read(0x1451C4368); - ImGui.Text($"Address: {baseAddr:x}"); - ImGui.PushItemWidth(width * 0.2f); - drawRenderParameter("HQ Mode", baseAddr, 0xE9A3); - drawRenderParameter("Primary Shadow Sample Num", baseAddr, 0xE5C4); - drawRenderParameter("Primary Shadow Sample Num HQ", baseAddr, 0xE5CC); - drawRenderParameter("Primary Shadow HQ", baseAddr, 0xE5C0); - if (ImGui.BeginItemTooltip()) - { - ImGui.Text("This seems to refer to softening the edges of shadows."); - ImGui.EndTooltip(); - } - drawRenderParameter("Primary Shadow HQ HQ", baseAddr, 0xE5C2); - drawRenderParameter("LOD Length Bias HQ", baseAddr, 0x1FC); - drawRenderParameter("LOD Pixel Size Bias HQ", baseAddr, 0x1FC); - inputSSAOParameters(null, baseAddr); - 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("Contact Shadows Enabled", baseAddr, 0xB4EC); - drawRenderParameter("Force Disable Contact Shadows", baseAddr, 0xB4ED); - drawRenderParameter("Facial Contact Shadows Enabled", baseAddr, 0xB4EE); - drawRenderParameter("Contact Shadows Enable Noise", baseAddr, 0xB500); - drawRenderParameter("Facial Contact Shadows Enable Noise", baseAddr, 0xB501); - drawRenderParameter("Contact Shadow Intensity", baseAddr, 0xB4F0); - drawRenderParameter("Contact Shadow Length", baseAddr, 0xB4F4); - drawRenderParameter("Contact Shadow Accept Maximum Length", baseAddr, 0xB4F8); - drawRenderParameter("Contact Shadow Accept Minimum Length", baseAddr, 0xB4FC); - /* - drawRenderParameter("Capsule AO Enabled", baseAddr, 0xB502); - drawRenderParameter("Force Disable Capsule AO", baseAddr, 0xB503); - 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(); #if MOUSE_AND_KEYBOARD_LAYER -- cgit v1.2.3-101-g0448