mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 18:27:24 +01:00
CS-ify ShaderReplacementFixer and ModelRenderer
This commit is contained in:
parent
384b8fd489
commit
739b5b5ad6
2 changed files with 14 additions and 31 deletions
|
|
@ -1,35 +1,26 @@
|
||||||
using Dalamud.Plugin.Services;
|
using Dalamud.Plugin.Services;
|
||||||
using Dalamud.Utility.Signatures;
|
using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
|
||||||
using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle;
|
using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle;
|
||||||
using Penumbra.GameData;
|
|
||||||
|
|
||||||
namespace Penumbra.Interop.Services;
|
namespace Penumbra.Interop.Services;
|
||||||
|
|
||||||
// TODO ClientStructs-ify (https://github.com/aers/FFXIVClientStructs/pull/817)
|
|
||||||
public unsafe class ModelRenderer : IDisposable
|
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 bool Ready { get; private set; }
|
||||||
|
|
||||||
public ShaderPackageResourceHandle** CharacterGlassShaderPackage
|
public ShaderPackageResourceHandle** CharacterGlassShaderPackage
|
||||||
=> *_renderManagerAddress == 0
|
=> Manager.Instance() switch
|
||||||
? null
|
{
|
||||||
: (ShaderPackageResourceHandle**)(*_renderManagerAddress + ModelRendererOffset + CharacterGlassShaderPackageOffset).ToPointer();
|
null => null,
|
||||||
|
var renderManager => &renderManager->ModelRenderer.CharacterGlassShaderPackage,
|
||||||
|
};
|
||||||
|
|
||||||
public ShaderPackageResourceHandle* DefaultCharacterGlassShaderPackage { get; private set; }
|
public ShaderPackageResourceHandle* DefaultCharacterGlassShaderPackage { get; private set; }
|
||||||
|
|
||||||
private readonly IFramework _framework;
|
private readonly IFramework _framework;
|
||||||
|
|
||||||
public ModelRenderer(IFramework framework, IGameInteropProvider interop)
|
public ModelRenderer(IFramework framework)
|
||||||
{
|
{
|
||||||
interop.InitializeFromAttributes(this);
|
|
||||||
_framework = framework;
|
_framework = framework;
|
||||||
LoadDefaultResources(null!);
|
LoadDefaultResources(null!);
|
||||||
if (!Ready)
|
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>
|
/// <summary> We store the default data of the resources so we can always restore them. </summary>
|
||||||
private void LoadDefaultResources(object _)
|
private void LoadDefaultResources(object _)
|
||||||
{
|
{
|
||||||
if (*_renderManagerAddress == 0)
|
if (Manager.Instance() == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var anyMissing = false;
|
var anyMissing = false;
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,14 @@ using Dalamud.Hooking;
|
||||||
using Dalamud.Plugin.Services;
|
using Dalamud.Plugin.Services;
|
||||||
using Dalamud.Utility.Signatures;
|
using Dalamud.Utility.Signatures;
|
||||||
using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
|
using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
|
||||||
|
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
|
||||||
using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle;
|
using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle;
|
||||||
using OtterGui.Classes;
|
using OtterGui.Classes;
|
||||||
using Penumbra.Communication;
|
using Penumbra.Communication;
|
||||||
using Penumbra.GameData;
|
using Penumbra.GameData;
|
||||||
using Penumbra.Interop.Hooks.Resources;
|
using Penumbra.Interop.Hooks.Resources;
|
||||||
using Penumbra.Services;
|
using Penumbra.Services;
|
||||||
|
using CSModelRenderer = FFXIVClientStructs.FFXIV.Client.Graphics.Render.ModelRenderer;
|
||||||
|
|
||||||
namespace Penumbra.Interop.Services;
|
namespace Penumbra.Interop.Services;
|
||||||
|
|
||||||
|
|
@ -22,18 +24,8 @@ public sealed unsafe class ShaderReplacementFixer : IDisposable
|
||||||
[Signature(Sigs.HumanVTable, ScanType = ScanType.StaticAddress)]
|
[Signature(Sigs.HumanVTable, ScanType = ScanType.StaticAddress)]
|
||||||
private readonly nint* _humanVTable = null!;
|
private readonly nint* _humanVTable = null!;
|
||||||
|
|
||||||
private delegate nint CharacterBaseOnRenderMaterialDelegate(nint drawObject, OnRenderMaterialParams* param);
|
private delegate nint CharacterBaseOnRenderMaterialDelegate(CharacterBase* drawObject, CSModelRenderer.OnRenderMaterialParams* param);
|
||||||
private delegate nint ModelRendererOnRenderMaterialDelegate(nint modelRenderer, nint outFlags, nint param, Material* material, uint materialIndex);
|
private delegate nint ModelRendererOnRenderMaterialDelegate(CSModelRenderer* modelRenderer, ushort* outFlags, CSModelRenderer.OnRenderModelParams* param, Material* material, uint materialIndex);
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Explicit)]
|
|
||||||
private struct OnRenderMaterialParams
|
|
||||||
{
|
|
||||||
[FieldOffset(0x0)]
|
|
||||||
public Model* Model;
|
|
||||||
|
|
||||||
[FieldOffset(0x8)]
|
|
||||||
public uint MaterialIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
private readonly Hook<CharacterBaseOnRenderMaterialDelegate> _humanOnRenderMaterialHook;
|
private readonly Hook<CharacterBaseOnRenderMaterialDelegate> _humanOnRenderMaterialHook;
|
||||||
|
|
||||||
|
|
@ -135,7 +127,7 @@ public sealed unsafe class ShaderReplacementFixer : IDisposable
|
||||||
Interlocked.Decrement(ref _moddedCharacterGlassShpkCount);
|
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 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)
|
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.
|
// If we don't have any on-screen instances of modded characterglass.shpk, we don't need the slow path at all.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue