Add/improve ShaderReplacementFixer hooks

This commit is contained in:
Exter-N 2024-08-08 23:19:18 +02:00
parent d630a3dff4
commit fb58a9c271
10 changed files with 478 additions and 113 deletions

View file

@ -28,10 +28,12 @@ public unsafe class CharacterUtility : IDisposable, IRequiredService
public bool Ready { get; private set; }
public event Action LoadingFinished;
public nint DefaultHumanPbdResource { get; private set; }
public nint DefaultTransparentResource { get; private set; }
public nint DefaultDecalResource { get; private set; }
public nint DefaultSkinShpkResource { get; private set; }
public nint DefaultHumanPbdResource { get; private set; }
public nint DefaultTransparentResource { get; private set; }
public nint DefaultDecalResource { get; private set; }
public nint DefaultSkinShpkResource { get; private set; }
public nint DefaultCharacterStockingsShpkResource { get; private set; }
public nint DefaultCharacterLegacyShpkResource { get; private set; }
/// <summary>
/// The relevant indices depend on which meta manipulations we allow for.
@ -108,6 +110,18 @@ public unsafe class CharacterUtility : IDisposable, IRequiredService
anyMissing |= DefaultSkinShpkResource == nint.Zero;
}
if (DefaultCharacterStockingsShpkResource == nint.Zero)
{
DefaultCharacterStockingsShpkResource = (nint)Address->CharacterStockingsShpkResource;
anyMissing |= DefaultCharacterStockingsShpkResource == nint.Zero;
}
if (DefaultCharacterLegacyShpkResource == nint.Zero)
{
DefaultCharacterLegacyShpkResource = (nint)Address->CharacterLegacyShpkResource;
anyMissing |= DefaultCharacterLegacyShpkResource == nint.Zero;
}
if (anyMissing)
return;
@ -122,10 +136,12 @@ public unsafe class CharacterUtility : IDisposable, IRequiredService
if (!Ready)
return;
Address->HumanPbdResource = (ResourceHandle*)DefaultHumanPbdResource;
Address->TransparentTexResource = (TextureResourceHandle*)DefaultTransparentResource;
Address->DecalTexResource = (TextureResourceHandle*)DefaultDecalResource;
Address->SkinShpkResource = (ResourceHandle*)DefaultSkinShpkResource;
Address->HumanPbdResource = (ResourceHandle*)DefaultHumanPbdResource;
Address->TransparentTexResource = (TextureResourceHandle*)DefaultTransparentResource;
Address->DecalTexResource = (TextureResourceHandle*)DefaultDecalResource;
Address->SkinShpkResource = (ResourceHandle*)DefaultSkinShpkResource;
Address->CharacterStockingsShpkResource = (ResourceHandle*)DefaultCharacterStockingsShpkResource;
Address->CharacterLegacyShpkResource = (ResourceHandle*)DefaultCharacterLegacyShpkResource;
}
public void Dispose()

View file

@ -2,6 +2,7 @@ using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle;
using OtterGui.Services;
using ModelRendererData = FFXIVClientStructs.FFXIV.Client.Graphics.Render.ModelRenderer;
namespace Penumbra.Interop.Services;
@ -9,46 +10,53 @@ public unsafe class ModelRenderer : IDisposable, IRequiredService
{
public bool Ready { get; private set; }
public ShaderPackageResourceHandle** IrisShaderPackage
public ModelRendererData* Address
=> Manager.Instance() switch
{
null => null,
var renderManager => &renderManager->ModelRenderer.IrisShaderPackage,
var renderManager => &renderManager->ModelRenderer,
};
public ShaderPackageResourceHandle** IrisShaderPackage
=> Address switch
{
null => null,
var data => &data->IrisShaderPackage,
};
public ShaderPackageResourceHandle** CharacterGlassShaderPackage
=> Manager.Instance() switch
=> Address switch
{
null => null,
var renderManager => &renderManager->ModelRenderer.CharacterGlassShaderPackage,
null => null,
var data => &data->CharacterGlassShaderPackage,
};
public ShaderPackageResourceHandle** CharacterTransparencyShaderPackage
=> Manager.Instance() switch
=> Address switch
{
null => null,
var renderManager => &renderManager->ModelRenderer.CharacterTransparencyShaderPackage,
null => null,
var data => &data->CharacterTransparencyShaderPackage,
};
public ShaderPackageResourceHandle** CharacterTattooShaderPackage
=> Manager.Instance() switch
=> Address switch
{
null => null,
var renderManager => &renderManager->ModelRenderer.CharacterTattooShaderPackage,
null => null,
var data => &data->CharacterTattooShaderPackage,
};
public ShaderPackageResourceHandle** CharacterOcclusionShaderPackage
=> Manager.Instance() switch
=> Address switch
{
null => null,
var renderManager => &renderManager->ModelRenderer.CharacterOcclusionShaderPackage,
null => null,
var data => &data->CharacterOcclusionShaderPackage,
};
public ShaderPackageResourceHandle** HairMaskShaderPackage
=> Manager.Instance() switch
=> Address switch
{
null => null,
var renderManager => &renderManager->ModelRenderer.HairMaskShaderPackage,
null => null,
var data => &data->HairMaskShaderPackage,
};
public ShaderPackageResourceHandle* DefaultIrisShaderPackage { get; private set; }
@ -96,7 +104,7 @@ public unsafe class ModelRenderer : IDisposable, IRequiredService
if (DefaultCharacterTransparencyShaderPackage == null)
{
DefaultCharacterTransparencyShaderPackage = *CharacterTransparencyShaderPackage;
anyMissing |= DefaultCharacterTransparencyShaderPackage == null;
anyMissing |= DefaultCharacterTransparencyShaderPackage == null;
}
if (DefaultCharacterTattooShaderPackage == null)