diff --git a/FFXIVClientStructs/Apricot/ApricotEngine.cs b/FFXIVClientStructs/Apricot/ApricotEngine.cs new file mode 100644 index 000000000..fea6be839 --- /dev/null +++ b/FFXIVClientStructs/Apricot/ApricotEngine.cs @@ -0,0 +1,23 @@ +using FFXIVClientStructs.Apricot.Instance; +using FFXIVClientStructs.FFXIV.Client.Graphics.Vfx; + +namespace FFXIVClientStructs.Apricot; + +[GenerateInterop] +[StructLayout(LayoutKind.Explicit, Size = 0x2980)] +public unsafe partial struct ApricotEngine { + [FieldOffset(0x1128)] public DataContainer* Data; + + [MemberFunction("E8 ?? ?? ?? ?? 4B 8B 0C 27")] + public static partial ApricotEngine* GetInstance(); + + [GenerateInterop(isInherited: true)] + [StructLayout(LayoutKind.Explicit, Size = 0x83030)] + public partial struct DataContainer { + [FieldOffset(0x2030), FixedSizeArray] internal FixedSizeArray2048 _instances; + + public DocumentInstance* GetDocument(int index) => this._instances[index].Instance; + + public DocumentInstance* GetDocument(VfxResourceHandle handle) => this.GetDocument((int)handle.Index); + } +} diff --git a/FFXIVClientStructs/Apricot/Data/Document.cs b/FFXIVClientStructs/Apricot/Data/Document.cs new file mode 100644 index 000000000..3d7db02bd --- /dev/null +++ b/FFXIVClientStructs/Apricot/Data/Document.cs @@ -0,0 +1,8 @@ +namespace FFXIVClientStructs.Apricot.Data; + +[StructLayout(LayoutKind.Explicit)] +public struct Document { + [FieldOffset(0x40)] public unsafe Particle* Particles; + + [FieldOffset(0xE6)] public byte ParticleCount; +} diff --git a/FFXIVClientStructs/Apricot/Data/Particle.cs b/FFXIVClientStructs/Apricot/Data/Particle.cs new file mode 100644 index 000000000..ef6046bc8 --- /dev/null +++ b/FFXIVClientStructs/Apricot/Data/Particle.cs @@ -0,0 +1,6 @@ +namespace FFXIVClientStructs.Apricot.Data; + +[StructLayout(LayoutKind.Explicit, Size = 0x238)] +public struct Particle { + [FieldOffset(0x70)] public unsafe RgbFunctionCurve* Rgb; +} diff --git a/FFXIVClientStructs/Apricot/Data/RgbFunctionCurve.cs b/FFXIVClientStructs/Apricot/Data/RgbFunctionCurve.cs new file mode 100644 index 000000000..3b3b5f9b2 --- /dev/null +++ b/FFXIVClientStructs/Apricot/Data/RgbFunctionCurve.cs @@ -0,0 +1,26 @@ +using System.Numerics; + +namespace FFXIVClientStructs.Apricot.Data; + +[StructLayout(LayoutKind.Explicit)] +public struct RgbFunctionCurve { + [FieldOffset(0x0)] public uint Data; + // not a fixed size array, not sure how else to handle this? + [FieldOffset(0x4), FixedSizeArray] internal unsafe fixed byte _keys[0x10]; + + public ushort KeyCount => (ushort)(this.Data >> 9); + + public unsafe RgbKey* GetKey(int index) { + if (index < 0 || index >= this.KeyCount) + throw new IndexOutOfRangeException($"{index}"); + + fixed (void* ptr = this._keys) + return (RgbKey*)ptr + index; + } + + [StructLayout(LayoutKind.Explicit, Size = 0x10)] + public struct RgbKey { + [FieldOffset(0x0)] public uint Data; + [FieldOffset(0x4)] public Vector3 Color; + } +} diff --git a/FFXIVClientStructs/Apricot/Instance/DocumentInstance.cs b/FFXIVClientStructs/Apricot/Instance/DocumentInstance.cs new file mode 100644 index 000000000..46f146596 --- /dev/null +++ b/FFXIVClientStructs/Apricot/Instance/DocumentInstance.cs @@ -0,0 +1,20 @@ +using FFXIVClientStructs.Apricot.Data; + +namespace FFXIVClientStructs.Apricot.Instance; + +[StructLayout(LayoutKind.Explicit, Size = 0x500)] +public struct DocumentInstance { + [FieldOffset(0)] public unsafe nint* _vfTable; + + [FieldOffset(0x1D4)] public float LocalTime; + [FieldOffset(0x1DC)] public float TimeScale; + + [FieldOffset(0x1F8)] public unsafe DocumentInstance* Root; + [FieldOffset(0x200)] public unsafe DocumentInstance* Parent; + [FieldOffset(0x208)] public unsafe Document* Document; + [FieldOffset(0x210)] public unsafe DocumentInstance* Child; + [FieldOffset(0x218)] public unsafe DocumentInstance* ChildLast; + [FieldOffset(0x220)] public unsafe DocumentInstance* Sibling; + + [FieldOffset(0x49D)] public byte State; +} diff --git a/FFXIVClientStructs/Apricot/InstanceContainer.cs b/FFXIVClientStructs/Apricot/InstanceContainer.cs new file mode 100644 index 000000000..3e6e2b7e3 --- /dev/null +++ b/FFXIVClientStructs/Apricot/InstanceContainer.cs @@ -0,0 +1,8 @@ +using FFXIVClientStructs.Apricot.Instance; + +namespace FFXIVClientStructs.Apricot; + +[StructLayout(LayoutKind.Explicit, Size = 0x88)] +public struct InstanceContainer { + [FieldOffset(0)] public unsafe DocumentInstance* Instance; +} diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Vfx/VfxResourceHandle.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Vfx/VfxResourceHandle.cs new file mode 100644 index 000000000..262d79622 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Vfx/VfxResourceHandle.cs @@ -0,0 +1,8 @@ +namespace FFXIVClientStructs.FFXIV.Client.Graphics.Vfx; + +[StructLayout(LayoutKind.Explicit, Size = 8)] +public struct VfxResourceHandle { + [FieldOffset(0), CExporterUnion("Value")] public ulong Value; + [FieldOffset(0), CExporterUnion("Value")] public uint Id; + [FieldOffset(4), CExporterUnion("Value")] public uint Index; +} diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Vfx/VfxResourceInstance.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Vfx/VfxResourceInstance.cs index 915b59c05..4442048b5 100644 --- a/FFXIVClientStructs/FFXIV/Client/Graphics/Vfx/VfxResourceInstance.cs +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Vfx/VfxResourceInstance.cs @@ -6,6 +6,7 @@ namespace FFXIVClientStructs.FFXIV.Client.Graphics.Vfx; [StructLayout(LayoutKind.Explicit, Size = 0xD0)] public unsafe struct VfxResourceInstance { [FieldOffset(0x08)] internal VfxResourceUnk* VfxResourceUnk; + [FieldOffset(0x60)] public VfxResourceHandle Handle; } [StructLayout(LayoutKind.Explicit, Size = 0x20)]