CS-ify ShaderReplacementFixer and ModelRenderer

This commit is contained in:
Exter-N 2024-03-20 20:02:09 +01:00 committed by Ottermandias
parent 384b8fd489
commit 739b5b5ad6
2 changed files with 14 additions and 31 deletions

View file

@ -1,35 +1,26 @@
using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle;
using Penumbra.GameData;
namespace Penumbra.Interop.Services;
// TODO ClientStructs-ify (https://github.com/aers/FFXIVClientStructs/pull/817)
public unsafe class ModelRenderer : IDisposable
{
// Will be Manager.Instance()->ModelRenderer.CharacterGlassShaderPackage in CS
private const nint ModelRendererOffset = 0x13660;
private const nint CharacterGlassShaderPackageOffset = 0xD0;
/// <summary> A static pointer to the Render::Manager address. </summary>
[Signature(Sigs.RenderManager, ScanType = ScanType.StaticAddress)]
private readonly nint* _renderManagerAddress = null;
public bool Ready { get; private set; }
public ShaderPackageResourceHandle** CharacterGlassShaderPackage
=> *_renderManagerAddress == 0
? null
: (ShaderPackageResourceHandle**)(*_renderManagerAddress + ModelRendererOffset + CharacterGlassShaderPackageOffset).ToPointer();
=> Manager.Instance() switch
{
null => null,
var renderManager => &renderManager->ModelRenderer.CharacterGlassShaderPackage,
};
public ShaderPackageResourceHandle* DefaultCharacterGlassShaderPackage { get; private set; }
private readonly IFramework _framework;
public ModelRenderer(IFramework framework, IGameInteropProvider interop)
public ModelRenderer(IFramework framework)
{
interop.InitializeFromAttributes(this);
_framework = framework;
LoadDefaultResources(null!);
if (!Ready)
@ -39,7 +30,7 @@ public unsafe class ModelRenderer : IDisposable
/// <summary> We store the default data of the resources so we can always restore them. </summary>
private void LoadDefaultResources(object _)
{
if (*_renderManagerAddress == 0)
if (Manager.Instance() == null)
return;
var anyMissing = false;

View file

@ -2,12 +2,14 @@ using Dalamud.Hooking;
using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle;
using OtterGui.Classes;
using Penumbra.Communication;
using Penumbra.GameData;
using Penumbra.Interop.Hooks.Resources;
using Penumbra.Services;
using CSModelRenderer = FFXIVClientStructs.FFXIV.Client.Graphics.Render.ModelRenderer;
namespace Penumbra.Interop.Services;
@ -22,18 +24,8 @@ public sealed unsafe class ShaderReplacementFixer : IDisposable
[Signature(Sigs.HumanVTable, ScanType = ScanType.StaticAddress)]
private readonly nint* _humanVTable = null!;
private delegate nint CharacterBaseOnRenderMaterialDelegate(nint drawObject, OnRenderMaterialParams* param);
private delegate nint ModelRendererOnRenderMaterialDelegate(nint modelRenderer, nint outFlags, nint param, Material* material, uint materialIndex);
[StructLayout(LayoutKind.Explicit)]
private struct OnRenderMaterialParams
{
[FieldOffset(0x0)]
public Model* Model;
[FieldOffset(0x8)]
public uint MaterialIndex;
}
private delegate nint CharacterBaseOnRenderMaterialDelegate(CharacterBase* drawObject, CSModelRenderer.OnRenderMaterialParams* param);
private delegate nint ModelRendererOnRenderMaterialDelegate(CSModelRenderer* modelRenderer, ushort* outFlags, CSModelRenderer.OnRenderModelParams* param, Material* material, uint materialIndex);
private readonly Hook<CharacterBaseOnRenderMaterialDelegate> _humanOnRenderMaterialHook;
@ -135,7 +127,7 @@ public sealed unsafe class ShaderReplacementFixer : IDisposable
Interlocked.Decrement(ref _moddedCharacterGlassShpkCount);
}
private nint OnRenderHumanMaterial(nint human, OnRenderMaterialParams* param)
private nint OnRenderHumanMaterial(CharacterBase* human, CSModelRenderer.OnRenderMaterialParams* param)
{
// If we don't have any on-screen instances of modded skin.shpk, we don't need the slow path at all.
if (!Enabled || _moddedSkinShpkCount == 0)
@ -167,7 +159,7 @@ public sealed unsafe class ShaderReplacementFixer : IDisposable
}
}
private nint ModelRendererOnRenderMaterialDetour(nint modelRenderer, nint outFlags, nint param, Material* material, uint materialIndex)
private nint ModelRendererOnRenderMaterialDetour(CSModelRenderer* modelRenderer, ushort* outFlags, CSModelRenderer.OnRenderModelParams* param, Material* material, uint materialIndex)
{
// If we don't have any on-screen instances of modded characterglass.shpk, we don't need the slow path at all.