diff options
| -rwxr-xr-x | Config.cs | 19 | ||||
| -rwxr-xr-x | Plugin.cs | 1183 |
2 files changed, 638 insertions, 564 deletions
@@ -57,7 +57,7 @@ namespace MHWNewCamera }
public String Name => "MHWNewCamera";
- public String Version => "3.1";
+ public String Version => "4.0";
private static Dictionary<string, Button> buttonMap = new Dictionary<string, Button>
{
@@ -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;
}
}
@@ -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<SetCameraDelegate>? setCameraHook;
-
- private delegate void CalculateCameraDelegate(nint unknownPtr);
- private Hook<CalculateCameraDelegate>? calculateCameraHook;
+ private delegate void ProcessCameraDelegate(nint cameraPointer);
+ private Hook<ProcessCameraDelegate>? setCameraHook;
+ private Hook<ProcessCameraDelegate>? calculateCameraHook;
+ private Hook<ProcessCameraDelegate>? checkCameraHook;
+ private delegate void ViewModeDelegate(nint viewModeObject);
+ private Hook<ViewModeDelegate>? startViewModeHook;
+ /*
+ private NativeAction<nint> startViewMode;
+ private NativeAction<nint> stopViewMode;
+ private NativeAction<nint> 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<SetCameraTentDelegate>? setCameraTentHook;
@@ -251,9 +258,6 @@ namespace MHWNewCamera private delegate void ShadowCascadeDelegate(nint unknownPtr, nint unknownPtr2);
private Hook<ShadowCascadeDelegate>? shadowCascadeHook;
- private delegate void EvalDepthOfFieldDelegate(nint unknownPtr, nint unknownPtr2);
- private Hook<EvalDepthOfFieldDelegate>? evalDepthOfFieldHook;
-
private delegate void RendererSetDelegate(nint unknownPtr, nint unknownPtr2, nint unknownPtr3);
private Hook<RendererSetDelegate>? rendererSetHook;
@@ -266,7 +270,7 @@ namespace MHWNewCamera private delegate void CollisionCheckDelegate(nint unknownPtr, nint unknownPtr2);
private Hook<CollisionCheckDelegate>? 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<CameraEffectDelegate>? 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<nint, int> setPassiveMode;
+ private NativeAction<nint> setPlayerController1;
+ private NativeAction<nint> setPlayerController2;
+
+ private bool enableCrawl = false;
+ private NativeAction<nint, nint> 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<nint, int> setPassiveMode;
- private NativeAction<nint> setPlayerController1;
- private NativeAction<nint> setPlayerController2;
-
- private bool enableCrawl = false;
- private NativeAction<nint, nint> 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<SetCameraDelegate>(addr, SetCameraHook);
+ setCameraHook = Hook.Create<ProcessCameraDelegate>(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<CalculateCameraDelegate>(addr, CalculateCameraHook);
+ calculateCameraHook = Hook.Create<ProcessCameraDelegate>(addr, CalculateCameraHook);
+
+ checkCameraHook = Hook.Create<ProcessCameraDelegate>(0x141FA2130, CheckCameraHook);
+
+ startViewModeHook = Hook.Create<ViewModeDelegate>(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<nint>(0x1405842E0);
+ stopViewMode = new NativeAction<nint>(0x1405825A0);
+ processViewMode = new NativeAction<nint>(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<ShadowCascadeDelegate>(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<EvalDepthOfFieldDelegate>(addr, EvalDepthOfFieldHook);
-
rendererSetHook = Hook.Create<RendererSetDelegate>(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<CollisionCheckDelegate>(0x1411C4E50, CollisionCheckHook);
- cameraEffectHook = Hook.Create<CameraEffectDelegate>(0x1416D4890, CameraEffectHook);
+ //cameraEffectHook = Hook.Create<CameraEffectDelegate>(0x1416D4890, CameraEffectHook);
+ cameraEffectHook = Hook.Create<CameraEffectDelegate>(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<nint>(0x1451C4368);
- float foliageLod1 = MemoryUtil.Read<float>(baseAddr + 0x21C);
- float terrainLod1 = MemoryUtil.Read<float>(baseAddr + 0x220);
- float foliageLod2 = MemoryUtil.Read<float>(baseAddr + 0x224);
- float terrainLod2 = MemoryUtil.Read<float>(baseAddr + 0x228);
- float snowLod1 = MemoryUtil.Read<float>(baseAddr + 0x5718);
- return foliageLod1 == foliageLodBias && terrainLod1 == terrainLodBias &&
- foliageLod2 == foliageLodFactor && terrainLod2 == terrainLodFactor &&
- snowLod1 == snowField4GlobalLODParam;
+ float foliageLOD1 = MemoryUtil.Read<float>(baseAddr + 0x21C);
+ float terrainLOD1 = MemoryUtil.Read<float>(baseAddr + 0x220);
+ float foliageLOD2 = MemoryUtil.Read<float>(baseAddr + 0x224);
+ float terrainLOD2 = MemoryUtil.Read<float>(baseAddr + 0x228);
+ float snowLOD1 = MemoryUtil.Read<float>(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<nint>(0x1451C4368);
if (toggleOn)
{
- if (prevFoliageLodBias <= 0.0f)
+ if (prevFoliageLODBias <= 0.0f)
{
- prevFoliageLodBias = MemoryUtil.Read<float>(baseAddr + 0x21C);
- if (prevFoliageLodBias > 3.0f) prevFoliageLodBias = 3.0f;
+ prevFoliageLODBias = MemoryUtil.Read<float>(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<float>(baseAddr + 0x220);
- if (prevTerrainLodBias > 3.0f) prevTerrainLodBias = 3.0f;
+ prevTerrainLODBias = MemoryUtil.Read<float>(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<Config>(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<float>(sMain.Instance + 0x68);
+ float deltaTime = MemoryUtil.Read<float>(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<int>(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<float>(psuedoViewModeObject + 0x90);
+ cameraPosition.Y = MemoryUtil.Read<float>(psuedoViewModeObject + 0x94);
+ cameraPosition.Z = MemoryUtil.Read<float>(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<nint>(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<float>(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<float>(unknownPtr2 + 0x17C);
- if (applyShadowBias)
- {
- MemoryUtil.WriteBytes(unknownPtr2 + 0x17C, BitConverter.GetBytes(biasOverride));
- }
lastShadowRadius = MemoryUtil.Read<float>(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<byte>(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<nint>(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<nint>(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<float>(baseAddr + 0xB4D4);
internalSSAOParams.ssaoBias = MemoryUtil.Read<float>(baseAddr + 0xB4D8);
internalSSAOParams.ssaoIntensity = MemoryUtil.Read<float>(baseAddr + 0xB4E0);
- internalSSAOParams.ssaoUseHiZ = MemoryUtil.Read<byte>(baseAddr + 0xB4E5) == 1;
+ internalSSAOParams.ssaoUseHiZ = MemoryUtil.Read<byte>(baseAddr + 0xB4E5) == 0x1;
internalSSAOParams.ssaoEdgeAttenRate = MemoryUtil.Read<float>(baseAddr + 0xB4DC);
- if (ssaoOverrides)
+ if (ssaoAdjustments)
{
setSSAOAdjustements(true);
}
- setHQMode(HQMode);
- if (applyLodFactors)
+ internalSSRParams.sslrLoopCount = MemoryUtil.Read<int>(baseAddr + 0xE628);
+ internalSSRParams.sslrLoopCountFactorForCBR = MemoryUtil.Read<float>(baseAddr + 0xE62C);
+ internalSSRParams.sslrEliminateDepth = MemoryUtil.Read<float>(baseAddr + 0xE630);
+ internalSSRParams.sslrAccurateThreshold = MemoryUtil.Read<float>(baseAddr + 0xE644);
+ internalSSRParams.sslrAccurateThresholdHQ = MemoryUtil.Read<float>(baseAddr + 0xE64C);
+ internalSSRParams.sslrDitherRadius = MemoryUtil.Read<float>(baseAddr + 0xE634);
+ internalSSRParams.sslrImportanceBias = MemoryUtil.Read<float>(baseAddr + 0xE638);
+ internalSSRParams.sslrMipScale = MemoryUtil.Read<float>(baseAddr + 0xE63C);
+ internalSSRParams.sslrMipBias = MemoryUtil.Read<float>(baseAddr + 0xE640);
+ internalSSRParams.sslrDitherResolve = MemoryUtil.Read<byte>(baseAddr + 0xB43F) == 0x1;
+ internalSSRParams.sslrEdgeAttenRate = MemoryUtil.Read<float>(baseAddr + 0xB428);
+ internalSSRParams.sslrMip0CountThreshold = MemoryUtil.Read<int>(baseAddr + 0xB438);
+ internalSSRParams.sslrDepthEliminateRate = MemoryUtil.Read<float>(baseAddr + 0xB42C);
+ internalSSRParams.sslrUseMipmap = MemoryUtil.Read<byte>(baseAddr + 0xE650) == 0x1;
+ internalSSRParams.sslrGBufferJitter = MemoryUtil.Read<byte>(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<nint>(0x14500E180);
- byte[] curUnderwaterValues = MemoryUtil.ReadArray<byte>(unknownPtr2 + 0x8, 120);
bool underwater = MemoryUtil.Read<byte>(baseAddr + 0x9F8) == 0x1;
- // Pretty unsafe seeming.
- if (prevUnderwaterPointer != 0x0 && unknownPtr2 != prevUnderwaterPointer)
+
+ byte[]? underwaterValues = null;
+ nint targetAddr = 0x0;
+
+ nint addr1 = MemoryUtil.Read<nint>(unknownPtr + 0x550);
+ int index1 = MemoryUtil.Read<int>(unknownPtr + 0xA50);
+ nint addr2 = MemoryUtil.Read<nint>(addr1 + (index1 * 0x8));
+ if (addr2 != 0x0)
{
- MemoryUtil.WriteBytes(prevUnderwaterPointer + 0x8, prevUnderwaterValues);
- prevUnderwaterPointer = 0x0;
+ nint addr3 = MemoryUtil.Read<nint>(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<byte>(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<T>(string name, nint baseAddr, nint offset) where T : unmanaged
+ {
+ nint addr = baseAddr + offset;
+ T currentValue = MemoryUtil.Read<T>(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<nint>(player.Instance + 0x12608);
- nint zoneStateAddr = MemoryUtil.Read<nint>(0x1451C42B8);
- if (controlsAddr != 0x0 || zoneStateAddr == 0x0)
- {
- bool passiveFlag = MemoryUtil.Read<byte>(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<byte>(player.Instance + 0x7626) == 1;
- if (ImGui.Checkbox("Passive Mode", ref passiveMode))
- {
- MemoryUtil.WriteBytes(player.Instance + 0x7626, passiveMode ? [0x1] : [0x0]);
- }
- bool combatControls = MemoryUtil.Read<byte>(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<nint>(player.Instance + 0x12608);
+ nint zoneStateAddr = MemoryUtil.Read<nint>(0x1451C42B8);
+ bool combatControls = false;
+ if (controlsAddr != 0x0 || zoneStateAddr == 0x0)
+ {
+ bool passiveFlag = MemoryUtil.Read<byte>(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<byte>(player.Instance + 0x7626) == 1;
+ if (ImGui.Checkbox("Passive Mode", ref passiveMode))
+ {
+ MemoryUtil.WriteBytes(player.Instance + 0x7626, passiveMode ? [0x1] : [0x0]);
+ }
+ combatControls = MemoryUtil.Read<byte>(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<Config>(this);
+ }
+
+ if (ImGui.Checkbox("SSR Adjustments", ref ssrAdjustments))
{
- setSSAOAdjustements(ssaoOverrides);
- config.SSAOAdjustments = ssaoOverrides;
+ setSSRAdjustements(ssrAdjustments);
+ config.SSRAdjustments = ssrAdjustments;
ConfigManager.SaveConfig<Config>(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<Config>(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<Config>(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<Config>(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<float>(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<float>(sMain.Instance + 0x58)}");
+ ImGui.Text($"Max Fps: {MemoryUtil.Read<float>(sMain.Instance + 0x5C)}");
+ ImGui.Text($"Actual Fps: {MemoryUtil.Read<float>(sMain.Instance + 0x64)}");
+ ImGui.Text($"Real Fps: {MemoryUtil.Read<float>(sMain.Instance + 0x68)}");
+ ImGui.Text($"Delta Time Adjust: {MemoryUtil.Read<float>(sMain.Instance + 0x92)}");
+ ImGui.Text($"Delta Time: {MemoryUtil.Read<float>(sMain.Instance + 0x94)}");
+ ImGui.Text($"Delta Time Border: {MemoryUtil.Read<float>(sMain.Instance + 0x98)}");
+ ImGui.Text($"Delta Time Limit: {MemoryUtil.Read<float>(sMain.Instance + 0x9C)}");
+ ImGui.Text($"Delta Sec: {MemoryUtil.Read<float>(sMain.Instance + 0xA0)}");
+
+ nint timeAddr = MemoryUtil.Read<nint>(sMain.Instance + 0xAF878);
+ float gameTime = MemoryUtil.Read<float>(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<nint>(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<float>(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<float>(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<float>(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<int>(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<int>(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<float>(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<float>(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<float>(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<float>(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<float>(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<int>(baseAddr + 0xE972);
- if (ImGui.InputInt("cbSanitizeColor", ref cbSanitizeColor, 0, 0, ImGuiInputTextFlags.EnterReturnsTrue))
- {
- MemoryUtil.WriteBytes(baseAddr + 0xE972, BitConverter.GetBytes(cbSanitizeColor));
- }
-
- float cbBlendDither = MemoryUtil.Read<float>(baseAddr + 0xE973);
- if (ImGui.InputFloat("cbBlendDither", ref cbBlendDither, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags.EnterReturnsTrue))
+ if (ImGui.CollapsingHeader("Renderer Parameters"))
{
- MemoryUtil.WriteBytes(baseAddr + 0xE973, BitConverter.GetBytes(cbBlendDither));
- }
-
- float cbDitherBBoxStrength = MemoryUtil.Read<float>(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<float>(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<float>(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<byte>(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;
+ nint baseAddr = MemoryUtil.Read<nint>(0x1451C4368);
+ ImGui.Text($"Address: {baseAddr:x}");
+ ImGui.PushItemWidth(width * 0.2f);
+ drawRenderParameter<float>("SSAO Depth Bias", baseAddr, 0xB4B0);
+ drawRenderParameter<float>("SSAO Sloped Depth Bias", baseAddr, 0xB4B4);
+ drawRenderParameter<float>("SSAO Max Depth Bias", baseAddr, 0xB4B8);
+ drawRenderParameter<float>("SSAO Dispersion", baseAddr, 0xB4BC);
+ drawRenderParameter<float>("SSAO Effect", baseAddr, 0xB430);
+ drawRenderParameter<float>("SSAO Effect GI", baseAddr, 0xB434);
+ drawRenderParameter<float>("SSAO Depth Difference", baseAddr, 0xB4C0);
+ drawRenderParameter<float>("SSAO Samples Per Pixel", baseAddr, 0xB4C4);
+ drawRenderParameter<int>("SSAO Max Sample Num", baseAddr, 0xB4C8);
+ drawRenderParameter<int>("SSAO Max Sample Num HQ", baseAddr, 0xB4D0);
+ drawRenderParameter<float>("SSAO Radius", baseAddr, 0xB4D4);
+ drawRenderParameter<float>("SSAO Bias", baseAddr, 0xB4D8);
+ drawRenderParameter<float>("SSAO Intensity", baseAddr, 0xB4E0);
+ drawRenderParameter<byte>("SSAO Use HiZ", baseAddr, 0xB4E5);
+ drawRenderParameter<float>("SSAO Edge Atten Rate", baseAddr, 0xB4DC);
+ drawRenderParameter<int>("SSLR Loop Count", baseAddr, 0xE628);
+ drawRenderParameter<float>("SSLR Loop Count Factor For CBR", baseAddr, 0xE62C);
+ drawRenderParameter<float>("SSLR Eliminate Depth", baseAddr, 0xE630);
+ drawRenderParameter<float>("SSLR Accurate Threshold", baseAddr, 0xE644);
+ drawRenderParameter<float>("SSLR Accurate Threshold HQ", baseAddr, 0xE64C);
+ drawRenderParameter<float>("SSLR Dither Radius", baseAddr, 0xE634);
+ drawRenderParameter<float>("SSLR Importance Bias", baseAddr, 0xE638);
+ drawRenderParameter<float>("SSLR Mip Scale", baseAddr, 0xE63C);
+ drawRenderParameter<float>("SSLR Mip Bias", baseAddr, 0xE640);
+ drawRenderParameter<byte>("SSLR Dither Resolve", baseAddr, 0xB43F);
+ drawRenderParameter<float>("SSLR Edge Atten Rate", baseAddr, 0xB428);
+ drawRenderParameter<int>("SSLR Mip 0 Count Threshold", baseAddr, 0xB438);
+ drawRenderParameter<float>("SSLR Depth Eliminate Rate", baseAddr, 0xB42C);
+ drawRenderParameter<byte>("SSLR Use Mipmap", baseAddr, 0xE650);
+ drawRenderParameter<byte>("SSLR GBuffer Jitter", baseAddr, 0xB440);
+ /*
+ drawRenderParameter<float>("Checkerboard Alpha Unroll Near", baseAddr, 0xE964);
+ drawRenderParameter<float>("Checkerboard Alpha Unroll Far", baseAddr, 0xE968);
+ drawRenderParameter<float>("Checkerboard History Blend Rate", baseAddr, 0xE96C);
+ drawRenderParameter<byte>("Checkerboard Sanitize Color", baseAddr, 0xE972);
+ drawRenderParameter<byte>("Checkerboard Blend Dither", baseAddr, 0xE973);
+ drawRenderParameter<float>("Checkerboard BBox Strength", baseAddr, 0xE974);
+ drawRenderParameter<float>("Checkerboard Dither Passthru Weight", baseAddr, 0xE978);
+ drawRenderParameter<float>("Checkerboard Dither Filtered Weight", baseAddr, 0xE97C);
+ drawRenderParameter<byte>("Checkerboard Continous History Reset", baseAddr, 0xE971);
+ */
+ ImGui.PopItemWidth();
}
ImGui.Separator();
|