summaryrefslogtreecommitdiff
path: root/Plugin.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Plugin.cs')
-rw-r--r--Plugin.cs1181
1 files changed, 742 insertions, 439 deletions
diff --git a/Plugin.cs b/Plugin.cs
index 20d9786..61553d9 100644
--- a/Plugin.cs
+++ b/Plugin.cs
@@ -26,9 +26,8 @@ using SharpPluginLoader.Core.Resources;
// @TODO:
// - https://dev.epicgames.com/community/learning/tutorials/34xz/unreal-engine-ocio-3d-luts-applying-3d-luts-when-using-ocio
-// - Add built-in LUT list.
-// - Configurable Broad Area Shadow Resolution.
// - Hook sMhScene constructor to set hqMode.
+// - Configurable Broad Area Shadow Resolution.
// - Optimized update logic.
// - Only update non-override values when UI is shown.
// - Descriptions.
@@ -36,7 +35,6 @@ using SharpPluginLoader.Core.Resources;
// - Lights iterop.
// - SPL Patches:
// - No crash on empty config.
-// - Style change
// - Hotload nukes config?
//
// Areas that need Shadow Distance retuning:
@@ -79,8 +77,6 @@ namespace WorldTuningTool
#endif
}
- public static nint lton(long l) { unchecked { return (nint)l; } }
-
private static byte ByteFlag(bool f) { return f ? (byte)0x1 : (byte)0x0; }
private static int BitIndex(int mask)
@@ -119,7 +115,7 @@ namespace WorldTuningTool
public static Vector2 StringToVector2(string s, char delim = ',')
{
if (String.IsNullOrEmpty(s)) throw new FormatException();
- string[] sp = s.Split(delim).Select(v => v.Trim()).ToArray();
+ string[] sp = s.Split(delim).Select((v) => v.Trim()).ToArray();
if (sp.Length != 2) throw new FormatException();
return new Vector2(StringToSingle(sp[0]), StringToSingle(sp[1]));
}
@@ -127,7 +123,7 @@ namespace WorldTuningTool
public static Vector3 StringToVector3(string s, char delim = ',')
{
if (String.IsNullOrEmpty(s)) throw new FormatException();
- string[] sp = s.Split(delim).Select(v => v.Trim()).ToArray();
+ string[] sp = s.Split(delim).Select((v) => v.Trim()).ToArray();
if (sp.Length != 3) throw new FormatException();
return new Vector3(StringToSingle(sp[0]), StringToSingle(sp[1]), StringToSingle(sp[2]));
}
@@ -135,7 +131,7 @@ namespace WorldTuningTool
public static Vector4 StringToVector4(string s, char delim = ',')
{
if (String.IsNullOrEmpty(s)) throw new FormatException();
- string[] sp = s.Split(delim).Select(v => v.Trim()).ToArray();
+ string[] sp = s.Split(delim).Select((v) => v.Trim()).ToArray();
if (sp.Length != 4) throw new FormatException();
return new Vector4(StringToSingle(sp[0]), StringToSingle(sp[1]), StringToSingle(sp[2]), StringToSingle(sp[3]));
}
@@ -174,6 +170,12 @@ namespace WorldTuningTool
SHADOW_RESOLUTION
}
+ private const float defaultParamWidth = 0.21f;
+ private const float fadeAlphaFactor = 0.7f;
+ private const float disableAlphaFactor = 0.6f;
+
+ private static bool ignoreMinMax = false;
+
private static IPlugin? Instance = null;
private static Config getConfig()
@@ -181,6 +183,11 @@ namespace WorldTuningTool
return ConfigManager.GetConfig<Config>(Instance!);
}
+ private static bool editMode = false;
+ private static int configState = 0;
+ private const int SelectedNotSaved = 1;
+ private const int SetNotSaved = (1 << 1);
+
private static void rebuildConfig(Config config, List<Override> overrides)
{
List<Override> selectedGlobals = config.Globals[selectedGlobal];
@@ -191,10 +198,6 @@ namespace WorldTuningTool
}
}
- private static int configState = 0;
- private const int SelectedNotSaved = 1;
- private const int SetNotSaved = (1 << 1);
-
private static void saveConfig(Config config)
{
List<Override> tmpOverrides = config.Overrides[globalStage];
@@ -204,23 +207,15 @@ namespace WorldTuningTool
configState = 0;
}
- private const float defaultParamWidth = 0.21f;
- private const float fadeAlphaFactor = 0.7f;
- private const float disableAlphaFactor = 0.6f;
-
- private static bool ignoreMinMax = false;
-
- private static bool editMode = false;
-
private const StageExt globalStage = StageExt.Global;
private static StageExt currentStage => (StageExt)Area.CurrentStage;
private static List<Override>? maybeGetStageOverrides(Config config)
{
- if (!config.Overrides.ContainsKey(currentStage))
+ if (currentStage != StageExt.Global && config.Overrides.TryGetValue(currentStage, out List<Override>? stageOverrides))
{
- return null;
+ return stageOverrides;
}
- return (currentStage != StageExt.Global) ? config.Overrides[currentStage] : null;
+ return null;
}
private static StageExt selectedStage = globalStage;
@@ -925,7 +920,7 @@ namespace WorldTuningTool
if (Type == ParameterType.COLOR_FACTOR)
{
Vector3 v3Color = v3;
- // Only scale the color vector if max is unbound. Otherwise, assume that intensity and color are combined.
+ // Only scale the color vector if max is unbound. Otherwise, assume that intensity and color are seperate.
if (maxf == Single.MaxValue)
{
float v3Max = MathF.Max(Math.Abs(v3.X), MathF.Max(Math.Abs(v3.Y), Math.Abs(v3.Z)));
@@ -1265,6 +1260,11 @@ namespace WorldTuningTool
return new Parameter<T>(name, offset, 0, type, m.min, m.max, m.step, 0);
}
+ public static Parameter<T> P<T>(string name, long offset, ParameterType type, (T? min, T? max, T? step) m = default) where T : unmanaged
+ {
+ return new Parameter<T>(name, (nint)offset, 0, type, m.min, m.max, m.step, 0);
+ }
+
public static Parameter<T> V<T>(string name, nint offset, ParameterType type, (T? min, T? max, T? step) m = default) where T : unmanaged
{
return new Parameter<T>(name, offset, 0, type, m.min, m.max, m.step, ParameterFlags.ViewOnly);
@@ -1277,6 +1277,11 @@ namespace WorldTuningTool
private static Parameter? getParameterByName(string name)
{
+ if (OldParameterNames.TryGetValue(name, out string? newName))
+ {
+ Log.Warn($"Paramter '{name}' renamed to {newName}.");
+ name = newName;
+ }
foreach (Parameter param in allParameters)
{
if (param.Name == name)
@@ -1579,7 +1584,7 @@ namespace WorldTuningTool
}
hasStatus = true;
}
- else if (valueDiffers)
+ else if (valueDiffers || superseded)
{
ImGui.SameLine();
string byLine = "";
@@ -1616,8 +1621,8 @@ namespace WorldTuningTool
private delegate void UpdateSSLRParams(nint stackOffset);
private Hook<UpdateSSLRParams>? updateSSLRParams;
- private delegate void UpdateLightingParams(nint stackOffset, nint lightingObjectInternal);
- private Hook<UpdateLightingParams>? updateLightingParams;
+ private delegate void UpdateToneMapParams(nint stackOffset, nint toneMapObjectInternal);
+ private Hook<UpdateToneMapParams>? updateToneMapParams;
private static bool InTransition = false;
private static List<Parameter> DirtyParams = new List<Parameter>();
@@ -1645,9 +1650,9 @@ namespace WorldTuningTool
private static MtObject? sLightLinker = null;
private static bool disableLightsFeature = false;
- private static Lights lights = new Lights();
private static Parameter hqMode = P<bool>("HQ Mode", 0xE9A3, ParameterType.BOOL);
+ private static Patch defaultHqMode;
private static bool setWeatherMode = false;
private static int requestWeatherMode = 1;
@@ -1661,16 +1666,25 @@ namespace WorldTuningTool
P<float>("LOD Bias 1", 0x21C, ParameterType.FLOAT, pMin(0.0f)),
P<float>("LOD Bias 2", 0x220, ParameterType.FLOAT, pMin(0.0f)),
P<float>("LOD Caster Bias", 0x1E4, ParameterType.FLOAT, pMin(0.0f)),
- // If platform is PS4/Xbox/PC it appears [2] is PC.
- P<float>("LOD Length Platform Bias[2]", 0x22C + (4 * 2), ParameterType.FLOAT, pMin(0.0f)),
- P<float>("LOD Pixel Size Platform Bias[2]", 0x244 + (4 * 2), ParameterType.FLOAT, pMin(0.0f)),
P<int>("LOD Limit", 0xE898, ParameterType.INT, pStep(1)),
P<float>("LOD Passthrough Culling Rate", 0x1F0, ParameterType.FLOAT, pMin(0.0f)),
P<float>("LOD Far Culling Fade Length Max", 0x20C, ParameterType.FLOAT, pMin(0.0f)),
P<float>("LOD Far Culling Fade Pixel Max", 0x210, ParameterType.FLOAT, pMin(0.0f)),
P<float>("Speed Tree LOD Billboard Fade Range", 0x214, ParameterType.FLOAT, pMin(0.0f)),
P<float>("LOD Culling Length Bias", 0x224, ParameterType.FLOAT, pMin(0.0f)),
- P<float>("LOD Culling Pixel Bias", 0x228, ParameterType.FLOAT, pMin(0.0f))
+ P<float>("LOD Culling Pixel Bias", 0x228, ParameterType.FLOAT, pMin(0.0f)),
+ // Length/Pixel Size bias only apply when Bias 1/2 are 0.
+ // MonsterHunterWorld.exe+1B19AA1 - comiss xmm0,xmm1
+ P<float>("LOD Length Bias", 0x1F4, ParameterType.FLOAT, pMin(0.0f)),
+ P<float>("LOD Length Bias (HQ)", 0x1FC, ParameterType.FLOAT, pMin(0.0f)),
+ // MonsterHunterWorld.exe+1B19B95 - comiss xmm1,xmm0
+ P<float>("LOD Pixel Size Bias", 0x200, ParameterType.FLOAT, pMin(0.0f)),
+ P<float>("LOD Pixel Size Bias (HQ)", 0x208, ParameterType.FLOAT, pMin(0.0f)),
+ // Factor applied to the result of LOD Bias 1/2 or Length/Pixel Size Bias.
+ // MonsterHunterWorld.exe+222F7C4 - mulss xmm4,xmm6
+ // If platform is PS4/Xbox/PC it appears [2] is PC.
+ P<float>("LOD Length Platform Bias[2]", 0x22C + (4 * 2), ParameterType.FLOAT, pMin(0.0f)),
+ P<float>("LOD Pixel Size Platform Bias[2]", 0x244 + (4 * 2), ParameterType.FLOAT, pMin(0.0f))
};
private static Parameter[] snowParameters = {
@@ -1687,6 +1701,7 @@ namespace WorldTuningTool
P<float>("Passthrough Correct", 0xE950, ParameterType.FLOAT)
};
+ private static Parameter shadowResParameter = P<int>("Shadow Resolution Multiplier", 0, ParameterType.SHADOW_RESOLUTION, pStep(1));
private static Parameter[] shadowCascadeParameters = {
P<bool>("Primary Shadow HQ", 0xE5C0, ParameterType.BOOL),
P<bool>("Primary Shadow HQ (HQ)", 0xE5C2, ParameterType.BOOL),
@@ -1704,11 +1719,87 @@ namespace WorldTuningTool
P<int>("Broad Area Shadow Precision", 0x5518, ParameterType.INT, pMinMaxStep(0, 2, 1))
};
+ private delegate void UpdatePrimaryLightParams(nint primaryLightParams, nint stackOffset);
+ private delegate void StaticPrimaryLightParams(nint primaryLightParamsStatic, nint primaryLightObjectInternal);
+ private Hook<UpdatePrimaryLightParams>? updatePrimaryLightParams;
+ private Hook<StaticPrimaryLightParams>? staticPrimaryLightParams;
+ // "Min Roughness" is +0xFC in params but never read.
+ private static Parameter[] primaryLightParameters = {
+ M<int>("Primary Light Group", 0x14, ParameterType.BITS, 0x7),
+ P<byte>("Primary Light Priority", 0x1A, ParameterType.BYTE),
+ P<float>("Primary Light Direction", 0x110, ParameterType.VECTOR3, pStep(0.00025f)),
+ P<float>("Primary Light Color", 0xE0, ParameterType.COLOR_FACTOR, pMaxStep(1.0f, 0.001f)),
+ P<float>("Primary Light Intensity", 0xF4, ParameterType.FLOAT, pStep(0.005f)),
+ P<bool>("Primary Light Is Primary", 0x1D, ParameterType.BOOL),
+ P<float>("Primary Light Projection Scale", 0x134, ParameterType.VECTOR2),
+ P<float>("Primary Light Projection Offset Speed", 0x144, ParameterType.VECTOR2),
+ P<float>("Primary Light Projection Up", 0x160, ParameterType.VECTOR3),
+ P<bool>("Primary Light Do Volumetric", 0x1F, ParameterType.BOOL),
+ P<bool>("Primary Shadow Cast", 0x23, ParameterType.BOOL),
+ P<int>("Primary Shadow Map Size", 0x30, ParameterType.ALIGNED_INT, pMinStep(0, 128)), // 0 = 64x64 no multiplier @TODO: Verify in the code.
+ P<float>("Primary Shadow Near Clip Distance", 0x28, ParameterType.FLOAT),
+ P<bool>("Primary Shadow Is Fixed Fov Mode", 0x1F9, ParameterType.BOOL),
+ P<float>("Primary Shadow Fov", 0x1F4, ParameterType.FLOAT, pStep(0.0001f)),
+ P<bool>("Primary Shadow Is Discretization Fov Mode", 0x205, ParameterType.BOOL),
+ P<float>("Primary Shadow Discretization Angle", 0x200, ParameterType.FLOAT, pStep(0.0001f)),
+ P<int>("Primary Shadow Cascade Mode", 0x174, ParameterType.INT, pMinMaxStep(0, 3, 1)),
+ P<float>("Primary Shadow Cascade 2Way Bias", 0x17C, ParameterType.FLOAT),
+ P<float>("Primary Shadow Cascade Distance", 0x6C, ParameterType.FLOAT, pStep(5.0f)),
+ P<float>("Primary Shadow Cascade Backforward Distance", 0x7C, ParameterType.FLOAT, pStep(5.0f)),
+ P<float>("Primary Shadow Cascade Distribution", 0x74, ParameterType.FLOAT, pStep(0.001f)),
+ P<bool>("Primary Shadow Cascade Manual Split", 0x4D, ParameterType.BOOL),
+ P<float>("Primary Shadow Cascade Manual Split Distance[0]", 0x54, ParameterType.FLOAT),
+ P<float>("Primary Shadow Cascade Manual Split Distance[1]", 0x5C, ParameterType.FLOAT),
+ P<float>("Primary Shadow Cascade Manual Split Distance[2]", 0x64, ParameterType.FLOAT),
+ P<float>("Primary Shadow Sloped Depth Bias", 0x40, ParameterType.FLOAT, pStep(0.00001f)),
+ P<float>("Primary Shadow Depth Bias", 0x38, ParameterType.FLOAT, pStep(0.00001f)),
+ P<float>("Primary Shadow Max Depth Bias", 0x48, ParameterType.FLOAT, pStep(0.00001f)),
+ P<bool>("Primary Shadow Cascade Individual Shadow Bias", 0x81, ParameterType.BOOL),
+ P<float>("Primary Shadow Cascade Depth Bias[0]", 0x88, ParameterType.FLOAT, pStep(0.00001f)),
+ P<float>("Primary Shadow Cascade Sloped Depth Bias[0]", 0xA0, ParameterType.FLOAT, pStep(0.00001f)),
+ P<float>("Primary Shadow Cascade Max Depth Bias[0]", 0xB8, ParameterType.FLOAT, pStep(0.00001f)),
+ P<float>("Primary Shadow Cascade Depth Bias[1]", 0x90, ParameterType.FLOAT, pStep(0.00001f)),
+ P<float>("Primary Shadow Cascade Sloped Depth Bias[1]", 0xA8, ParameterType.FLOAT, pStep(0.00001f)),
+ P<float>("Primary Shadow Cascade Max Depth Bias[1]", 0xC0, ParameterType.FLOAT, pStep(0.00001f)),
+ P<float>("Primary Shadow Cascade Depth Bias[2]", 0x98, ParameterType.FLOAT, pStep(0.00001f)),
+ P<float>("Primary Shadow Cascade Sloped Depth Bias[2]", 0xB0, ParameterType.FLOAT, pStep(0.00001f)),
+ P<float>("Primary Shadow Cascade Max Depth Bias[2]", 0xC8, ParameterType.FLOAT, pStep(0.00001f)),
+ };
+ private static Parameter[] primaryShadowParameters = {
+ P<int>("Primary Shadow Sample Num", 0x1DC, ParameterType.INT, pStep(1)),
+ P<float>("Primary Shadow Radius", 0x1EC, ParameterType.FLOAT, pStep(0.0001f))
+ };
+ private static Parameter[] primaryBroadAreaParameters = {
+ P<float>("Broad Area Shadow Depth Bias", 0x1C4, ParameterType.FLOAT, pStep(0.00001f)),
+ P<float>("Broad Area Shadow Sloped Depth Bias", 0x1CC, ParameterType.FLOAT, pStep(0.00001f)),
+ P<float>("Broad Area Shadow Max Depth Bias", 0x1D4, ParameterType.FLOAT, pStep(0.00001f)),
+ };
+
+ private static MtObject? sLightProbes = null;
+ private static Parameter[] sLightProbesParameters = {
+ P<int>("Light Probes Probe Color", 0x38, ParameterType.COLOR),
+ P<float>("Light Probes Probe Intensity", 0x3C, ParameterType.FLOAT),
+ P<int>("Light Probes Top Color", 0x44, ParameterType.COLOR),
+ P<float>("Light Probes Top Intensity", 0x48, ParameterType.FLOAT),
+ P<int>("Light Probes Bottom Color", 0x4C, ParameterType.COLOR),
+ P<float>("Light Probes Bottom Intensity", 0x50, ParameterType.FLOAT),
+ P<float>("Light Probes Direction", 0x60, ParameterType.VECTOR3),
+ P<int>("Light Probes Shadow Top Color", 0x70, ParameterType.COLOR),
+ P<float>("Light Probes Shadow Top Intensity", 0x74, ParameterType.FLOAT),
+ P<int>("Light Probes Shadow Bottom Color", 0x78, ParameterType.COLOR),
+ P<float>("Light Probes Shadow Bottom Intensity", 0x7C, ParameterType.FLOAT),
+ P<float>("Light Probes Shadow Direction", 0x80, ParameterType.VECTOR3),
+ P<int>("Light Probes Daytime State", 0x9C, ParameterType.INT, pMinMaxStep(0, 6, 1)),
+ P<float>("Light Probes Daytime Interpolation", 0xA0, ParameterType.FLOAT),
+ P<int>("Light Probes Max Iter", 0xA4, ParameterType.INT),
+ P<int>("Light Probes Debug Mode", 0x98, ParameterType.INT, pStep(1))
+ };
+
private static Parameter[] contactShadowParameters = {
P<float>("Fake Light Intensity", 0xEC40, ParameterType.FLOAT),
// MonsterHunterWorld.exe+1B18711 - mov [rbx+0000EC44],3F800000 (Other unknown reference).
- P<float>("Fake Light Intensity (Gameplay)", lton(0x141B1A19F) + 0x6, ParameterType.PATCH_FLOAT),
- P<float>("Fake Light Blend", lton(0x141CDE0CE) + 0x6, ParameterType.PATCH_FLOAT),
+ P<float>("Fake Light Intensity (Gameplay)", 0x141B1A19F + 0x6, ParameterType.PATCH_FLOAT),
+ P<float>("Fake Light Blend", 0x141CDE0CE + 0x6, ParameterType.PATCH_FLOAT),
P<bool>("Force Disable Contact Shadows", 0xB4ED, ParameterType.BOOL),
P<bool>("Facial Contact Shadows Enabled", 0xB4EE, ParameterType.BOOL),
P<bool>("Facial Contact Shadows Enable Noise", 0xB501, ParameterType.BOOL),
@@ -1745,6 +1836,57 @@ namespace WorldTuningTool
P<float>("SSAO Edge Atten Rate", 0xB4DC, ParameterType.FLOAT, pStep(0.001f))
};
+ private static MtObject? sVolumeRenderer = null;
+ private static Parameter[] sVolumeRendererParameters = {
+ P<bool>("Volume Rendering Enabled", 0x38, ParameterType.BOOL)
+ };
+
+ private delegate nint CreateToneMapObject();
+ private delegate nint DestroyToneMapObject(nint toneMapObjectInternal, int unknownInt);
+ private Hook<CreateToneMapObject>? createToneMapObject;
+ private Hook<DestroyToneMapObject>? destroyToneMapObject;
+ private nint toneMapObject = 0x0;
+ private static Parameter[] toneMapParameters = {
+ P<int>("Tone Map Type", 0x16C, ParameterType.INT, pMinMaxStep(1, 9, 1)),
+ P<bool>("Tone Map Compute Luminance", 0x170, ParameterType.BOOL),
+ P<bool>("Tone Map Luminance Version", 0x168, ParameterType.BOOL),
+ P<float>("Tone Map Shoulder Strength", 0x174, ParameterType.FLOAT, pStep(0.001f)),
+ P<float>("Tone Map Linear Strength", 0x178, ParameterType.FLOAT, pStep(0.001f)),
+ P<float>("Tone Map Linear Angle", 0x17C, ParameterType.FLOAT, pStep(0.001f)),
+ P<float>("Tone Map Toe Strength", 0x180, ParameterType.FLOAT, pStep(0.001f)),
+ P<float>("Tone Map Toe Num", 0x184, ParameterType.FLOAT, pStep(0.001f)),
+ P<float>("Tone Map Toe Denum", 0x188, ParameterType.FLOAT, pStep(0.001f)),
+ P<float>("Tone Map White Point", 0x18C, ParameterType.FLOAT, pStep(0.01f)),
+ P<float>("Color Grading LUT Blend", 0x1C8, ParameterType.FLOAT, pMinMaxStep(0.0f, 1.0f, 0.01f)),
+ P<float>("Color Grading Vfx LUT Blend", 0x1D0, ParameterType.FLOAT, pMinMaxStep(0.0f, 1.0f, 0.01f)),
+ P<bool>("Color Grading Enable", 0x1D8, ParameterType.BOOL),
+ P<bool>("Color Grading Is Linear To PQ", 0x1A1, ParameterType.BOOL),
+ P<bool>("Color Grading Is PQ To Linear", 0x1A0, ParameterType.BOOL),
+ P<float>("Volume Dispersion", 0x19C, ParameterType.FLOAT),
+ P<float>("Volume Edge Sharpness", 0x198, ParameterType.FLOAT, pStep(0.00001f)),
+ P<bool>("Volume Downsample", 0x210, ParameterType.BOOL)
+ };
+ private static Parameter[] exposureParameters = {
+ P<float>("Exposure Bt Adaption Limit", 0x460, ParameterType.FLOAT, pStep(0.001f)),
+ P<float>("Exposure Bt Sensitivity", 0x458, ParameterType.FLOAT, pMaxStep(1.0f, 0.001f)),
+ P<float>("Exposure Dk Adaption Limit", 0x464, ParameterType.FLOAT, pStep(0.001f)),
+ P<float>("Exposure Dk Sensitivity", 0x45C, ParameterType.FLOAT, pMaxStep(1.0f, 0.001f)),
+ P<float>("Exposure Value", 0x474, ParameterType.FLOAT, pStep(0.001f)),
+ P<float>("Exposure Min White Point", 0x470, ParameterType.FLOAT, pStep(0.001f)),
+ P<float>("Exposure Max White Point", 0x46C, ParameterType.FLOAT, pStep(0.001f)),
+ P<float>("Exposure Mid Gray", 0x454, ParameterType.FLOAT, pStep(0.001f)),
+ P<float>("Exposure White Range", 0x468, ParameterType.FLOAT, pMinMaxStep(0.0f, 1.0f, 0.001f))
+ };
+ private static Parameter[] brightnessParameters = {
+ P<float>("Gamma Correct", 0x1C8, ParameterType.FLOAT, pStep(0.001f)),
+ P<float>("Gamma Correct EX", 0x1CC, ParameterType.FLOAT, pStep(0.001f)),
+ V<bool>("Hdr Output", 0x21A, ParameterType.BOOL),
+ P<float>("Hdr Output White Level", 0x21C, ParameterType.FLOAT, pStep(0.05f)),
+ P<float>("Hdr Output Gamut Mapping Ratio", 0x220, ParameterType.FLOAT, pStep(0.001f)),
+ P<float>("Hdr Output Gamma", 0x224, ParameterType.FLOAT, pStep(0.001f)),
+ P<bool>("Hdr Is Gui Hdr Gamma", 0x228, ParameterType.BOOL)
+ };
+
private static Parameter[] sslrParameters = {
P<int>("SSLR Loop Count", 0xE628, ParameterType.INT, pStep(1)),
P<float>("SSLR Loop Count Factor for CBR", 0xE62C, ParameterType.FLOAT),
@@ -1764,116 +1906,12 @@ namespace WorldTuningTool
P<float>("SSLR Intensity", 0xB424, ParameterType.FLOAT)
};
- private static Parameter shadowResParameter = P<int>("Shadow Resolution Multiplier", 0, ParameterType.SHADOW_RESOLUTION, pStep(1));
- private delegate void UpdateShadowParams(nint shadowParams, nint stackOffset);
- private delegate void StaticShadowParams(nint shadowParamsStatic, nint shadowObjectInternal);
- private Hook<UpdateShadowParams>? updateShadowParams;
- private Hook<StaticShadowParams>? staticShadowParams;
- private static Parameter[] shadowParameters1 = {
- };
- // These are parameters for an Infinite Light object (uSdlInfinite @ 0x143343038).
- // "Min Roughness" is +0xFC in params but is never read.
- private static Parameter[] shadowParameters2 = {
- P<int>("Sunlight Group", 0x14, ParameterType.INT, pMinMaxStep(1, 255, 1)),
- P<float>("Sunlight Direction", 0x110, ParameterType.VECTOR3, pStep(0.00025f)),
- P<float>("Sunlight Color", 0xE0, ParameterType.COLOR_FACTOR, pMaxStep(1.0f, 0.001f)),
- P<float>("Sunlight Intensity", 0xF4, ParameterType.FLOAT, pStep(0.005f)),
- P<bool>("Sunlight Is Primary", 0x1D, ParameterType.BOOL),
- P<bool>("Do Volumetric", 0x1F, ParameterType.BOOL),
- P<bool>("Shadow Cast", 0x23, ParameterType.BOOL),
- P<int>("Shadow Map Size", 0x30, ParameterType.ALIGNED_INT, pMinStep(0, 128)), // 0 = 64x64 no multiplier @TODO: Verify in the code.
- P<float>("Shadow Near Clip Distance", 0x28, ParameterType.FLOAT),
- P<int>("Shadow Cascade Mode", 0x174, ParameterType.INT, pMinMaxStep(0, 3, 1)),
- P<float>("Shadow Cascade 2Way Bias", 0x17C, ParameterType.FLOAT),
- P<float>("Shadow Distance", 0x6C, ParameterType.FLOAT, pStep(5.0f)),
- P<float>("Shadow Backforward Distance", 0x7C, ParameterType.FLOAT, pStep(5.0f)),
- P<bool>("Shadow Is Fixed Fov Mode", 0x1F9, ParameterType.BOOL),
- P<float>("Shadow Fov", 0x1F4, ParameterType.FLOAT, pStep(0.0001f)),
- P<bool>("Shadow Is Discretization Fov Mode", 0x205, ParameterType.BOOL),
- P<float>("Shadow Discretization Angle", 0x200, ParameterType.FLOAT, pStep(0.0001f)),
- P<float>("Shadow Distribution", 0x74, ParameterType.FLOAT, pStep(0.001f)),
- P<bool>("Cascade Manual Split", 0x4D, ParameterType.BOOL),
- P<float>("Cascade Manual Split Distance[0]", 0x54, ParameterType.FLOAT),
- P<float>("Cascade Manual Split Distance[1]", 0x5C, ParameterType.FLOAT),
- P<float>("Cascade Manual Split Distance[2]", 0x64, ParameterType.FLOAT),
- P<float>("Shadow Sloped Depth Bias", 0x40, ParameterType.FLOAT, pStep(0.00001f)),
- P<float>("Shadow Depth Bias", 0x38, ParameterType.FLOAT, pStep(0.00001f)),
- P<float>("Shadow Max Depth Bias", 0x48, ParameterType.FLOAT, pStep(0.00001f)),
- P<bool>("Cascade Individual Shadow Bias", 0x81, ParameterType.BOOL),
- P<float>("Cascade Depth Bias[0]", 0x88, ParameterType.FLOAT, pStep(0.00001f)),
- P<float>("Cascade Sloped Depth Bias[0]", 0xA0, ParameterType.FLOAT, pStep(0.00001f)),
- P<float>("Cascade Max Depth Bias[0]", 0xB8, ParameterType.FLOAT, pStep(0.00001f)),
- P<float>("Cascade Depth Bias[1]", 0x90, ParameterType.FLOAT, pStep(0.00001f)),
- P<float>("Cascade Sloped Depth Bias[1]", 0xA8, ParameterType.FLOAT, pStep(0.00001f)),
- P<float>("Cascade Max Depth Bias[1]", 0xC0, ParameterType.FLOAT, pStep(0.00001f)),
- P<float>("Cascade Depth Bias[2]", 0x98, ParameterType.FLOAT, pStep(0.00001f)),
- P<float>("Cascade Sloped Depth Bias[2]", 0xB0, ParameterType.FLOAT, pStep(0.00001f)),
- P<float>("Cascade Max Depth Bias[2]", 0xC8, ParameterType.FLOAT, pStep(0.00001f)),
- P<float>("Broad Area Shadow Depth Bias", 0x1C4, ParameterType.FLOAT, pStep(0.00001f)),
- P<float>("Broad Area Shadow Sloped Depth Bias", 0x1CC, ParameterType.FLOAT, pStep(0.00001f)),
- P<float>("Broad Area Shadow Max Depth Bias", 0x1D4, ParameterType.FLOAT, pStep(0.00001f)),
- P<float>("Projection Scale", 0x134, ParameterType.VECTOR2),
- P<float>("Projection Offset Speed", 0x144, ParameterType.VECTOR2),
- P<float>("Projection Up", 0x160, ParameterType.VECTOR3),
- P<int>("Primary Shadow Sample Num", 0x1DC, ParameterType.INT, pStep(1)),
- P<float>("Primary Shadow Radius", 0x1EC, ParameterType.FLOAT, pStep(0.0001f))
- };
-
- private static MtObject? sLightProbes = null;
- private delegate void UpdateLightProbesParams(nint unknownPtr, int unknownInt);
- private static Parameter[] sLightProbesParameters = {
- P<int>("Light Probes Probe Color", 0x38, ParameterType.COLOR),
- P<float>("Light Probes Probe Intensity", 0x3C, ParameterType.FLOAT),
- P<int>("Light Probes Top Color", 0x44, ParameterType.COLOR),
- P<float>("Light Probes Top Intensity", 0x48, ParameterType.FLOAT),
- P<int>("Light Probes Bottom Color", 0x4C, ParameterType.COLOR),
- P<float>("Light Probes Bottom Intensity", 0x50, ParameterType.FLOAT),
- P<float>("Light Probes Direction", 0x60, ParameterType.VECTOR3),
- P<int>("Light Probes Shadow Top Color", 0x70, ParameterType.COLOR),
- P<float>("Light Probes Shadow Top Intensity", 0x74, ParameterType.FLOAT),
- P<int>("Light Probes Shadow Bottom Color", 0x78, ParameterType.COLOR),
- P<float>("Light Probes Shadow Bottom Intensity", 0x7C, ParameterType.FLOAT),
- P<float>("Light Probes Shadow Direction", 0x80, ParameterType.VECTOR3),
- P<int>("Light Probes Daytime State", 0x9C, ParameterType.INT, pMinMaxStep(0, 6, 1)),
- P<float>("Light Probes Daytime Interpolation", 0xA0, ParameterType.FLOAT),
- P<int>("Light Probes Max Iter", 0xA4, ParameterType.INT),
- P<int>("Light Probes Debug Mode", 0x98, ParameterType.INT, pStep(1))
- };
-
- private delegate nint CreateLightingObject();
- private delegate nint DestroyLightingObject(nint lightingObjectInternal, int unknownInt);
- private Hook<CreateLightingObject>? createLightingObject;
- private Hook<DestroyLightingObject>? destroyLightingObject;
- private nint lightingObject = 0x0;
- private static LUT luts = new LUT();
- private static Parameter[] lightingParameters = {
- P<int>("Light Tone Map Type", 0x16C, ParameterType.INT, pMinMaxStep(1, 6, 1)),
- P<bool>("Light Compute Luminance", 0x170, ParameterType.BOOL),
- P<bool>("Light Luminance Version", 0x168, ParameterType.BOOL),
- P<float>("Light Shoulder Strength", 0x174, ParameterType.FLOAT, pStep(0.001f)),
- P<float>("Light Linear Strength", 0x178, ParameterType.FLOAT, pStep(0.001f)),
- P<float>("Light Linear Angle", 0x17C, ParameterType.FLOAT, pStep(0.001f)),
- P<float>("Light Toe Strength", 0x180, ParameterType.FLOAT, pStep(0.001f)),
- P<float>("Light Toe Num", 0x184, ParameterType.FLOAT, pStep(0.001f)),
- P<float>("Light Toe Denum", 0x188, ParameterType.FLOAT, pStep(0.001f)),
- P<float>("Light White Point", 0x18C, ParameterType.FLOAT, pStep(0.01f)),
- P<float>("Light LUT Blend", 0x1C8, ParameterType.FLOAT, pMinMaxStep(0.0f, 1.0f, 0.01f)),
- P<float>("Light Vfx LUT Blend", 0x1D0, ParameterType.FLOAT, pMinMaxStep(0.0f, 1.0f, 0.01f)),
- P<bool>("Light Enable Color Grading", 0x1D8, ParameterType.BOOL),
- P<bool>("Light Is Linear To PQ", 0x1A1, ParameterType.BOOL),
- P<bool>("Light Is PQ To Linear", 0x1A0, ParameterType.BOOL),
- P<float>("Volume Dispersion", 0x19C, ParameterType.FLOAT),
- P<float>("Volume Edge Sharpness", 0x198, ParameterType.FLOAT, pStep(0.00001f)),
- P<bool>("Volume Downsample", 0x210, ParameterType.BOOL)
- };
- private static Parameter[] brightnessParameters = {
- P<float>("Gamma Correct", 0x1C8, ParameterType.FLOAT, pStep(0.001f)),
- P<float>("Gamma Correct EX", 0x1CC, ParameterType.FLOAT, pStep(0.001f)),
- V<bool>("Hdr Output", 0x21A, ParameterType.BOOL),
- P<float>("Hdr Output White Level", 0x21C, ParameterType.FLOAT, pStep(0.05f)),
- P<float>("Hdr Output Gamut Mapping Ratio", 0x220, ParameterType.FLOAT, pStep(0.001f)),
- P<float>("Hdr Output Gamma", 0x224, ParameterType.FLOAT, pStep(0.001f)),
- P<bool>("Hdr Is Gui Hdr Gamma", 0x228, ParameterType.BOOL)
+ private delegate nint CreateRenderPassesObject(nint unknownPtr1, nint unknownPtr2);
+ private delegate nint DestroyRenderPassesObject(nint renderPassesObjectInternal, int unknownInt);
+ private Hook<CreateRenderPassesObject>? createRenderPassesObject;
+ private Hook<DestroyRenderPassesObject>? destroyRenderPassesObject;
+ private nint renderPassesObject = 0x0;
+ private static Parameter[] renderPassesParameters = {
};
private delegate nint CreateBloomObject();
@@ -2089,6 +2127,30 @@ namespace WorldTuningTool
P<float>("Fog Mip Fog Color", 0x330, ParameterType.COLOR_FACTOR, pStep(0.001f))
};
+ private static MtObject? sMhSpeedTree = null;
+ private static Parameter[] speedTreeParameters = {
+ //P<bool>("Speed Tree is Active", 0x339, ParameterType.BOOL),
+ P<bool>("Speed Tree Wind Active", 0x33A, ParameterType.BOOL),
+ //P<bool>("Speed Tree System Wind Active", 0x33C, ParameterType.BOOL),
+ //P<bool>("Speed Tree Disp Off Water Reflection", 0x33B, ParameterType.BOOL),
+ P<float>("Speed Tree Wind Direction", 0x210 + 0x30, ParameterType.VECTOR3),
+ P<float>("Speed Tree Wind Strength", 0x210 + 0x40, ParameterType.FLOAT),
+ /*
+ P<float>("Speed Tree Wind Strength Response", 0x210 + 0x44, ParameterType.FLOAT),
+ P<float>("Speed Tree Wind Direction Response", 0x210 + 0x48, ParameterType.FLOAT),
+ P<float>("Speed Tree Wind Gust Frequency", 0x210 + 0x4C, ParameterType.FLOAT),
+ P<float>("Speed Tree Wind Gust Strength Min", 0x210 + 0x50, ParameterType.FLOAT),
+ P<float>("Speed Tree Wind Gust Strength Max", 0x210 + 0x54, ParameterType.FLOAT),
+ P<float>("Speed Tree Wind Gust Duration Min", 0x210 + 0x58, ParameterType.FLOAT),
+ P<float>("Speed Tree Wind Gust Duration Max", 0x210 + 0x5C, ParameterType.FLOAT),
+ P<float>("Speed Tree Wind Gust Rise Scalar", 0x210 + 0x60, ParameterType.FLOAT),
+ P<float>("Speed Tree Wind Gust Fall Scalar", 0x210 + 0x64, ParameterType.FLOAT),
+ P<bool>("Speed Tree Wind Gust Enable", 0x210 + 0x68, ParameterType.BOOL),
+ P<float>("Speed Tree Wind Instance Delay", 0x32C, ParameterType.FLOAT),
+ P<float>("Speed Tree Wind Blend Length", 0x328, ParameterType.FLOAT)
+ */
+ };
+
private delegate nint CreateWaterWaveObject(nint unknownPtr);
private delegate nint DestroyWaterWaveObject(nint waterWaveObjectInternal, int unknownInt);
private Hook<CreateWaterWaveObject>? createWaterWaveObject;
@@ -2134,24 +2196,29 @@ namespace WorldTuningTool
.Concat(sTimeParameters)
.Concat(lodParameters)
.Concat(snowParameters)
+ .Concat(passthroughParameters)
.Append(shadowResParameter)
- .Concat(shadowParameters2)
.Concat(shadowCascadeParameters)
+ .Concat(primaryShadowParameters)
.Concat(broadAreaShadowParameters)
+ .Concat(primaryBroadAreaParameters)
+ .Concat(primaryLightParameters)
.Concat(sLightProbesParameters)
.Concat(contactShadowParameters)
.Concat(capsuleLightParameters)
.Concat(ssaoParameters)
- .Concat(sslrParameters)
- .Concat(passthroughParameters)
- .Concat(lightingParameters)
+ .Concat(sVolumeRendererParameters)
+ .Concat(toneMapParameters)
+ .Concat(exposureParameters)
.Concat(brightnessParameters)
+ .Concat(sslrParameters)
.Concat(bloomParameters)
.Concat(dofParameters)
.Concat(motionBlurParameters)
.Concat(hazeParameters)
.Concat(simpleSkyParameters)
.Concat(fogParameters)
+ .Concat(speedTreeParameters)
.Concat(waterWaveParameters)
.Concat(fxaaParameters)
.Concat(taaParameters)
@@ -2329,6 +2396,12 @@ namespace WorldTuningTool
private bool continousSSLRTemporalReset = false;
private Patch forceSSLRTemporalReset;
+#if SHADER_FEATURES
+ private bool volumeUpsampleNoLinear = false;
+ private bool fxaaMaxQuality = false;
+ private bool skinAllowNegativeWet = false;
+#endif
+
private bool fullResVolumeBlur = false;
private Patch volumeSars1;
private Patch volumeSars2;
@@ -2394,11 +2467,21 @@ namespace WorldTuningTool
defaultViewModeLODLimit_4.Disable();
}
+ private Patch defaultCharaCreatorParam;
+ private bool charaCreatorFace = false;
+
private bool largerFoliageSwayRange = false;
private Patch addressHigherValueForFoliageSway;
private bool disableReducedRateAnimations = false;
+ private bool disableReducedRateAnimations2 = false;
private Patch zeroFrameSkip;
+ private Patch zeroFrameSkip2;
+ private Patch zeroFrameSkip3;
+
+ private bool viewModeLodOverride = false;
+ private Patch viewModeAddressLod1;
+ private Patch viewModeAddressLod2;
private bool nukeEffects = false;
private Patch jmpOverEffects;
@@ -2458,7 +2541,7 @@ namespace WorldTuningTool
// Assert no duplicate names.
foreach (Parameter param in allParameters)
{
- Assert(Array.FindAll(allParameters, (p => p.Name == param.Name)).Length == 1);
+ Assert(Array.FindAll(allParameters, ((p) => p.Name == param.Name)).Length == 1);
}
// Assert OrderedStages covers all values.
@@ -2475,54 +2558,60 @@ namespace WorldTuningTool
// Used for:
// "Capsule AO Intensity".
// "Broad Area Shadow Direction". Otherwise it will flicker on center change.
- evaluateSceneParams = Hook.Create<EvaluateSceneParams>(0x1423C3790, EvaluateSceneParamsHook); // nint, nint, int, nint
+ evaluateSceneParams = Hook.Create<EvaluateSceneParams>(0x1423C3790, EvaluateSceneParamsHook);
// These run in a loop during cutscenes.
- updateSSAOParams = Hook.Create<UpdateSSAOParams>(0x1416D8B10, UpdateSSAOParamsHook); // nint
- updateSSLRParams = Hook.Create<UpdateSSLRParams>(0x1416DA3F0, UpdateSSLRParamsHook); // nint
- updateLightingParams = Hook.Create<UpdateLightingParams>(0x1416DAAB0, UpdateLightingParamsHook); // nint, nint
+ updateSSAOParams = Hook.Create<UpdateSSAOParams>(0x1416D8B10, UpdateSSAOParamsHook);
+ updateSSLRParams = Hook.Create<UpdateSSLRParams>(0x1416DA3F0, UpdateSSLRParamsHook);
+ updateToneMapParams = Hook.Create<UpdateToneMapParams>(0x1416DAAB0, UpdateToneMapParamsHook);
+
+ createToneMapObject = Hook.Create<CreateToneMapObject>(0x1424CDE20, CreateToneMapObjectHook);
+ destroyToneMapObject = Hook.Create<DestroyToneMapObject>(0x1424CE380, DestroyToneMapObjectHook);
- createLightingObject = Hook.Create<CreateLightingObject>(0x1424CDE20, CreateLightingObjectHook);
- destroyLightingObject = Hook.Create<DestroyLightingObject>(0x1424CE380, DestroyLightingObjectHook); // nint, int
+ createRenderPassesObject = Hook.Create<CreateRenderPassesObject>(0x14255BA70, CreateRenderPassesObjectHook);
+ destroyRenderPassesObject = Hook.Create<DestroyRenderPassesObject>(0x14255C710, DestroyRenderPassesObjectHook);
createBloomObject = Hook.Create<CreateBloomObject>(0x1424CB3C0, CreateBloomObjectHook);
- createBloomObject2 = Hook.Create<CreateBloomObject2>(0x1424CB5E0, CreateBloomObject2Hook); // nint
- destroyBloomObject = Hook.Create<DestroyBloomObject>(0x1424CB750, DestroyBloomObjectHook); // nint, int
+ createBloomObject2 = Hook.Create<CreateBloomObject2>(0x1424CB5E0, CreateBloomObject2Hook);
+ destroyBloomObject = Hook.Create<DestroyBloomObject>(0x1424CB750, DestroyBloomObjectHook);
createDofObject = Hook.Create<CreateDofObject>(0x142421E80, CreateDofObjectHook);
- createDofObject2 = Hook.Create<CreateDofObject2>(0x1424220A0, CreateDofObject2Hook); // nint
- destroyDofObject = Hook.Create<DestroyDofObject>(0x142422290, DestroyDofObjectHook); // nint, int
+ createDofObject2 = Hook.Create<CreateDofObject2>(0x1424220A0, CreateDofObject2Hook);
+ destroyDofObject = Hook.Create<DestroyDofObject>(0x142422290, DestroyDofObjectHook);
createMotionBlurObject = Hook.Create<CreateMotionBlurObject>(0x1424C95E0, CreateMotionBlurObjectHook);
- createMotionBlurObject2 = Hook.Create<CreateMotionBlurObject2>(0x1424C9740, CreateMotionBlurObject2Hook); // nint
- destroyMotionBlurObject = Hook.Create<DestroyMotionBlurObject>(0x1424C97E0, DestroyMotionBlurObjectHook); // nint, int
+ createMotionBlurObject2 = Hook.Create<CreateMotionBlurObject2>(0x1424C9740, CreateMotionBlurObject2Hook);
+ destroyMotionBlurObject = Hook.Create<DestroyMotionBlurObject>(0x1424C97E0, DestroyMotionBlurObjectHook);
createHazeObject = Hook.Create<CreateHazeObject>(0x1424C6A80, CreateHazeObjectHook);
- createHazeObject2 = Hook.Create<CreateHazeObject2>(0x1424C6C70, CreateHazeObject2Hook); // nint
- destroyHazeObject = Hook.Create<DestroyHazeObject>(0x1424C6E20, DestroyHazeObjectHook); // nint, int
+ createHazeObject2 = Hook.Create<CreateHazeObject2>(0x1424C6C70, CreateHazeObject2Hook);
+ destroyHazeObject = Hook.Create<DestroyHazeObject>(0x1424C6E20, DestroyHazeObjectHook);
- createSimpleSkyObject = Hook.Create<CreateSimpleSkyObject>(0x141FCCC20, CreateSimpleSkyObjectHook); // nint
- destroySimpleSkyObject = Hook.Create<DestroySimpleSkyObject>(0x141FCD840, DestroySimpleSkyObjectHook); // nint, int
+ createSimpleSkyObject = Hook.Create<CreateSimpleSkyObject>(0x141FCCC20, CreateSimpleSkyObjectHook);
+ destroySimpleSkyObject = Hook.Create<DestroySimpleSkyObject>(0x141FCD840, DestroySimpleSkyObjectHook);
createFogObject = Hook.Create<CreateFogObject>(0x141FADB50, CreateFogObjectHook);
- createFogObject2 = Hook.Create<CreateFogObject2>(0x141FADC80, CreateFogObject2Hook); // nint
- destroyFogObject = Hook.Create<DestroyFogObject>(0x141FADD50, DestroyFogObjectHook); // nint, int
+ createFogObject2 = Hook.Create<CreateFogObject2>(0x141FADC80, CreateFogObject2Hook);
+ destroyFogObject = Hook.Create<DestroyFogObject>(0x141FADD50, DestroyFogObjectHook);
- createWaterWaveObject = Hook.Create<CreateWaterWaveObject>(0x1423F0850, CreateWaterWaveObjectHook); // nint
- destroyWaterWaveObject = Hook.Create<DestroyWaterWaveObject>(0x1423F0EE0, DestroyWaterWaveObjectHook); // nint, int
+ createWaterWaveObject = Hook.Create<CreateWaterWaveObject>(0x1423F0850, CreateWaterWaveObjectHook);
+ destroyWaterWaveObject = Hook.Create<DestroyWaterWaveObject>(0x1423F0EE0, DestroyWaterWaveObjectHook);
createFXAAObject = Hook.Create<CreateFXAAObject>(0x142393560, CreateFXAAObjectHook);
- createFXAAObject2 = Hook.Create<CreateFXAAObject2>(0x142393680, CreateFXAAObject2Hook); // nint
- destroyFXAAObject = Hook.Create<DestroyFXAAObject>(0x142393740, DestroyFXAAObjectHook); // nint, int
+ createFXAAObject2 = Hook.Create<CreateFXAAObject2>(0x142393680, CreateFXAAObject2Hook);
+ destroyFXAAObject = Hook.Create<DestroyFXAAObject>(0x142393740, DestroyFXAAObjectHook);
createTAAObject = Hook.Create<CreateTAAObject>(0x1423911A0, CreateTAAObjectHook);
- createTAAObject2 = Hook.Create<CreateTAAObject2>(0x142391320, CreateTAAObject2Hook); // nint
- destroyTAAObject = Hook.Create<DestroyTAAObject>(0x1423916E0, DestroyTAAObjectHook); // nint, int
+ createTAAObject2 = Hook.Create<CreateTAAObject2>(0x142391320, CreateTAAObject2Hook);
+ destroyTAAObject = Hook.Create<DestroyTAAObject>(0x1423916E0, DestroyTAAObjectHook);
nint addr = PatternScanner.FindFirst(Pattern.FromString("48 89 5C 24 10 48 89 74 24 18 48 89 7C 24 20 55 41 56 41 57 48 8B EC 48 83 EC 30 48 8B FA 48 8B D9 E8 AA B6 C1 FF 48 8B 47 10 48 8D 57 50"));
- Assert(addr == 0x141AB2260); // nint, nint
- updateShadowParams = Hook.Create<UpdateShadowParams>(addr, UpdateShadowParamsHook);
- staticShadowParams = Hook.Create<StaticShadowParams>(0x1416D94F0, StaticShadowParamsHook); // nint, nint
+ Assert(addr == 0x141AB2260);
+ updatePrimaryLightParams = Hook.Create<UpdatePrimaryLightParams>(addr, UpdatePrimaryLightParamsHook);
+ staticPrimaryLightParams = Hook.Create<StaticPrimaryLightParams>(0x1416D94F0, StaticPrimaryLightParamsHook);
+
+ defaultHqMode = new Patch(0x14226562B, [0xC6, 0x87, 0xA3, 0xE9, 0x00, 0x00, 0x01]);
+ //defaultHqMode.Enable();
setShadowQuality = new NativeAction<int>(0x14043FF80);
@@ -2544,9 +2633,9 @@ namespace WorldTuningTool
shadowRes1_2 = new Patch(addr + 0x68, [0x59]); // movss -> mulss.
shadowRes1_3 = new Patch(addr + 0x77, [0x59]); // movss -> mulss.
#if OVERSIZED_SHADOW_MAP
- shadowRes1_4 = new Patch(lton(0x142288AAA) + 0x4, [0x7A, 0x97, 0xF8, 0x00]); // Limit 4.0 -> 6.0.
+ shadowRes1_4 = new Patch(0x142288AAA + 0x4, [0x7A, 0x97, 0xF8, 0x00]); // Limit 4.0 -> 6.0.
#else
- shadowRes1_4 = new Patch(lton(0x142288AAA) + 0x4, [0x9E]); // Limit 4.0 -> 5.0.
+ shadowRes1_4 = new Patch(0x142288AAA + 0x4, [0x9E]); // Limit 4.0 -> 5.0.
#endif
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"));
Assert(addr == 0x142288B00);
@@ -2570,35 +2659,35 @@ namespace WorldTuningTool
broadAreaShadowRes2_Addr = addr;
// The volume blur filter is created at a different place in the code and happens at a different
- // time (area change/createLightingObject() vs change of Volume Quality setting). It's also rendered
+ // time (area change/createToneMapObject() vs change of Volume Quality setting). It's also rendered
// in a seperate pass that happens after the initial volume rendering. So keep that in mind if inspecting
// a frame in renderdoc.
- volumeSars1 = new Patch(lton(0x1424D0159), [0x90, 0x90]);
- volumeSars2 = new Patch(lton(0x1424D01A0), [0x90, 0x90]);
- volumeSars3 = new Patch(lton(0x1424D01C6), [0x90, 0x90]);
- volumeSars4 = new Patch(lton(0x1424D0219), [0x90, 0x90]);
- volumeSars5 = new Patch(lton(0x1424D0242), [0x90, 0x90]);
- volumeSars6 = new Patch(lton(0x1424D029D), [0x90, 0x90]);
- volumeSars7 = new Patch(lton(0x1424D02C6), [0x90, 0x90]);
- volumeSars8 = new Patch(lton(0x1424D0321), [0x90, 0x90]);
- volumeSars9 = new Patch(lton(0x1424D034A), [0x90, 0x90]);
+ volumeSars1 = new Patch(0x1424D0159, [0x90, 0x90]);
+ volumeSars2 = new Patch(0x1424D01A0, [0x90, 0x90]);
+ volumeSars3 = new Patch(0x1424D01C6, [0x90, 0x90]);
+ volumeSars4 = new Patch(0x1424D0219, [0x90, 0x90]);
+ volumeSars5 = new Patch(0x1424D0242, [0x90, 0x90]);
+ volumeSars6 = new Patch(0x1424D029D, [0x90, 0x90]);
+ volumeSars7 = new Patch(0x1424D02C6, [0x90, 0x90]);
+ volumeSars8 = new Patch(0x1424D0321, [0x90, 0x90]);
+ volumeSars9 = new Patch(0x1424D034A, [0x90, 0x90]);
/* As far as I can tell, this is limited by buffers created cpu-side. Seems like
* it would be an extremely hard change.
- froxelRes1 = new Patch(lton(0x142384F15) + 0x1, [0x02]); // 4 -> 2
- froxelRes2 = new Patch(lton(0x142389711) + 0x1, [0x02]); // 4 -> 2
- froxelRes3 = new Patch(lton(0x142389878) + 0x1, [0x02]); // 4 -> 2
- froxelRes4 = new Patch(lton(0x14238989E) + 0x1, [0x02]); // 4 -> 2
- froxelRes5 = new Patch(lton(0x1423898D8) + 0x1, [0x02]); // 4 -> 2
- froxelRes6 = new Patch(lton(0x14238992B) + 0x1, [0x02]); // 4 -> 2
- froxelRes7 = new Patch(lton(0x14238FED1) + 0x4, [0x7B, 0xFF, 0xAB, 0x00]); // 0.25 -> 0.50
- froxelRes8 = new Patch(lton(0x14239009C) + 0x4, [0xB0, 0xFD, 0xAB, 0X00]); // 0.25 -> 0.50
+ froxelRes1 = new Patch(0x142384F15 + 0x1, [0x02]); // 4 -> 2
+ froxelRes2 = new Patch(0x142389711 + 0x1, [0x02]); // 4 -> 2
+ froxelRes3 = new Patch(0x142389878 + 0x1, [0x02]); // 4 -> 2
+ froxelRes4 = new Patch(0x14238989E + 0x1, [0x02]); // 4 -> 2
+ froxelRes5 = new Patch(0x1423898D8 + 0x1, [0x02]); // 4 -> 2
+ froxelRes6 = new Patch(0x14238992B + 0x1, [0x02]); // 4 -> 2
+ froxelRes7 = new Patch(0x14238FED1 + 0x4, [0x7B, 0xFF, 0xAB, 0x00]); // 0.25 -> 0.50
+ froxelRes8 = new Patch(0x14239009C + 0x4, [0xB0, 0xFD, 0xAB, 0X00]); // 0.25 -> 0.50
*/
/* Would require a complicated shader edit to maybe work. Similar to SSLR.
- checkerRes1 = new Patch(lton(0x14238580D) + 0x4, [0x43]); // 0.5 -> 1.0
- checkerRes2 = new Patch(lton(0x14238FFC3) + 0x4, [0x8D]); // 0.5 -> 1.0
+ checkerRes1 = new Patch(0x14238580D + 0x4, [0x43]); // 0.5 -> 1.0
+ checkerRes2 = new Patch(0x14238FFC3 + 0x4, [0x8D]); // 0.5 -> 1.0
*/
- value2ForVolumeQuality = new Patch(lton(0x142389652), [0xB8, 0x02, 0x00, 0x00, 0x00, 0x90]);
+ value2ForVolumeQuality = new Patch(0x142389652, [0xB8, 0x02, 0x00, 0x00, 0x00, 0x90]);
// Gameplay.
addr = PatternScanner.FindFirst(Pattern.FromString("80 BB 34 EC 00 00 00 88 8B 31 EC 00 00 C6 83 30 EC 00 00 00 74 1C C6 83 34 EC 00 00 00 48 8B 0D 68 4B 4F 03 80 B9 58 02 00 00 00 75 05 E8 5A F5 01 00 48 8B CB E8 E2 05 00 00 83 BB DC EB 00 00 06 74 0A C7 83 DC EB 00 00 06 00 00 00"));
@@ -2616,18 +2705,25 @@ namespace WorldTuningTool
defaultViewModeLODLimit_2 = new Patch(addr + 0x24, [0x07]);
// Talking to NPC.
- defaultViewModeLODLimit_3 = new Patch(lton(0x14128F1AC) + 0x1, [0x07]);
- defaultViewModeLODLimit_4 = new Patch(lton(0x14128F1AC) + 0xF, [0x07]);
+ defaultViewModeLODLimit_3 = new Patch(0x14128F1AC + 0x1, [0x07]);
+ defaultViewModeLODLimit_4 = new Patch(0x14128F1AC + 0xF, [0x07]);
+
+ defaultCharaCreatorParam = new Patch(0x141B1A0C1 + 0x6, [0x1]);
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"));
Assert(addr == 0x1426D89CA);
addressHigherValueForFoliageSway = new Patch(addr + 0x7, [0x04]);
// Found using mFrameSkipNum annotation from MHW-DTI-Dumps.
- zeroFrameSkip = new Patch(lton(0x142246948), [0x31, 0xC0, 0x90, 0x90, 0x90, 0x90]);
+ zeroFrameSkip = new Patch(0x142246948, [0x31, 0xC0, 0x90, 0x90, 0x90, 0x90]);
+ zeroFrameSkip2 = new Patch(0x142641888, [0x31, 0xC0, 0x90, 0x90, 0x90, 0x90]);
+ zeroFrameSkip3 = new Patch(0x14237AD75, [0x31, 0xC0, 0x90, 0x90, 0x90, 0x90]);
+
+ viewModeAddressLod1 = new Patch(0x141B19A6C + 0x4, [0x1C, 0x02, 0x00, 0x00]);
+ viewModeAddressLod2 = new Patch(0x141B19B7C + 0x4, [0x20, 0x02, 0x00, 0x00]);
// vTable of Interest: 0x1433B8730.
- jmpOverEffects = new Patch(lton(0x14263483B), [0xEB]);
+ jmpOverEffects = new Patch(0x14263483B, [0xEB]);
// The game will crash when trying to switch to the FULL_RES path for SSR. It's likley because
// it tries to access shaders that are not available in the game files.
@@ -2637,78 +2733,78 @@ namespace WorldTuningTool
// is that it's compiled out and that this method of increasing the SSR resolution can't work.
/*
// Attempt to forcefully enable FULL_RES path for SSR.
- ssrFullRes1 = new Patch(lton(0x14228894D), [0x0F, 0x85, 0xB9, 0xAA, 0x30, 0x00]);
- ssrFullRes1_1 = new Patch(lton(0x14259340C), [0xC6, 0x81, 0x28, 0x02, 0x00, 0x00, 0x00, 0x90, 0x90, 0x90]);
- ssrFullRes2 = new Patch(lton(0x14228897D), [0x0F, 0x85, 0x99, 0xAA, 0x30, 0x00]);
- ssrFullRes2_1 = new Patch(lton(0x14259341C), [0xC6, 0x81, 0x30, 0x02, 0x00, 0x00, 0x00, 0x90, 0x90, 0x90]);
- ssrFullRes3 = new Patch(lton(0x1422889AD), [0x0F, 0x85, 0x79, 0xAA, 0x30, 0x00]);
- ssrFullRes3_1 = new Patch(lton(0x14259342C), [0xC6, 0x81, 0x2C, 0x02, 0x00, 0x00, 0x00, 0x90, 0x90, 0x90]);
- ssrFullRes4 = new Patch(lton(0x14259268C), [0x41, 0xC7, 0x86, 0x28, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xC7, 0x86, 0x2C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xC7, 0x86, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xC7, 0x86, 0x34, 0x02, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0xC7, 0x86, 0x38, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x41, 0xC6, 0x86, 0x3C, 0x02, 0x00, 0x00, 0x01]);
+ ssrFullRes1 = new Patch(0x14228894D, [0x0F, 0x85, 0xB9, 0xAA, 0x30, 0x00]);
+ ssrFullRes1_1 = new Patch(0x14259340C, [0xC6, 0x81, 0x28, 0x02, 0x00, 0x00, 0x00, 0x90, 0x90, 0x90]);
+ ssrFullRes2 = new Patch(0x14228897D, [0x0F, 0x85, 0x99, 0xAA, 0x30, 0x00]);
+ ssrFullRes2_1 = new Patch(0x14259341C, [0xC6, 0x81, 0x30, 0x02, 0x00, 0x00, 0x00, 0x90, 0x90, 0x90]);
+ ssrFullRes3 = new Patch(0x1422889AD, [0x0F, 0x85, 0x79, 0xAA, 0x30, 0x00]);
+ ssrFullRes3_1 = new Patch(0x14259342C, [0xC6, 0x81, 0x2C, 0x02, 0x00, 0x00, 0x00, 0x90, 0x90, 0x90]);
+ ssrFullRes4 = new Patch(0x14259268C, [0x41, 0xC7, 0x86, 0x28, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xC7, 0x86, 0x2C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xC7, 0x86, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xC7, 0x86, 0x34, 0x02, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0xC7, 0x86, 0x38, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x41, 0xC6, 0x86, 0x3C, 0x02, 0x00, 0x00, 0x01]);
*/
// SSLR resolution factor 0.5 -> 1.0 (not related to fSSLRFactor or fSSLRScale).
- ssrRes1 = new Patch(lton(0x1425926B8) + 0x9, [0x80]);
- ssrRes2 = new Patch(lton(0x1425934C0) + 0x8, [0x80]);
+ ssrRes1 = new Patch(0x1425926B8 + 0x9, [0x80]);
+ ssrRes2 = new Patch(0x1425934C0 + 0x8, [0x80]);
// Skip mip mapping pass (part of _FULL_RES).
- ssrRes3 = new Patch(lton(0x142282B53), [0x31, 0xC0, 0x90, 0x90, 0x90]);
+ ssrRes3 = new Patch(0x142282B53, [0x31, 0xC0, 0x90, 0x90, 0x90]);
// Depth mips resolution.
- ssrShr1 = new Patch(lton(0x14269DE47), [0x90, 0x90]);
- ssrShr2 = new Patch(lton(0x14269DE54), [0x90, 0x90]);
- ssrShr3 = new Patch(lton(0x14269E07A), [0x90, 0x90]);
- ssrShr4 = new Patch(lton(0x14269E080), [0x90, 0x90]);
+ ssrShr1 = new Patch(0x14269DE47, [0x90, 0x90]);
+ ssrShr2 = new Patch(0x14269DE54, [0x90, 0x90]);
+ ssrShr3 = new Patch(0x14269E07A, [0x90, 0x90]);
+ ssrShr4 = new Patch(0x14269E080, [0x90, 0x90]);
// Approximate depth mip resolution.
- ssrShr5 = new Patch(lton(0x14269DED3) + 0x2, [0x3]); // 4 -> 3
- ssrShr6 = new Patch(lton(0x14269DEDA) + 0x3, [0x3]);
+ ssrShr5 = new Patch(0x14269DED3 + 0x2, [0x3]); // 4 -> 3
+ ssrShr6 = new Patch(0x14269DEDA + 0x3, [0x3]);
// Depth mips pass 1 dispatch dimensions.
- ssrSars1 = new Patch(lton(0x142282FD8) + 0x3, [0x3]); // 4 -> 3
- ssrSars2 = new Patch(lton(0x142282FE5) + 0x2, [0x3]);
+ ssrSars1 = new Patch(0x142282FD8 + 0x3, [0x3]); // 4 -> 3
+ ssrSars2 = new Patch(0x142282FE5 + 0x2, [0x3]);
// Depth mips pass 2 iRegion parameter.
- ssrSars3 = new Patch(lton(0x142283014) + 0x3, [0x3]);
- ssrSars4 = new Patch(lton(0x142283018) + 0x3, [0x3]);
- ssrSars5 = new Patch(lton(0x14228301C) + 0x3, [0x3]);
- ssrSars6 = new Patch(lton(0x142283020) + 0x2, [0x3]);
+ ssrSars3 = new Patch(0x142283014 + 0x3, [0x3]);
+ ssrSars4 = new Patch(0x142283018 + 0x3, [0x3]);
+ ssrSars5 = new Patch(0x14228301C + 0x3, [0x3]);
+ ssrSars6 = new Patch(0x142283020 + 0x2, [0x3]);
// Depth mips pass 2 dispatch dimensions.
- ssrSars7 = new Patch(lton(0x1422832B3) + 0x3, [0x3]);
- ssrSars8 = new Patch(lton(0x1422832C8) + 0x2, [0x3]);
+ ssrSars7 = new Patch(0x1422832B3 + 0x3, [0x3]);
+ ssrSars8 = new Patch(0x1422832C8 + 0x2, [0x3]);
// Depth copy, for unknown use, viewport/scissor.
- ssrSars9 = new Patch(lton(0x1423C5809), [0x90, 0x90]);
- ssrSars10 = new Patch(lton(0x1423C5818), [0x90, 0x90]);
- ssrSars11 = new Patch(lton(0x1423C5824), [0x90, 0x90]);
- ssrSars12 = new Patch(lton(0x1423C5830), [0x90, 0x90]);
- ssrSars13 = new Patch(lton(0x1423C5ABC), [0x90, 0x90]);
- ssrSars14 = new Patch(lton(0x1423C5AF3), [0x90, 0x90]);
+ ssrSars9 = new Patch(0x1423C5809, [0x90, 0x90]);
+ ssrSars10 = new Patch(0x1423C5818, [0x90, 0x90]);
+ ssrSars11 = new Patch(0x1423C5824, [0x90, 0x90]);
+ ssrSars12 = new Patch(0x1423C5830, [0x90, 0x90]);
+ ssrSars13 = new Patch(0x1423C5ABC, [0x90, 0x90]);
+ ssrSars14 = new Patch(0x1423C5AF3, [0x90, 0x90]);
// RayAppendBuffer dispatch dimensions, 4 -> 3 wasteful.
- //new Patch(lton(0x14228C323) + 0x3, [0x3]);
- //new Patch(lton(0x14228C32D) + 0x2, [0x3]);
+ //new Patch(0x14228C323 + 0x3, [0x3]);
+ //new Patch(0x14228C32D + 0x2, [0x3]);
// Clear trace buffer, 8 -> 7 wasteful
- //new Patch(lton(0x14228C3F4) + 0x2, [0x7]);
+ //new Patch(0x14228C3F4 + 0x2, [0x7]);
// Approximate mip resolution.
- ssrShr7 = new Patch(lton(0x142592EBA) + 0x2, [0x3]); // 4 -> 3
- ssrShr8 = new Patch(lton(0x142592ED0) + 0x2, [0x3]);
+ ssrShr7 = new Patch(0x142592EBA + 0x2, [0x3]); // 4 -> 3
+ ssrShr8 = new Patch(0x142592ED0 + 0x2, [0x3]);
// Mips pass 1 dispatch dimensions.
- ssrSars15 = new Patch(lton(0x142283626) + 0x3, [0x03]); // 4 -> 3
- ssrSars16 = new Patch(lton(0x142283633) + 0x2, [0x03]);
+ ssrSars15 = new Patch(0x142283626 + 0x3, [0x03]); // 4 -> 3
+ ssrSars16 = new Patch(0x142283633 + 0x2, [0x03]);
// Mips pass 2 iRegion parameter.
- ssrSars17 = new Patch(lton(0x142283667) + 0x2, [0x03]);
- ssrSars18 = new Patch(lton(0x14228366A) + 0x3, [0x03]);
- ssrSars19 = new Patch(lton(0x14228366E) + 0x3, [0x03]);
- ssrSars20 = new Patch(lton(0x142283672) + 0x3, [0x03]);
+ ssrSars17 = new Patch(0x142283667 + 0x2, [0x03]);
+ ssrSars18 = new Patch(0x14228366A + 0x3, [0x03]);
+ ssrSars19 = new Patch(0x14228366E + 0x3, [0x03]);
+ ssrSars20 = new Patch(0x142283672 + 0x3, [0x03]);
// Mips pass 2 dispatch dimensions.
- ssrSars21 = new Patch(lton(0x1422838E7) + 0x3, [0x03]);
- ssrSars22 = new Patch(lton(0x1422838FC) + 0x2, [0x03]);
+ ssrSars21 = new Patch(0x1422838E7 + 0x3, [0x03]);
+ ssrSars22 = new Patch(0x1422838FC + 0x2, [0x03]);
// Mips blur dispatch dimensions.
- ssrSars23 = new Patch(lton(0x1422839B0), [0x8D, 0x0E, 0x44, 0x8D, 0x76, 0x01, 0x90]);
+ ssrSars23 = new Patch(0x1422839B0, [0x8D, 0x0E, 0x44, 0x8D, 0x76, 0x01, 0x90]);
// Resolve pass, 4 -> 3 wasteful.
- //new Patch(lton(0x14228686D) + 0x3, [0x3]);
- //new Patch(lton(0x142286877) + 0x2, [0x3]);
+ //new Patch(0x14228686D + 0x3, [0x3]);
+ //new Patch(0x142286877 + 0x2, [0x3]);
- forceSSLRTemporalReset = new Patch(lton(0x14228CE53), [0xB9, 0x01, 0x00, 0x00, 0x00, 0x90, 0x90]);
+ forceSSLRTemporalReset = new Patch(0x14228CE53, [0xB9, 0x01, 0x00, 0x00, 0x00, 0x90, 0x90]);
return new PluginData();
}
@@ -2719,7 +2815,7 @@ namespace WorldTuningTool
disableLightsFeature = config.DisableLightsFeature;
if (!disableLightsFeature)
{
- lights.Initialize();
+ Lights.Initialize();
}
PatchConfig patches = config.Patches;
#if SHADER_FEATURES
@@ -2760,6 +2856,9 @@ namespace WorldTuningTool
ssrSars22.Enable();
ssrSars23.Enable();
}
+ volumeUpsampleNoLinear = patches.VolumeUpsampleNoLinear;
+ fxaaMaxQuality = patches.FXAAMaxQualityPreset;
+ skinAllowNegativeWet = patches.SkinAllowNegativeWetness;
#endif
fullResVolumeBlur = patches.FullResolutionVolumeBlur;
if (fullResVolumeBlur)
@@ -2776,6 +2875,11 @@ namespace WorldTuningTool
{
disableLODLimitsEnable();
}
+ charaCreatorFace = patches.CharacterCreatorFaceRendering;
+ if (charaCreatorFace)
+ {
+ defaultCharaCreatorParam.Enable();
+ }
largerFoliageSwayRange = patches.LargerFoliageSwayRange;
if (largerFoliageSwayRange)
{
@@ -2797,6 +2901,8 @@ namespace WorldTuningTool
sQuest = SingletonManager.GetSingleton("sQuest")!;
sLightLinker = SingletonManager.GetSingleton("sLightLinker")!;
sLightProbes = SingletonManager.GetSingleton("sLightProbes")!;
+ sVolumeRenderer = SingletonManager.GetSingleton("sVolumeRenderer")!;
+ sMhSpeedTree = SingletonManager.GetSingleton("sMhSpeedTree")!;
foreach (Parameter param in sLightProbesParameters)
{
param.Update(sLightProbes!.Instance);
@@ -2877,7 +2983,7 @@ namespace WorldTuningTool
if (!disableLightsFeature)
{
- lights.OnUpdate();
+ Lights.OnUpdate();
}
}
@@ -2937,6 +3043,19 @@ namespace WorldTuningTool
param.Update(sMhRender!.Instance);
}
+ foreach (Parameter param in exposureParameters)
+ {
+ param.Update(sMhScene!.Instance);
+ }
+
+ if (renderPassesObject != 0x0)
+ {
+ foreach (Parameter param in renderPassesParameters)
+ {
+ param.Update(renderPassesObject);
+ }
+ }
+
if (bloomObject != 0x0)
{
foreach (Parameter param in bloomParameters)
@@ -2987,11 +3106,16 @@ namespace WorldTuningTool
param.Update(sLightProbes!.Instance);
}
- if (lightingObject != 0x0)
+ foreach (Parameter param in sVolumeRendererParameters)
{
- foreach (Parameter param in lightingParameters)
+ param.Update(sVolumeRenderer!.Instance);
+ }
+
+ if (toneMapObject != 0x0)
+ {
+ foreach (Parameter param in toneMapParameters)
{
- param.Update(lightingObject);
+ param.Update(toneMapObject);
}
}
@@ -3027,9 +3151,14 @@ namespace WorldTuningTool
}
}
+ foreach (Parameter param in speedTreeParameters)
+ {
+ param.Update(sMhSpeedTree!.Instance);
+ }
+
if (!disableLightsFeature)
{
- lights.PostUpdateLightLinker();
+ Lights.PostUpdateLightLinker();
}
}
@@ -3066,40 +3195,64 @@ namespace WorldTuningTool
}
}
- private void UpdateLightingParamsHook(nint stackOffset, nint lightingObjectInternal)
+ private void UpdateToneMapParamsHook(nint stackOffset, nint toneMapObjectInternal)
+ {
+ updateToneMapParams!.Original(stackOffset, toneMapObjectInternal);
+ if (toneMapObject == toneMapObjectInternal)
+ {
+ foreach (Parameter param in toneMapParameters)
+ {
+ param.Update(toneMapObject, true);
+ }
+ }
+ }
+
+ private nint CreateToneMapObjectHook()
+ {
+ toneMapObject = createToneMapObject!.Original();
+ foreach (Parameter param in toneMapParameters)
+ {
+ param.Update(toneMapObject);
+ }
+ return toneMapObject;
+ }
+
+ private nint DestroyToneMapObjectHook(nint toneMapObjectInternal, int unknownInt)
{
- updateLightingParams!.Original(stackOffset, lightingObjectInternal);
- if (lightingObject == lightingObjectInternal)
+ Assert(unknownInt == 1);
+ if (toneMapObject == toneMapObjectInternal)
{
- foreach (Parameter param in lightingParameters)
+ toneMapObject = 0x0;
+ foreach (Parameter param in toneMapParameters)
{
- param.Update(lightingObject, true);
+ param.Update(toneMapObject);
}
}
+ return destroyToneMapObject!.Original(toneMapObjectInternal, unknownInt);
}
- private nint CreateLightingObjectHook()
+ private nint CreateRenderPassesObjectHook(nint unknownPtr1, nint unknownPtr2)
{
- lightingObject = createLightingObject!.Original();
- foreach (Parameter param in lightingParameters)
+ renderPassesObject = createRenderPassesObject!.Original(unknownPtr1, unknownPtr2);
+ foreach (Parameter param in renderPassesParameters)
{
- param.Update(lightingObject);
+ param.Update(renderPassesObject);
}
- return lightingObject;
+ return renderPassesObject;
}
- private nint DestroyLightingObjectHook(nint lightingObjectInternal, int unknownInt)
+ private nint DestroyRenderPassesObjectHook(nint renderPassesObjectInternal, int unknownInt)
{
Assert(unknownInt == 1);
- if (lightingObject == lightingObjectInternal)
+ if (renderPassesObject == renderPassesObjectInternal)
{
- lightingObject = 0x0;
- foreach (Parameter param in lightingParameters)
+ renderPassesObject = 0x0;
+ foreach (Parameter param in renderPassesParameters)
{
- param.Update(lightingObject);
+ param.Update(renderPassesObject);
}
}
- return destroyLightingObject!.Original(lightingObjectInternal, unknownInt);
+ return destroyRenderPassesObject!.Original(renderPassesObjectInternal, unknownInt);
}
private nint CreateBloomObjectHook()
@@ -3388,30 +3541,46 @@ namespace WorldTuningTool
return destroyTAAObject!.Original(taaObjectInternal, unknownInt);
}
- private void UpdateShadowParamsHook(nint shadowParams, nint stackOffset)
+ private void UpdatePrimaryLightParamsHook(nint primaryLightParams, nint stackOffset)
{
bool isPrimary = MemoryUtil.Read<byte>(stackOffset + 0x1D) == 0x1;
if (isPrimary)
{
- foreach (Parameter param in shadowParameters2)
+ foreach (Parameter param in primaryLightParameters)
+ {
+ param.Update(stackOffset, true);
+ }
+ foreach (Parameter param in primaryShadowParameters)
+ {
+ param.Update(stackOffset, true);
+ }
+ foreach (Parameter param in primaryBroadAreaParameters)
{
param.Update(stackOffset, true);
}
}
- updateShadowParams!.Original(shadowParams, stackOffset);
+ updatePrimaryLightParams!.Original(primaryLightParams, stackOffset);
}
- private void StaticShadowParamsHook(nint shadowParamsStatic, nint shadowObjectInternal)
+ private void StaticPrimaryLightParamsHook(nint primaryLightParamsStatic, nint primaryLightObjectInternal)
{
- if (shadowObjectInternal == 0x0)
+ if (primaryLightObjectInternal == 0x0)
{
// Necessary to apply Broad Area Depth Bias overrides on first update.
- foreach (Parameter param in shadowParameters2)
+ foreach (Parameter param in primaryLightParameters)
{
- param.Update(shadowParamsStatic, true);
+ param.Update(primaryLightParamsStatic, true);
+ }
+ foreach (Parameter param in primaryShadowParameters)
+ {
+ param.Update(primaryLightParamsStatic, true);
+ }
+ foreach (Parameter param in primaryBroadAreaParameters)
+ {
+ param.Update(primaryLightParamsStatic, true);
}
}
- staticShadowParams!.Original(shadowParamsStatic, shadowObjectInternal);
+ staticPrimaryLightParams!.Original(primaryLightParamsStatic, primaryLightObjectInternal);
}
private void HandleSetChange(string prevSet, List<Override> globalOverrides, List<Override>? stageOverrides)
@@ -3586,6 +3755,7 @@ namespace WorldTuningTool
{
boxColor = ImGui.GetStyle().Colors[(int)ImGuiCol.Button];
}
+ boxColor.W = ImGui.GetStyle().Alpha;
ImDrawListPtr drawList = ImGui.GetWindowDrawList();
drawList.AddRectFilled(windowPos, windowPos + new Vector2(boxWidth, boxHeight), (uint)ColorVectorToInt(boxColor));
}
@@ -3980,7 +4150,11 @@ namespace WorldTuningTool
ImGui.Text("External:");
foreach (Override ovE in externalOverrides.Values)
{
- ovE.Draw(false, null, null, null, false, width);
+ Vector2 cursorPos = default;
+ float boxHeight = 0.0f, boxWidth = 0.0f;
+ prepareStatusBox(ref cursorPos, ref boxHeight, ref boxWidth);
+ bool hasStatus = ovE.Draw(false, null, null, null, false, width);
+ drawStatusBox(false, hasStatus, cursorPos, boxHeight, boxWidth);
}
ImGui.PopID();
@@ -3991,7 +4165,9 @@ namespace WorldTuningTool
PatchConfig patches = config.Patches;
#if SHADER_FEATURES
- if (ImGui.Checkbox("Full Resolution Screen Space Reflections (Requires Restart)", ref fullResSSLR))
+ ImGui.Text("Shader (Requires Restart):");
+ ImGui.Separator();
+ if (ImGui.Checkbox("Full Resolution Screen Space Reflections", ref fullResSSLR))
{
patches.FullResolutionSSLR = fullResSSLR;
config.Patches = patches;
@@ -3999,11 +4175,49 @@ namespace WorldTuningTool
}
if (ImGui.BeginItemTooltip())
{
- ImGui.Text("Restart Required");
+ ImGui.Text("Very complex patch, please report any issues you notice.\nThis also appears to scale SSLR Eliminate Depth, it's suggested to half it's value when this is enabled.");
+ ImGui.EndTooltip();
+ }
+
+ if (ImGui.Checkbox("Volume Rendering No Linear Sampling", ref volumeUpsampleNoLinear))
+ {
+ patches.VolumeUpsampleNoLinear = volumeUpsampleNoLinear;
+ config.Patches = patches;
+ saveConfig(config);
+ }
+ if (ImGui.BeginItemTooltip())
+ {
+ ImGui.Text("Fix for black square artifacts on object edges.");
+ ImGui.EndTooltip();
+ }
+
+ if (ImGui.Checkbox("FXAA Max Quality Preset", ref fxaaMaxQuality))
+ {
+ patches.FXAAMaxQualityPreset = fxaaMaxQuality;
+ config.Patches = patches;
+ saveConfig(config);
+ }
+ if (ImGui.BeginItemTooltip())
+ {
+ ImGui.Text("#define FXAA_QUALITY__PRESET 39");
+ ImGui.EndTooltip();
+ }
+
+ if (ImGui.Checkbox("Skin Allow Negative Wetness", ref skinAllowNegativeWet))
+ {
+ patches.SkinAllowNegativeWetness = skinAllowNegativeWet;
+ config.Patches = patches;
+ saveConfig(config);
+ }
+ if (ImGui.BeginItemTooltip())
+ {
+ ImGui.Text("Can be used to reverse the effect of wet by default modded armor.");
ImGui.EndTooltip();
}
#endif
+ ImGui.Text("General:");
+ ImGui.Separator();
if (ImGui.Checkbox("Volume Rendering Full Resolution Blur Pass (Requires Area Change)", ref fullResVolumeBlur))
{
if (fullResVolumeBlur)
@@ -4064,6 +4278,21 @@ namespace WorldTuningTool
ImGui.EndTooltip();
}
+ if (ImGui.Checkbox("Character Creator Face Rendering", ref charaCreatorFace))
+ {
+ if (charaCreatorFace)
+ {
+ defaultCharaCreatorParam.Enable();
+ }
+ else
+ {
+ defaultCharaCreatorParam.Disable();
+ }
+ patches.CharacterCreatorFaceRendering = charaCreatorFace;
+ config.Patches = patches;
+ saveConfig(config);
+ }
+
if (ImGui.Checkbox("Larger Foliage Sway Range", ref largerFoliageSwayRange))
{
if (largerFoliageSwayRange)
@@ -4103,13 +4332,32 @@ namespace WorldTuningTool
ImGui.Text("Ignore the frame skip set on an animal's animation when are far from the camera.");
ImGui.EndTooltip();
}
+
+ if (ImGui.Checkbox("Override View Mode LODs", ref viewModeLodOverride))
+ {
+ if (viewModeLodOverride)
+ {
+ viewModeAddressLod1.Enable();
+ viewModeAddressLod2.Enable();
+ }
+ else
+ {
+ viewModeAddressLod1.Disable();
+ viewModeAddressLod2.Disable();
+ }
+ }
+ if (ImGui.BeginItemTooltip())
+ {
+ ImGui.Text("View Mode still won't consider LOD Length/Pixel Size Bias.");
+ ImGui.EndTooltip();
+ }
}
if (!disableLightsFeature)
{
if (ImGui.CollapsingHeader("Lights"))
{
- lights.DrawUI(width);
+ Lights.DrawUI(width);
}
}
@@ -4145,7 +4393,7 @@ namespace WorldTuningTool
ImGui.PopID();
ImGui.PushID("LOD");
- if (ImGui.CollapsingHeader("Level of Detail"))
+ if (ImGui.CollapsingHeader("LODs"))
{
ImGui.Text($"Address: 0x{sMhScene!.Instance:X}");
foreach (Parameter param in lodParameters)
@@ -4159,52 +4407,49 @@ namespace WorldTuningTool
}
ImGui.PopID();
- // MonsterHunterWorld.exe+1AB99E0 - mov rax,[MonsterHunterWorld.exe+500E180]
- nint shadowAddr = MemoryUtil.Read<nint>(0x14500E180);
- nint shadowObject = MemoryUtil.Read<nint>(shadowAddr + 0x4B0);
- shadowAddr += 0x5B0;
+ ImGui.PushID("Passthrough");
+ if (ImGui.CollapsingHeader("Passthrough"))
+ {
+ ImGui.Text($"Address: 0x{sMhScene!.Instance:X}");
+ foreach (Parameter param in passthroughParameters)
+ {
+ param.Draw(width);
+ }
+ }
+ ImGui.PopID();
+
ImGui.PushID("Shadows");
- if (ImGui.CollapsingHeader("Sunlight and Shadows"))
+ if (ImGui.CollapsingHeader("Shadows"))
{
shadowResParameter.Draw(width);
ImGui.Separator();
- ImGui.Text($"shadowAddr: 0x{shadowAddr:X}, shadowObject: 0x{shadowObject:X}");
- /*
- if (ImGui.CollapsingHeader("Pass 1"))
+ ImGui.Text($"Address: 0x{sMhScene!.Instance:X}");
+ foreach (Parameter param in shadowCascadeParameters)
{
- ImGui.PushID("Pass1");
- foreach (Parameter param in shadowParameters1)
- {
- param.Draw(width);
- }
- ImGui.PopID();
+ param.Draw(width);
}
- if (ImGui.CollapsingHeader("Pass 2"))
+ foreach (Parameter param in primaryShadowParameters)
{
- ImGui.PushID("Pass2");
- */
- foreach (Parameter param in shadowParameters2)
- {
- param.Draw(width);
- }
- /*
- ImGui.PopID();
+ param.Draw(width);
}
- */
- ImGui.Separator();
- ImGui.Text($"Address: 0x{sMhScene!.Instance:X}");
- foreach (Parameter param in shadowCascadeParameters)
+ foreach (Parameter param in broadAreaShadowParameters)
+ {
+ param.Draw(width);
+ }
+ foreach (Parameter param in primaryBroadAreaParameters)
{
param.Draw(width);
}
}
ImGui.PopID();
- ImGui.PushID("BroadAreaShadows");
- if (ImGui.CollapsingHeader("Broad Area Shadows"))
+ ImGui.PushID("PrimaryLight");
+ if (ImGui.CollapsingHeader("Primary Light"))
{
- ImGui.Text($"Address: 0x{sMhScene!.Instance:X}");
- foreach (Parameter param in broadAreaShadowParameters)
+ // MonsterHunterWorld.exe+1AB99E0 - mov rax,[MonsterHunterWorld.exe+500E180]
+ nint primaryLightObject = MemoryUtil.Read<nint>(MemoryUtil.Read<nint>(0x14500E180) + 0x4B0);
+ ImGui.Text($"Address: 0x{primaryLightObject:X}");
+ foreach (Parameter param in primaryLightParameters)
{
param.Draw(width);
}
@@ -4238,7 +4483,7 @@ namespace WorldTuningTool
ImGui.PopID();
ImGui.PushID("SSAO");
- if (ImGui.CollapsingHeader("Ambient Occlusion"))
+ if (ImGui.CollapsingHeader("SSAO"))
{
ImGui.Text($"Address: 0x{sMhScene!.Instance:X}");
foreach (Parameter param in ssaoParameters)
@@ -4248,22 +4493,11 @@ namespace WorldTuningTool
}
ImGui.PopID();
- ImGui.PushID("SSLR");
- if (ImGui.CollapsingHeader("Reflections"))
- {
- ImGui.Text($"Address: 0x{sMhScene!.Instance:X}");
- foreach (Parameter param in sslrParameters)
- {
- param.Draw(width);
- }
- }
- ImGui.PopID();
-
- ImGui.PushID("Passthrough");
- if (ImGui.CollapsingHeader("Passthrough"))
+ ImGui.PushID("VolumeRenderer");
+ if (ImGui.CollapsingHeader("Volume Renderer"))
{
- ImGui.Text($"Address: 0x{sMhScene!.Instance:X}");
- foreach (Parameter param in passthroughParameters)
+ ImGui.Text($"Address: 0x{sVolumeRenderer!.Instance:X}");
+ foreach (Parameter param in sVolumeRendererParameters)
{
param.Draw(width);
}
@@ -4273,30 +4507,40 @@ namespace WorldTuningTool
ImGui.PushID("Lighting");
if (ImGui.CollapsingHeader("Lighting"))
{
- ImGui.Text($"Address: 0x{lightingObject:X}");
- if (lightingObject != 0x0)
+ ImGui.Text($"Address: 0x{toneMapObject:X}");
+ if (toneMapObject != 0x0)
{
if (ImGui.CollapsingHeader("LUTs"))
{
- nint lutBlendTexture = MemoryUtil.Read<nint>(lightingObject + 0x1C0);
+ nint lutBlendTexture = MemoryUtil.Read<nint>(toneMapObject + 0x1C0);
ImGui.Text($"LUT Blend: 0x{lutBlendTexture:X}");
- nint lutMap0 = MemoryUtil.Read<nint>(lightingObject + 0x1A8);
+ nint lutMap0 = MemoryUtil.Read<nint>(toneMapObject + 0x1A8);
if (lutMap0 != 0x0)
{
- luts.DrawUI(lutMap0, lightingObject, 0, width);
+ WorldLUTs.DrawUI(lutMap0, toneMapObject, 0, width);
}
- nint lutMap1 = MemoryUtil.Read<nint>(lightingObject + 0x1B0);
+ nint lutMap1 = MemoryUtil.Read<nint>(toneMapObject + 0x1B0);
if (lutMap1 != 0x0)
{
- luts.DrawUI(lutMap1, lightingObject, 1, width);
+ WorldLUTs.DrawUI(lutMap1, toneMapObject, 1, width);
}
}
- foreach (Parameter param in lightingParameters)
+ foreach (Parameter param in toneMapParameters)
{
param.Draw(width);
}
}
ImGui.Separator();
+ ImGui.Text($"Address: 0x{sMhScene!.Instance:X}");
+ foreach (Parameter param in exposureParameters)
+ {
+ param.Draw(width);
+ }
+ if (ImGui.Button("Reset"))
+ {
+ new NativeAction<nint>(0x142285F50).Invoke(sMhScene!.Instance);
+ }
+ ImGui.Separator();
ImGui.Text($"Address: 0x{sMhRender!.Instance:X}");
foreach (Parameter param in brightnessParameters)
{
@@ -4305,6 +4549,33 @@ namespace WorldTuningTool
}
ImGui.PopID();
+ ImGui.PushID("SSLR");
+ if (ImGui.CollapsingHeader("SSLR"))
+ {
+ ImGui.Text($"Address: 0x{sMhScene!.Instance:X}");
+ foreach (Parameter param in sslrParameters)
+ {
+ param.Draw(width);
+ }
+ }
+ ImGui.PopID();
+
+ /*
+ ImGui.PushID("Render Passes");
+ if (ImGui.CollapsingHeader("Render Passes"))
+ {
+ ImGui.Text($"Address: 0x{renderPassesObject:X}");
+ if (renderPassesObject != 0x0)
+ {
+ foreach (Parameter param in renderPassesParameters)
+ {
+ param.Draw(width);
+ }
+ }
+ }
+ ImGui.PopID();
+ */
+
ImGui.PushID("Bloom");
if (ImGui.CollapsingHeader("Bloom"))
{
@@ -4389,6 +4660,17 @@ namespace WorldTuningTool
}
ImGui.PopID();
+ ImGui.PushID("SpeedTree");
+ if (ImGui.CollapsingHeader("SpeedTree"))
+ {
+ ImGui.Text($"Address: 0x{sMhSpeedTree!.Instance:X}");
+ foreach (Parameter param in speedTreeParameters)
+ {
+ param.Draw(width);
+ }
+ }
+ ImGui.PopID();
+
ImGui.PushID("WaterWave");
if (ImGui.CollapsingHeader("Water Waves"))
{
@@ -4491,6 +4773,25 @@ namespace WorldTuningTool
ImGui.EndTooltip();
}
+ if (ImGui.Checkbox("Disable Reduced Rate Animations 2", ref disableReducedRateAnimations2))
+ {
+ if (disableReducedRateAnimations2)
+ {
+ zeroFrameSkip2.Enable();
+ zeroFrameSkip3.Enable();
+ }
+ else
+ {
+ zeroFrameSkip2.Disable();
+ zeroFrameSkip3.Disable();
+ }
+ }
+ if (ImGui.BeginItemTooltip())
+ {
+ ImGui.Text("Unlikely to do anything. If you find an instance were a frame skip is set here, please report.\nThis may be included by the first patch in the future.");
+ ImGui.EndTooltip();
+ }
+
ImGui.Separator();
}
@@ -4512,8 +4813,13 @@ namespace WorldTuningTool
}
#if SHADER_FEATURES
- private static bool replaceShaderFromFile(ShaderInfo *info, string path)
+ private static bool replaceShaderFromFile(ShaderInfo *info, string path, ShaderSourceType type)
{
+ //if (info->Replacement.Source != null)
+ //{
+ // Log.Warn("Shader already replaced");
+ // return false;
+ //}
if (!System.IO.File.Exists(path))
{
Log.Warn($"File not found: {path}.");
@@ -4529,8 +4835,7 @@ namespace WorldTuningTool
Log.Error($"Failed to read: {path}.");
return false;
}
- info->Replacement.Length = shaderData.Length;
- info->Replacement.Source = (byte *)Marshal.UnsafeAddrOfPinnedArrayElement<byte>(shaderData, 0);
+ info->Replacement.Set(shaderData, type);
return true;
}
@@ -4539,141 +4844,55 @@ namespace WorldTuningTool
public unsafe void OnCreateShader(ShaderInfo *info)
{
string hash = new string(info->DxbcHash);
- if (hash == "0c3dacbd-32c175d5-10d80d04-cce7e689")
- {
- if (replaceShaderFromFile(info, $"{shaderPath}/alpha_as_luma.hlsl"))
- {
- info->Replacement.Type = ShaderSourceType.HLSL;
- Log.Info("Alpha as luma shader replaced.");
- }
- }
- else if (hash == "9ff245fb-4fd555e0-04d0ef15-84609fe1")
- {
- if (replaceShaderFromFile(info, $"{shaderPath}/fxaa_max_quality.hlsl"))
- {
- info->Replacement.Type = ShaderSourceType.HLSL;
- Log.Info("FXAA shader replaced.");
- }
- }
- else if (!shadersLoadedOnce && hash == "2e4e18fd-6ea5eeae-2de3d65c-26ab36dd")
- {
- if (replaceShaderFromFile(info, $"{shaderPath}/volume_upsample1.shdr"))
- {
- info->Replacement.Type = ShaderSourceType.Binary;
- Log.Info("Volume upsample shader 1 replaced.");
- }
- }
- else if (!shadersLoadedOnce && hash == "e2c8c13e-45bc99b2-4c3d7699-3d66188e")
- {
- if (replaceShaderFromFile(info, $"{shaderPath}/volume_upsample2.shdr"))
- {
- info->Replacement.Type = ShaderSourceType.Binary;
- Log.Info("Volume upsample shader 2 replaced.");
- }
- // This allows us to A/B using the volume rendering value 2 switch.
- //shadersLoadedOnce = true;
- }
- /*
- else if (hash == "8cf2a107-ecde214b-9939b350-7b2af1a7")
- {
- if (replaceShaderFromFile(info, $"{shaderPath}/cube_only.shdr"))
- {
- info->Replacement.Type = ShaderSourceType.Binary;
- Log.Info("Cube Only shader replaced.");
- }
- }
- */
- else if (hash == "2eed1f00-e24d1b19-9d521064-17b9a586")
- {
- if (replaceShaderFromFile(info, $"{shaderPath}/body_skin.shdr"))
- {
- info->Replacement.Type = ShaderSourceType.Binary;
- Log.Info("Body skin shader replaced.");
- }
- }
- else if (hash == "8e5e3c09-ebe77ee4-ba1cb659-d25bc7bf")
- {
- if (replaceShaderFromFile(info, $"{shaderPath}/face.shdr"))
- {
- info->Replacement.Type = ShaderSourceType.Binary;
- Log.Info("Face shader replaced.");
- }
- }
- /*
- else if (hash == "18a797dc-9458d333-59e6dff0-9790fcea")
- {
- if (replaceShaderFromFile(info, $"{shaderPath}/sssss.shdr"))
- {
- info->Replacement.Type = ShaderSourceType.Binary;
- Log.Info("SSSSS shader replaced.");
- }
- }
- */
- /*
- else if (hash == "ca33bab6-2119df84-41786a69-404471cd")
- {
- if (replaceShaderFromFile(info, $"{shaderPath}/color_grading.shdr"))
- {
- info->Replacement.Type = ShaderSourceType.Binary;
- Log.Info("Color grading shader replaced.");
- }
- }
- */
+
if (fullResSSLR)
{
if (hash == "4b722c0e-8e787cd5-5eaf5e6c-09782f91")
{
- if (replaceShaderFromFile(info, $"{shaderPath}/sslr_depth_mips.shdr"))
+ if (replaceShaderFromFile(info, $"{shaderPath}/sslr_depth_mips.shdr", ShaderSourceType.Binary))
{
- info->Replacement.Type = ShaderSourceType.Binary;
Log.Info("SSLR depth mips shader replaced.");
}
}
else if (hash == "5abc7a51-f182e7d6-14d2f897-6f851c0b")
{
- if (replaceShaderFromFile(info, $"{shaderPath}/sslr_trace.shdr"))
+ if (replaceShaderFromFile(info, $"{shaderPath}/sslr_trace.shdr", ShaderSourceType.Binary))
{
- info->Replacement.Type = ShaderSourceType.Binary;
Log.Info("SSLR trace shader replaced.");
}
}
else if (hash == "d7e47ffe-82572c64-795c4698-341e5b91")
{
- if (replaceShaderFromFile(info, $"{shaderPath}/sslr_mips.shdr"))
+ if (replaceShaderFromFile(info, $"{shaderPath}/sslr_mips.shdr", ShaderSourceType.Binary))
{
- info->Replacement.Type = ShaderSourceType.Binary;
Log.Info("SSLR mips shader replaced.");
}
}
else if (hash == "b21dd223-98ab56ae-918264e6-eb6e8ee4")
{
- if (replaceShaderFromFile(info, $"{shaderPath}/sslr_resolve.shdr"))
+ if (replaceShaderFromFile(info, $"{shaderPath}/sslr_resolve.shdr", ShaderSourceType.Binary))
{
- info->Replacement.Type = ShaderSourceType.Binary;
Log.Info("SSLR resolve shader replaced.");
}
}
else if (hash == "8703f55f-6c22fba7-1ef876f1-4767379e")
{
- if (replaceShaderFromFile(info, $"{shaderPath}/sslr_resolve_no_jitter.shdr"))
+ if (replaceShaderFromFile(info, $"{shaderPath}/sslr_resolve_no_jitter.shdr", ShaderSourceType.Binary))
{
- info->Replacement.Type = ShaderSourceType.Binary;
Log.Info("SSLR resolve no jitter shader replaced.");
}
}
else if (hash == "a9372f22-05154267-13f583e1-b08ffd75")
{
- if (replaceShaderFromFile(info, $"{shaderPath}/sslr_resolve_no_dither.shdr"))
+ if (replaceShaderFromFile(info, $"{shaderPath}/sslr_resolve_no_dither.shdr", ShaderSourceType.Binary))
{
- info->Replacement.Type = ShaderSourceType.Binary;
Log.Info("SSLR resolve no dither shader replaced.");
}
}
else if (hash == "77e20ce4-0538a5f1-908ba0a3-55821b0f")
{
- if (replaceShaderFromFile(info, $"{shaderPath}/sslr_resolve_no_jitter_no_dither.shdr"))
+ if (replaceShaderFromFile(info, $"{shaderPath}/sslr_resolve_no_jitter_no_dither.shdr", ShaderSourceType.Binary))
{
- info->Replacement.Type = ShaderSourceType.Binary;
Log.Info("SSLR resolve no jitter or dither shader replaced.");
}
}
@@ -4682,13 +4901,97 @@ namespace WorldTuningTool
{
if (hash == "8703f55f-6c22fba7-1ef876f1-4767379e")
{
- if (replaceShaderFromFile(info, $"{shaderPath}/sslr_resolve_no_jitter_min_only.shdr"))
+ if (replaceShaderFromFile(info, $"{shaderPath}/sslr_resolve_no_jitter_min_only.shdr", ShaderSourceType.Binary))
{
- info->Replacement.Type = ShaderSourceType.Binary;
Log.Info("SSLR resolve no jitter shader replaced.");
}
}
}
+
+ if (volumeUpsampleNoLinear)
+ {
+ if (!shadersLoadedOnce && hash == "2e4e18fd-6ea5eeae-2de3d65c-26ab36dd")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/volume_upsample1.shdr", ShaderSourceType.Binary))
+ {
+ Log.Info("Volume upsample shader 1 replaced.");
+ }
+ }
+ else if (!shadersLoadedOnce && hash == "e2c8c13e-45bc99b2-4c3d7699-3d66188e")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/volume_upsample2.shdr", ShaderSourceType.Binary))
+ {
+ Log.Info("Volume upsample shader 2 replaced.");
+ }
+ // This allows us to A/B using the volume rendering value 2 switch.
+ //shadersLoadedOnce = true;
+ }
+ }
+
+ if (fxaaMaxQuality)
+ {
+ if (hash == "9ff245fb-4fd555e0-04d0ef15-84609fe1")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/fxaa_max_quality.hlsl", ShaderSourceType.HLSL))
+ {
+ Log.Info("FXAA shader replaced.");
+ }
+ }
+ }
+
+ if (skinAllowNegativeWet)
+ {
+ if (hash == "2eed1f00-e24d1b19-9d521064-17b9a586")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/body_skin.shdr", ShaderSourceType.Binary))
+ {
+ Log.Info("Body skin shader replaced.");
+ }
+ }
+ else if (hash == "8e5e3c09-ebe77ee4-ba1cb659-d25bc7bf")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/face.shdr", ShaderSourceType.Binary))
+ {
+ Log.Info("Face shader replaced.");
+ }
+ }
+ }
+
+ if (hash == "ca33bab6-2119df84-41786a69-404471cd")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/color_grading_ex_tonemappers.shdr", ShaderSourceType.Binary))
+ {
+ Log.Info("Color grading shader replaced.");
+ }
+ }
+
+ /*
+ if (hash == "0c3dacbd-32c175d5-10d80d04-cce7e689")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/alpha_as_luma.hlsl", ShaderSourceType.HLSL))
+ {
+ Log.Info("Alpha as luma shader replaced.");
+ }
+ }
+ */
+ /*
+ else if (hash == "8cf2a107-ecde214b-9939b350-7b2af1a7")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/cube_only.shdr", ShaderSourceType.Binary))
+ {
+ Log.Info("Cube Only shader replaced.");
+ }
+ }
+ */
+ /*
+ else if (hash == "18a797dc-9458d333-59e6dff0-9790fcea")
+ {
+ if (replaceShaderFromFile(info, $"{shaderPath}/sssss.shdr", ShaderSourceType.Binary))
+ {
+ Log.Info("SSSSS shader replaced.");
+ }
+ }
+ */
}
#endif
}