From 739b5b5ad6a7c58c0d95c90557bf44c4a342e895 Mon Sep 17 00:00:00 2001 From: Exter-N Date: Wed, 20 Mar 2024 20:02:09 +0100 Subject: [PATCH] CS-ify ShaderReplacementFixer and ModelRenderer --- Penumbra/Interop/Services/ModelRenderer.cs | 25 ++++++------------- .../Services/ShaderReplacementFixer.cs | 20 +++++---------- 2 files changed, 14 insertions(+), 31 deletions(-) diff --git a/Penumbra/Interop/Services/ModelRenderer.cs b/Penumbra/Interop/Services/ModelRenderer.cs index 6a3bf776..7df83cf7 100644 --- a/Penumbra/Interop/Services/ModelRenderer.cs +++ b/Penumbra/Interop/Services/ModelRenderer.cs @@ -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; - - /// A static pointer to the Render::Manager address. - [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 /// We store the default data of the resources so we can always restore them. private void LoadDefaultResources(object _) { - if (*_renderManagerAddress == 0) + if (Manager.Instance() == null) return; var anyMissing = false; diff --git a/Penumbra/Interop/Services/ShaderReplacementFixer.cs b/Penumbra/Interop/Services/ShaderReplacementFixer.cs index e57fe313..26906ace 100644 --- a/Penumbra/Interop/Services/ShaderReplacementFixer.cs +++ b/Penumbra/Interop/Services/ShaderReplacementFixer.cs @@ -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 _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.