diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvLocation.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvLocation.cs index f8a5273429..0de4c6de0a 100644 --- a/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvLocation.cs +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvLocation.cs @@ -1,3 +1,7 @@ +using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel; +using FFXIVClientStructs.FFXIV.Client.System.File; +using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; + namespace FFXIVClientStructs.FFXIV.Client.Graphics.Scene; // Client::Graphics::Scene::EnvLocation @@ -6,4 +10,21 @@ namespace FFXIVClientStructs.FFXIV.Client.Graphics.Scene; [GenerateInterop] [Inherits] [StructLayout(LayoutKind.Explicit, Size = 0x4E0)] -public unsafe partial struct EnvLocation; +public unsafe partial struct EnvLocation { + [FieldOffset(0x90)] public AmbientSetResourceHandle* AmbientSetResource; + [FieldOffset(0x98)] public TextureResourceHandle* EnvironmentCubemapResource; + [FieldOffset(0xA0)] public void* AmbientSet; + [FieldOffset(0xA8)] public Texture* EnvironmentCubemap; + [FieldOffset(0xB0)] private float UnkB0; + [FieldOffset(0xB8)] private byte UnkB8; + [FieldOffset(0xB9)] private ushort UnkB9; + [FieldOffset(0xC0)] public FileAccessPath AmbientSetResourcePath; + [FieldOffset(0x2D0)] public FileAccessPath EnvironmentCubemapResourcePath; + + // There can only be 32 at once. Beyond that it returns null. + [MemberFunction("40 53 48 83 EC 20 83 3D ?? ?? ?? ?? ?? 7D 4E")] + public static partial EnvLocation* TryCreate(); + + [MemberFunction("E9 ?? ?? ?? ?? 48 83 C4 20 5B C3 CC CC CC CC CC CC C2 00 00")] + public static partial void TryDestroy(EnvLocation** locationPointer); +} diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvScene.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvScene.cs index 0dd53bf31d..389e8bc579 100644 --- a/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvScene.cs +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvScene.cs @@ -1,10 +1,25 @@ +using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel; + namespace FFXIVClientStructs.FFXIV.Client.Graphics.Scene; // Client::Graphics::Scene::EnvScene +// Created by the LayoutEnvironment [GenerateInterop] [StructLayout(LayoutKind.Explicit, Size = 0x8F0)] public unsafe partial struct EnvScene { [FieldOffset(0x30), FixedSizeArray] internal FixedSizeArray32 _weatherIds; [FieldOffset(0xF0), FixedSizeArray] internal FixedSizeArray8 _envSpaces; + + [FieldOffset(0x880)] public EnvLocation** Locations; // array that can store 32 pointers + [FieldOffset(0x888)] public uint LocationCount; // How many valid EnvLocation pointers in Locations + [FieldOffset(0x8D0)] public Texture* CubemapArray; + [FieldOffset(0x8D8)] public ConstantBuffer* ConstantBuffer; // constant buffer size: 0x10 + + // Returns true but does nothing if the given location is already in this scene. + [MemberFunction("4C 8B D1 48 85 D2 74 3F")] + public partial bool AddLocation(EnvLocation* location); + + [MemberFunction("4C 8B D1 48 85 D2 74 25 44 8B 81")] + public partial bool RemoveLocation(EnvLocation* location); } diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvSpace.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvSpace.cs index 135936798a..c1517633c8 100644 --- a/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvSpace.cs +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Scene/EnvSpace.cs @@ -1,3 +1,5 @@ +using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; + namespace FFXIVClientStructs.FFXIV.Client.Graphics.Scene; // Client::Graphics::Scene::EnvSpace @@ -7,5 +9,7 @@ namespace FFXIVClientStructs.FFXIV.Client.Graphics.Scene; [Inherits] [StructLayout(LayoutKind.Explicit, Size = 0xF0)] public unsafe partial struct EnvSpace { + [FieldOffset(0x90)] public EnvSetResourceHandle* EnvSetResourceHandle; + [FieldOffset(0x98)] public SoundSetResourceHandle* SoundSetResourceHandle; [FieldOffset(0xB0)] public EnvLocation* EnvLocation; } diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Environment/LayoutEnvironment.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Environment/LayoutEnvironment.cs new file mode 100644 index 0000000000..f918dc4a4b --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Environment/LayoutEnvironment.cs @@ -0,0 +1,11 @@ +using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; + +namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Environment; + +// Client::LayoutEngine::Environment::LayoutEnvironment +[StructLayout(LayoutKind.Explicit, Size = 0x28)] +public unsafe struct LayoutEnvironment { + [FieldOffset(0x08)] public LayoutManager* LayoutManager; + [FieldOffset(0x10)] public EnvScene* GraphicsEnvironment; // Only set in the ActiveLayout, null in the GlobalLayout + [FieldOffset(0x18)] private void* Unk18; +} diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EnvLocationLayoutInstance.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EnvLocationLayoutInstance.cs new file mode 100644 index 0000000000..1232ee1c8b --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/Layer/EnvLocationLayoutInstance.cs @@ -0,0 +1,15 @@ +using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; + +namespace FFXIVClientStructs.FFXIV.Client.LayoutEngine.Layer; + +// Client::LayoutEngine::Layer::EnvLocationLayoutInstance +// Client::LayoutEngine::ILayoutInstance +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0x48)] +public unsafe partial struct EnvLocationLayoutInstance { + [FieldOffset(0x30)] public EnvLocation* GraphicsObject; + [FieldOffset(0x38)] private void* Unk38; // Array of 0x4C structures memcpy'd from the file + [FieldOffset(0x40)] private int Unk40; // Count of Unk38 + [FieldOffset(0x44)] private uint Unk44; +} diff --git a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/LayoutManager.cs b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/LayoutManager.cs index 6cf43127be..c631a7f8e2 100644 --- a/FFXIVClientStructs/FFXIV/Client/LayoutEngine/LayoutManager.cs +++ b/FFXIVClientStructs/FFXIV/Client/LayoutEngine/LayoutManager.cs @@ -27,7 +27,7 @@ public unsafe partial struct LayoutManager { [FieldOffset(0x080)] public float FestivalLayersAddTimer; // dt * 30 [FieldOffset(0x084)] public float FestivalLayersRemoveTimer; // dt * 30 [FieldOffset(0x088)] public void* StreamingManager; - [FieldOffset(0x090)] public void* Environment; + [FieldOffset(0x090)] public void* Environment; // TODO: Change to LayoutEnvironment* [FieldOffset(0x098)] public void* OBSetManager; [FieldOffset(0x0A0)] public OutdoorAreaLayoutData* OutdoorAreaData; [FieldOffset(0x0A8)] public OutdoorExteriorLayoutData* OutdoorExteriorData; diff --git a/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/AmbientSetResourceHandle.cs b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/AmbientSetResourceHandle.cs new file mode 100644 index 0000000000..9e625c5acf --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/AmbientSetResourceHandle.cs @@ -0,0 +1,10 @@ +namespace FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; + +// Client::System::Resource::Handle::AmbientSetResourceHandle +// Client::System::Resource::Handle::DefaultResourceHandle +// Client::System::Resource::Handle::ResourceHandle +// Client::System::Common::NonCopyable +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0xC8)] +public partial struct AmbientSetResourceHandle; // .amb diff --git a/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/ApricotResourceHandle.cs b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/ApricotResourceHandle.cs index 3f5abf7fcc..7bc732fe8e 100644 --- a/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/ApricotResourceHandle.cs +++ b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/ApricotResourceHandle.cs @@ -7,4 +7,4 @@ namespace FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; [GenerateInterop] [Inherits] [StructLayout(LayoutKind.Explicit, Size = 0xC8)] -public unsafe partial struct ApricotResourceHandle { } +public partial struct ApricotResourceHandle; diff --git a/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/EnvSetResourceHandle.cs b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/EnvSetResourceHandle.cs new file mode 100644 index 0000000000..90be2b8838 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/EnvSetResourceHandle.cs @@ -0,0 +1,10 @@ +namespace FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; + +// Client::System::Resource::Handle::EnvSetResourceHandle +// Client::System::Resource::Handle::DefaultResourceHandle +// Client::System::Resource::Handle::ResourceHandle +// Client::System::Common::NonCopyable +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0xC8)] +public partial struct EnvSetResourceHandle; // .envb diff --git a/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/SoundSetResourceHandle.cs b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/SoundSetResourceHandle.cs new file mode 100644 index 0000000000..090bb2ea44 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/SoundSetResourceHandle.cs @@ -0,0 +1,10 @@ +namespace FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; + +// Client::System::Resource::Handle::SoundSetResourceHandle +// Client::System::Resource::Handle::DefaultResourceHandle +// Client::System::Resource::Handle::ResourceHandle +// Client::System::Common::NonCopyable +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0xC8)] +public partial struct SoundSetResourceHandle; // .essb diff --git a/ida/data.yml b/ida/data.yml index ab6ab17954..d1ddf5623c 100644 --- a/ida/data.yml +++ b/ida/data.yml @@ -7466,6 +7466,8 @@ classes: base: Client::Graphics::Scene::DrawObject funcs: 0x140455530: ctor + 0x140798B70: TryCreate + 0x140798BF0: TryDestroy Client::Graphics::Scene::EnvSpace: vtbls: - ea: 0x142162168 @@ -7493,6 +7495,8 @@ classes: - ea: 0x1421622F8 funcs: 0x1404582A0: ctor + 0x1404590E0: AddLocation + 0x140459130: RemoveLocation Client::Graphics::Scene::ResidentResourceManager::ResourceList: vtbls: - ea: 0x1421625B8