diff options
| author | 2026-02-18 23:53:30 -0500 | |
|---|---|---|
| committer | 2026-02-18 23:53:30 -0500 | |
| commit | 50779390ff2a2c36eacae05e951e7aad7b18af7c (patch) | |
| tree | c5138fee1f1970559672f84ccccc08f09f3268e8 | |
| parent | 84f44d98829a1af306cf3dda11b82872b6f9f8cf (diff) | |
| download | NewCamera-50779390ff2a2c36eacae05e951e7aad7b18af7c.tar.gz NewCamera-50779390ff2a2c36eacae05e951e7aad7b18af7c.tar.bz2 NewCamera-50779390ff2a2c36eacae05e951e7aad7b18af7c.zip | |
Bunch of graphics stuff
Signed-off-by: Andrew Opalach <andrew@akon.city>
| -rwxr-xr-x | Plugin.cs | 534 |
1 files changed, 333 insertions, 201 deletions
@@ -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<CameraEffectDelegate>? cameraEffectHook;
- private nint fxaaAddr = 0x0;
- private delegate void FXAADelegate(nint unknownPtr, nint unknownPtr2);
- private Hook<FXAADelegate>? 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>? createLightingObject;
+ private Hook<DestroyLightingObject>? destroyLightingObject;
+ private nint lightingObject = 0x0;
+
+ private delegate nint CreateFXAAObject(nint unknownPtr, int unknownInt);
+ private delegate nint DestroyFXAAObject(nint unknownPtr, int unknownInt);
+ private Hook<CreateFXAAObject>? createFXAAObject;
+ private Hook<DestroyFXAAObject>? 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<nint> setCharacterCreatorParams;
- private NativeAction<nint> setSaveSelectParams;
- private delegate void LODLimitDelegate(nint unknownPtr);
- private Hook<LODLimitDelegate>? 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>? 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<CameraEffectDelegate>(0x141AB6AE0, CameraEffectHook); // nint, nint, nint
- fxaaHook = Hook.Create<FXAADelegate>(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<UnderwaterCheckDelegate>(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<CreateLightingObject>(0x1424CE130, CreateLightingObjectHook);
+
+ createLightingObject = Hook.Create<CreateLightingObject>(0x1424CE130, CreateLightingObjectHook); // nint
+ destroyLightingObject = Hook.Create<DestroyLightingObject>(0x1424CE380, DestroyLightingObjectHook); // nint, nint
+
+ createFXAAObject = Hook.Create<CreateFXAAObject>(0x1423936E0, CreateFXAAObjectHook); // nint, int
+ destroyFXAAObject = Hook.Create<DestroyFXAAObject>(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<nint>(unknownPtr2 + 0x170);
+ ref nint rax = ref MemoryUtil.GetRef<nint>(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<float>(unknownPtr2 + 0x17C) = biasOverride;
}
if (applyShadowRadius)
{
- float radiusOverride = lastShadowRadius + shadowRadiusOffset;
- MemoryUtil.WriteBytes(unknownPtr2 + 0x1EC, BitConverter.GetBytes(radiusOverride));
+ MemoryUtil.GetRef<float>(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<nint>(0x1451C4368);
- MemoryUtil.WriteBytes(baseAddr + 0x5718, BitConverter.GetBytes(snowField4GlobalLODParam));
+ MemoryUtil.GetRef<float>(baseAddr + 0x5718) = snowField4GlobalLODParam;
}
shadowCascadeHook!.Original(unknownPtr, unknownPtr2);
+
+ if (shadowCascadeValue != 3)
+ {
+ lastShadowDistance = MemoryUtil.GetRef<float>(unknownPtr + 0x6C);
+ lastShadowDistribution = MemoryUtil.GetRef<float>(unknownPtr + 0x74);
+ lastShadowBackforwardDistance = MemoryUtil.GetRef<float>(unknownPtr + 0x7C);
+ //lastBroadAreaShadowRange = MemoryUtil.GetRef<float>(unknownPtr + 0x1B0);
+ //lastShadowFov = MemoryUtil.GetRef<float>(unknownPtr + 0x1F4);
+
+ /*
+ if (Area.CurrentStage == Stage.Astera)
+ {
+ // @TODO: Account for moving values.
+ }
+ */
+
+ if (applyShadowAdjust)
+ {
+ MemoryUtil.GetRef<float>(unknownPtr + 0x6C) = shadowDistance;
+ MemoryUtil.GetRef<float>(unknownPtr + 0x74) = shadowDistribution;
+ MemoryUtil.GetRef<float>(unknownPtr + 0x7C) = shadowBackforwardDistance;
+ //MemoryUtil.GetRef<float>(unknownPtr + 0x1B0) = broadAreaShadowRange;
+ //MemoryUtil.GetRef<float>(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<nint>(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<T>(string name, nint baseAddr = 0x0, nint offset = 0x0, bool zeroToOne = false) where T : unmanaged
+ private static T drawRenderParameter<T>(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<byte>(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<byte>(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<Config>(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<nint>(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<int>("Tone Map Type", lightingObject, 0x16C, false, 1.0f);
+ drawRenderParameter<byte>("Compute Luminance", lightingObject, 0x170);
+ //drawRenderParameter<int>("Luminance Version", lightingObject, 0x168);
+ drawRenderParameter<float>("Shoulder Strength", lightingObject, 0x174);
+ drawRenderParameter<float>("Linear Strength", lightingObject, 0x178);
+ drawRenderParameter<float>("Linear Angle", lightingObject, 0x17C);
+ drawRenderParameter<float>("Toe Strength", lightingObject, 0x180);
+ drawRenderParameter<float>("Toe Num", lightingObject, 0x184);
+ drawRenderParameter<float>("Toe Denum", lightingObject, 0x188);
+ drawRenderParameter<float>("White Point", lightingObject, 0x18C);
+ //drawRenderParameter<byte>("LUT Blend", lightingObject, 0x1C8);
+ //drawRenderParameter<byte>("Vfx LUT Blend", lightingObject, 0x1D0);
+ drawRenderParameter<byte>("Enable Color Grading", lightingObject, 0x1D8);
+ drawRenderParameter<byte>("Input Color Linear to PQ", lightingObject, 0x1A1);
+ drawRenderParameter<byte>("Output Color PQ to Linear", lightingObject, 0x1A0);
+ drawRenderParameter<float>("Dispersion", lightingObject, 0x19C);
+ drawRenderParameter<float>("Edge Sharpness", lightingObject, 0x198);
+ drawRenderParameter<byte>("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<float>("FXAA Subpix", fxaaObject, 0x178, true);
+ drawRenderParameter<float>("FXAA Edge Threshold", fxaaObject, 0x17C, true);
+ drawRenderParameter<float>("FXAA Edge Threshold Min", fxaaObject, 0x180, true);
+ ImGui.PopItemWidth();
+ }
+ }
+
+ if (ImGui.CollapsingHeader("Misc Parameters"))
+ {
+ nint baseAddr = MemoryUtil.Read<nint>(0x1451C4368);
+ ImGui.Text($"Address: {baseAddr:x}");
+ ImGui.PushItemWidth(width * 0.2f);
+ drawRenderParameter<byte>("HQ Mode", baseAddr, 0xE9A3);
+ drawRenderParameter<int>("Primary Shadow Sample Num", baseAddr, 0xE5C4);
+ drawRenderParameter<int>("Primary Shadow Sample Num HQ", baseAddr, 0xE5CC);
+ drawRenderParameter<byte>("Primary Shadow HQ", baseAddr, 0xE5C0);
+ if (ImGui.BeginItemTooltip())
+ {
+ ImGui.Text("This seems to refer to softening the edges of shadows.");
+ ImGui.EndTooltip();
+ }
+ drawRenderParameter<byte>("Primary Shadow HQ HQ", baseAddr, 0xE5C2);
+ drawRenderParameter<float>("LOD Length Bias HQ", baseAddr, 0x1FC);
+ drawRenderParameter<float>("LOD Pixel Size Bias HQ", baseAddr, 0x1FC);
+ inputSSAOParameters(null, baseAddr);
+ 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<byte>("Contact Shadows Enabled", baseAddr, 0xB4EC);
+ drawRenderParameter<byte>("Force Disable Contact Shadows", baseAddr, 0xB4ED);
+ drawRenderParameter<byte>("Facial Contact Shadows Enabled", baseAddr, 0xB4EE);
+ drawRenderParameter<byte>("Contact Shadows Enable Noise", baseAddr, 0xB500);
+ drawRenderParameter<byte>("Facial Contact Shadows Enable Noise", baseAddr, 0xB501);
+ drawRenderParameter<float>("Contact Shadow Intensity", baseAddr, 0xB4F0);
+ drawRenderParameter<float>("Contact Shadow Length", baseAddr, 0xB4F4);
+ drawRenderParameter<float>("Contact Shadow Accept Maximum Length", baseAddr, 0xB4F8);
+ drawRenderParameter<float>("Contact Shadow Accept Minimum Length", baseAddr, 0xB4FC);
+ /*
+ drawRenderParameter<byte>("Capsule AO Enabled", baseAddr, 0xB502);
+ drawRenderParameter<byte>("Force Disable Capsule AO", baseAddr, 0xB503);
+ 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();
}
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<float>("Dispersion", lightingObject, 0x19C);
- drawRenderParameter<float>("Edge Sharpness", lightingObject, 0x198);
- }
- }
-
- if (ImGui.CollapsingHeader("Renderer Parameters"))
- {
- ImGui.Text($"FXAA Address: {fxaaAddr:x}");
- if (fxaaAddr != 0x0)
- {
- drawRenderParameter<float>("FXAA Subpix", fxaaAddr, 0x178, true);
- drawRenderParameter<float>("FXAA Edge Threshold", fxaaAddr, 0x17C, true);
- drawRenderParameter<float>("FXAA Edge Threshold Min", fxaaAddr, 0x180, true);
- }
- ImGui.Separator();
- nint baseAddr = MemoryUtil.Read<nint>(0x1451C4368);
- ImGui.Text($"Address: {baseAddr:x}");
- ImGui.PushItemWidth(width * 0.2f);
- drawRenderParameter<byte>("HQ Mode", baseAddr, 0xE9A3);
- drawRenderParameter<int>("Primary Shadow Sample Num", baseAddr, 0xE5C4);
- drawRenderParameter<int>("Primary Shadow Sample Num HQ", baseAddr, 0xE5CC);
- drawRenderParameter<byte>("Primary Shadow HQ", baseAddr, 0xE5C0);
- if (ImGui.BeginItemTooltip())
- {
- ImGui.Text("This seems to refer to softening the edges of shadows.");
- ImGui.EndTooltip();
- }
- drawRenderParameter<byte>("Primary Shadow HQ HQ", baseAddr, 0xE5C2);
- drawRenderParameter<float>("LOD Length Bias HQ", baseAddr, 0x1FC);
- drawRenderParameter<float>("LOD Pixel Size Bias HQ", baseAddr, 0x1FC);
- inputSSAOParameters(null, baseAddr);
- 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<byte>("Contact Shadows Enabled", baseAddr, 0xB4EC);
- drawRenderParameter<byte>("Force Disable Contact Shadows", baseAddr, 0xB4ED);
- drawRenderParameter<byte>("Facial Contact Shadows Enabled", baseAddr, 0xB4EE);
- drawRenderParameter<byte>("Contact Shadows Enable Noise", baseAddr, 0xB500);
- drawRenderParameter<byte>("Facial Contact Shadows Enable Noise", baseAddr, 0xB501);
- drawRenderParameter<float>("Contact Shadow Intensity", baseAddr, 0xB4F0);
- drawRenderParameter<float>("Contact Shadow Length", baseAddr, 0xB4F4);
- drawRenderParameter<float>("Contact Shadow Accept Maximum Length", baseAddr, 0xB4F8);
- drawRenderParameter<float>("Contact Shadow Accept Minimum Length", baseAddr, 0xB4FC);
- /*
- drawRenderParameter<byte>("Capsule AO Enabled", baseAddr, 0xB502);
- drawRenderParameter<byte>("Force Disable Capsule AO", baseAddr, 0xB503);
- 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();
#if MOUSE_AND_KEYBOARD_LAYER
|