mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 10:17:22 +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.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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue