mirror of
https://github.com/xivdev/Penumbra.git
synced 2026-02-23 00:07:53 +01:00
Add/improve ShaderReplacementFixer hooks
This commit is contained in:
parent
d630a3dff4
commit
fb58a9c271
10 changed files with 478 additions and 113 deletions
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue