mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 18:27:24 +01:00
74 lines
3.5 KiB
C#
74 lines
3.5 KiB
C#
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
|
|
using FFXIVClientStructs.STD;
|
|
using InteropGenerator.Runtime;
|
|
using Penumbra.String;
|
|
|
|
namespace Penumbra.Interop.Structs;
|
|
|
|
internal static class StructExtensions
|
|
{
|
|
public static CiByteString AsByteString(in this StdString str)
|
|
=> CiByteString.FromSpanUnsafe(str.AsSpan(), true);
|
|
|
|
public static CiByteString ResolveEidPathAsByteString(ref this CharacterBase character)
|
|
{
|
|
Span<byte> pathBuffer = stackalloc byte[CharacterBase.PathBufferSize];
|
|
return ToOwnedByteString(character.ResolveEidPath(pathBuffer));
|
|
}
|
|
|
|
public static CiByteString ResolveImcPathAsByteString(ref this CharacterBase character, uint slotIndex)
|
|
{
|
|
Span<byte> pathBuffer = stackalloc byte[CharacterBase.PathBufferSize];
|
|
return ToOwnedByteString(character.ResolveImcPath(pathBuffer, slotIndex));
|
|
}
|
|
|
|
public static CiByteString ResolveMdlPathAsByteString(ref this CharacterBase character, uint slotIndex)
|
|
{
|
|
Span<byte> pathBuffer = stackalloc byte[CharacterBase.PathBufferSize];
|
|
return ToOwnedByteString(character.ResolveMdlPath(pathBuffer, slotIndex));
|
|
}
|
|
|
|
public static unsafe CiByteString ResolveMtrlPathAsByteString(ref this CharacterBase character, uint slotIndex, byte* mtrlFileName)
|
|
{
|
|
var pathBuffer = stackalloc byte[CharacterBase.PathBufferSize];
|
|
return ToOwnedByteString(character.ResolveMtrlPath(pathBuffer, CharacterBase.PathBufferSize, slotIndex, mtrlFileName));
|
|
}
|
|
|
|
public static unsafe CiByteString ResolveSkinMtrlPathAsByteString(ref this CharacterBase character, uint slotIndex)
|
|
{
|
|
// TODO ClientStructs-ify (aers/FFXIVClientStructs#1474)
|
|
var vf91 = (delegate* unmanaged<CharacterBase*, byte*, nuint, uint, byte*>)((nint*)character.VirtualTable)[91];
|
|
var pathBuffer = stackalloc byte[CharacterBase.PathBufferSize];
|
|
return ToOwnedByteString(vf91((CharacterBase*)Unsafe.AsPointer(ref character), pathBuffer, CharacterBase.PathBufferSize, slotIndex));
|
|
}
|
|
|
|
public static CiByteString ResolveMaterialPapPathAsByteString(ref this CharacterBase character, uint slotIndex, uint unkSId)
|
|
{
|
|
Span<byte> pathBuffer = stackalloc byte[CharacterBase.PathBufferSize];
|
|
return ToOwnedByteString(character.ResolveMaterialPapPath(pathBuffer, slotIndex, unkSId));
|
|
}
|
|
|
|
public static CiByteString ResolveSklbPathAsByteString(ref this CharacterBase character, uint partialSkeletonIndex)
|
|
{
|
|
Span<byte> pathBuffer = stackalloc byte[CharacterBase.PathBufferSize];
|
|
return ToOwnedByteString(character.ResolveSklbPath(pathBuffer, partialSkeletonIndex));
|
|
}
|
|
|
|
public static CiByteString ResolveSkpPathAsByteString(ref this CharacterBase character, uint partialSkeletonIndex)
|
|
{
|
|
Span<byte> pathBuffer = stackalloc byte[CharacterBase.PathBufferSize];
|
|
return ToOwnedByteString(character.ResolveSkpPath(pathBuffer, partialSkeletonIndex));
|
|
}
|
|
|
|
public static CiByteString ResolvePhybPathAsByteString(ref this CharacterBase character, uint partialSkeletonIndex)
|
|
{
|
|
Span<byte> pathBuffer = stackalloc byte[CharacterBase.PathBufferSize];
|
|
return ToOwnedByteString(character.ResolvePhybPath(pathBuffer, partialSkeletonIndex));
|
|
}
|
|
|
|
private static unsafe CiByteString ToOwnedByteString(CStringPointer str)
|
|
=> str.HasValue ? new CiByteString(str.Value).Clone() : CiByteString.Empty;
|
|
|
|
private static CiByteString ToOwnedByteString(ReadOnlySpan<byte> str)
|
|
=> str.Length == 0 ? CiByteString.Empty : CiByteString.FromSpanUnsafe(str, true).Clone();
|
|
}
|