Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,6 @@

namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics;

[StructLayout(LayoutKind.Explicit, Size = 0x78)]
public struct BoneSimulators {
[FieldOffset(0x00)] public StdVector<Pointer<BoneSimulator>> BoneSimulator_1;
[FieldOffset(0x18)] public StdVector<Pointer<BoneSimulator>> BoneSimulator_2;
[FieldOffset(0x30)] public StdVector<Pointer<BoneSimulator>> BoneSimulator_3;
[FieldOffset(0x48)] public StdVector<Pointer<BoneSimulator>> BoneSimulator_4;
[FieldOffset(0x60)] public StdVector<Pointer<BoneSimulator>> BoneSimulator_5;
}

// Client::Graphics::Physics::BonePhysicsModule
[StructLayout(LayoutKind.Explicit, Size = 0x590)]
[GenerateInterop]
Expand All @@ -23,17 +14,47 @@ public unsafe partial struct BonePhysicsModule {
[FieldOffset(0x94)] public float WindVariation;
[FieldOffset(0x98)] public Skeleton* Skeleton;
[FieldOffset(0xA0)] public BoneSimulators BoneSimulators;
[FieldOffset(0x190), FixedSizeArray] internal FixedSizeArray5<Pointer<ResourceHandle>> _bonePhysicsResourceHandles;
[FieldOffset(0x118)] public BoneCollisions BoneCollisions;
[FieldOffset(0x190), FixedSizeArray] internal FixedSizeArray5<Pointer<ResourceHandle>> _bonePhysicsResourceHandles; // TODO: change element type to Pointer<BonePhysicsResourceHandle>
[FieldOffset(0x1B8)] public float FrameDeltaTime;
[FieldOffset(0x578)] public float OverrideSimulationTime;
/// <remarks> If true, returns OverrideSimulationTime when GetSimulationTime is called and FrameDeltaTime is above ~0.01667 (60 FPS.) </remarks>
/// <remarks> If <see langword="true"/>, returns <see cref="OverrideSimulationTime"/> when <see cref="GetSimulationTime"/> is called and <see cref="FrameDeltaTime"/> is above <c>~0.01667</c> (60 FPS.) </remarks>
[FieldOffset(0x588)] public bool UseOverrideSimulationTime;

/// <summary> Used to set BoneSimulator.SimulationTimeInv, and in turn calls GetSimulationTime. </summary>
/// <summary> Used to set <see cref="BoneSimulator.SimulationTimeInv"/>, and in turn calls <see cref="GetSimulationTime"/>. </summary>
[MemberFunction("E8 ?? ?? ?? ?? 0F 2F C6 76 ?? 48 8B CE")]
public partial float GetSimulationTimeInv();

/// <summary> Limits the returned value to 60 FPS, used to set BoneSimulator.SimulationTime. </summary>
/// <summary> Limits the returned value to 60 FPS, used to set <see cref="BoneSimulator.SimulationTime"/>. </summary>
[MemberFunction("E8 ?? ?? ?? ?? F3 0F 5E F0 F3 0F 11 43")]
public partial float GetSimulationTime();

/// <summary> Creates job data based on the lists in <see cref="BoneSimulators"/> and <see cref="BoneCollisions"/>. </summary>
[MemberFunction("E8 ?? ?? ?? ?? 48 8D 7F ?? 48 83 EB ?? 75 ?? 48 8B 45")]
public partial void CreateJobData(BonePhysicsUpdater* updater);

/// <summary>
/// Loads data into the vector in <see cref="BoneSimulators"/> and <see cref="BoneCollisions"/> corresponding to resourceIndex.
/// This resource handle is then stored in <see cref="BonePhysicsResourceHandles"/>.
/// </summary>
[MemberFunction("E8 ?? ?? ?? ?? 48 8B 03 48 8B CB FF C6")]
public partial void Load(BonePhysicsResourceHandle* handle, uint resourceIndex);
}

[StructLayout(LayoutKind.Explicit, Size = 0x78)]
public struct BoneSimulators {
[FieldOffset(0x00)] public StdVector<Pointer<BoneSimulator>> BoneSimulator_1;
[FieldOffset(0x18)] public StdVector<Pointer<BoneSimulator>> BoneSimulator_2;
[FieldOffset(0x30)] public StdVector<Pointer<BoneSimulator>> BoneSimulator_3;
[FieldOffset(0x48)] public StdVector<Pointer<BoneSimulator>> BoneSimulator_4;
[FieldOffset(0x60)] public StdVector<Pointer<BoneSimulator>> BoneSimulator_5;
}

[StructLayout(LayoutKind.Explicit, Size = 0x78)]
public struct BoneCollisions {
[FieldOffset(0x00)] public StdVector<Pointer<CollisionBase>> BoneCollision_1;
[FieldOffset(0x18)] public StdVector<Pointer<CollisionBase>> BoneCollision_2;
[FieldOffset(0x30)] public StdVector<Pointer<CollisionBase>> BoneCollision_3;
[FieldOffset(0x48)] public StdVector<Pointer<CollisionBase>> BoneCollision_4;
[FieldOffset(0x60)] public StdVector<Pointer<CollisionBase>> BoneCollision_5;
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,26 @@ public unsafe partial struct BonePhysicsUpdater {
[FieldOffset(0xE0)] public JobSystem BoneSimulatorJob;
[FieldOffset(0x1A0)] public JobSystem TransformUpdaterJob;

/// <remarks> This is executed by BoneSimulatorUpdateJob. </remarks>
/// <remarks> This is executed by BoneSimulatorJob. </remarks>
[MemberFunction("48 89 5C 24 ?? 48 89 6C 24 ?? 48 89 74 24 ?? 48 89 7C 24 ?? 41 56 48 83 EC ?? ?? ?? ?? 33 ED 4C 8B F2")] // don't use the lea instruction sig
public partial void BoneSimulatorTask(UpdateBoneSimulatorJobData* data);

/// <remarks> This is executed by CollisionObjectJob. </remarks>
[MemberFunction("48 89 5C 24 ?? 57 48 83 EC ?? 48 8B 3A 48 8B 5F")]
public partial void CollisionObjectTask(CollisionObjectJobData* data);

/// <remarks> Structure passed to BoneSimulatorTask. </remarks>
[GenerateInterop]
[StructLayout(LayoutKind.Explicit, Size = 0x10)]
public partial struct UpdateBoneSimulatorJobData {
[FieldOffset(0x0)] public BoneSimulator* BoneSimulator;
[FieldOffset(0x8)] public BonePhysicsModule* BonePhysicsModule;
}

/// <remarks> Structure passed to CollisionObjectTask. </remarks>
[GenerateInterop]
[StructLayout(LayoutKind.Explicit, Size = 0x8)]
public partial struct CollisionObjectJobData {
[FieldOffset(0x0)] public CollisionBase* CollisionObject;
}
}
23 changes: 23 additions & 0 deletions FFXIVClientStructs/FFXIV/Client/Graphics/Physics/BoneSimulator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,19 @@ public unsafe partial struct BoneSimulator {
// They are hardcoded to roughly 1/60 (0.016666668) and 60 (59.999996) in cases where the sheet isn't used.
[FieldOffset(0x50)] public float SimulationTime;
[FieldOffset(0x54)] public float SimulationTimeInv; // 1/SimulationTime
[FieldOffset(0x90)] public StdVector<ConstraintBase> Constraints;
[FieldOffset(0x6C)] public ushort ConstraintLoop;
[FieldOffset(0x6E)] public ushort CollisionLoop;
[FieldOffset(0xF6)] public bool IsStarted; // Flag that is set to true when the simulator starts, and is quickly reset
[FieldOffset(0xF7)] public bool IsStopped; // Same as Start, but when the simulator is requested to stop
[FieldOffset(0xF8)] public bool IsReset; // When set to true, resets the bone simulator

[FieldOffset(0x444)] public bool IsSimulating;
[FieldOffset(0x445)] public bool IsTimeIntegrating; // Whether the simulator is integrating (time stepping) on this frame
[FieldOffset(0x446)] public bool IsCollidable;
[FieldOffset(0x447)] public bool ContinuousCollisions;
[FieldOffset(0x448)] public bool UsingGroundPlane;
[FieldOffset(0x449)] public bool FixedLength;

/// <summary> Non-exhaustive list of physics groups </summary>
public enum PhysicsGroup : uint {
Expand All @@ -36,6 +42,19 @@ public enum PhysicsGroup : uint {
Ears = 18,
}

[MemberFunction("E8 ?? ?? ?? ?? 48 8B 74 24 ?? 4C 8B E8")]
public partial BoneSimulator* Ctor();

[MemberFunction("48 89 5C 24 ?? 57 48 83 EC ?? 48 8D 05 ?? ?? ?? ?? 48 8B D9 48 89 01 48 81 C1 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 8B 93")]
public partial void Finalizer();

[VirtualFunction(0)]
public partial BoneSimulator* Dtor(byte freeFlags);

/// <remarks> Resets a lot of stuff and clears the Skeleton field? </remarks>
[VirtualFunction(1)]
public partial void ClearSkeleton();

/// <remarks> Called when IsTimeIntegrating is true. </remarks>
[MemberFunction("40 55 53 56 41 57 48 8D AC 24 ?? ?? ?? ?? 48 81 EC ?? ?? ?? ?? 44 0F 29 94 24")]
public partial void Update(BonePhysicsModule* bonePhysicsModule);
Expand All @@ -47,4 +66,8 @@ public enum PhysicsGroup : uint {
/// <remarks> Reset this bone simulator. </remarks>
[MemberFunction("E8 ?? ?? ?? ?? 48 8B 77 ?? 48 8D 8E")]
public partial void Reset();

/// <remarks> Sets the skeleton for this bone simulator, also calls Reset. </remarks>
[MemberFunction("E8 ?? ?? ?? ?? 41 0F B6 44 24 ?? 41 89 45")]
public partial bool SetSkeleton(Skeleton* skeleton);
}
27 changes: 27 additions & 0 deletions FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionBase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics;

// Client::Graphics::Physics::CollisionBase
// Client::Graphics::ReferencedClassBase
[GenerateInterop(isInherited: true)]
[Inherits<ReferencedClassBase>]
[StructLayout(LayoutKind.Explicit, Size = 0x90)]
public unsafe partial struct CollisionBase {
/// <remarks> Set in constructor. </remarks>
[FieldOffset(0x80)] public CollisionShape Shape;

[MemberFunction("C7 41 ?? ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ?? 48 89 01 48 8B C1")]
public partial CollisionBase* Ctor(CollisionShape shape);
}

public enum CollisionShape : byte {
/// <remarks> Corresponds to <see cref="CollisionCapsule"/>. </remarks>
Capsule = 0,
/// <remarks> Corresponds to <see cref="CollisionEllipsoid"/>. </remarks>
Ellipsoid = 1,
/// <remarks> Corresponds to <see cref="CollisionNormalPlane"/>. </remarks>
NormalPlane = 2,
/// <remarks> Corresponds to <see cref="CollisionThreePointPlane"/>. </remarks>
ThreePointPlane = 3,
/// <remarks> Corresponds to <see cref="CollisionSphere"/>. </remarks>
Sphere = 4,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics;

// Client::Graphics::Physics::CollisionCapsule
// Client::Graphics::Physics::CollisionBase
// Client::Graphics::ReferencedClassBase
[GenerateInterop]
[Inherits<CollisionBase>]
[StructLayout(LayoutKind.Explicit, Size = 0x120)]
public unsafe partial struct CollisionCapsule {
[MemberFunction("E8 ?? ?? ?? ?? 48 8B D8 48 89 5C 24")]
public partial CollisionCapsule* Ctor();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics;

// Client::Graphics::Physics::CollisionEllipsoid
// Client::Graphics::Physics::CollisionBase
// Client::Graphics::ReferencedClassBase
[GenerateInterop]
[Inherits<CollisionBase>]
[StructLayout(LayoutKind.Explicit, Size = 0x160)]
public unsafe partial struct CollisionEllipsoid {
[MemberFunction("40 53 48 83 EC ?? B2 ?? 48 8B D9 E8 ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ?? 48 89 03 B8 ?? ?? ?? ?? 0F 28 05")]
public partial CollisionEllipsoid* Ctor();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics;

// Client::Graphics::Physics::CollisionThreePointPlane
// Client::Graphics::Physics::CollisionPlane
// Client::Graphics::Physics::CollisionBase
// Client::Graphics::ReferencedClassBase
[GenerateInterop]
[Inherits<CollisionPlane>]
[StructLayout(LayoutKind.Explicit, Size = 0x110)]
public unsafe partial struct CollisionNormalPlane {
[MemberFunction("40 53 48 83 EC ?? B2 ?? 48 8B D9 E8 ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ?? 48 89 03 B8 ?? ?? ?? ?? 66 89 83")]
public partial CollisionNormalPlane* Ctor();
}
12 changes: 12 additions & 0 deletions FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionPlane.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics;

// Client::Graphics::Physics::CollisionPlane
// Client::Graphics::Physics::CollisionBase
// Client::Graphics::ReferencedClassBase
[GenerateInterop(isInherited: true)]
[Inherits<CollisionBase>]
[StructLayout(LayoutKind.Explicit, Size = 0xE0)]
public unsafe partial struct CollisionPlane {
[MemberFunction("E8 ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ?? 48 89 03 B8 ?? ?? ?? ?? 66 89 83 ?? ?? ?? ?? 33 C0")]
public partial CollisionPlane* Ctor(CollisionShape shape);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics;

// Client::Graphics::Physics::CollisionSphere
// Client::Graphics::Physics::CollisionBase
// Client::Graphics::ReferencedClassBase
[GenerateInterop]
[Inherits<CollisionBase>]
[StructLayout(LayoutKind.Explicit, Size = 0xD0)]
public unsafe partial struct CollisionSphere {
[MemberFunction("40 53 48 83 EC ?? B2 ?? 48 8B D9 E8 ?? ?? ?? ?? 33 C9")]
public partial CollisionSphere* Ctor();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics;

// Client::Graphics::Physics::CollisionThreePointPlane
// Client::Graphics::Physics::CollisionPlane
// Client::Graphics::Physics::CollisionBase
// Client::Graphics::ReferencedClassBase
[GenerateInterop]
[Inherits<CollisionPlane>]
[StructLayout(LayoutKind.Explicit, Size = 0x120)]
public unsafe partial struct CollisionThreePointPlane {
[MemberFunction("40 53 48 83 EC ?? B2 ?? 48 8B D9 E8 ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ?? BA")]
public partial CollisionThreePointPlane* Ctor();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics;

// Client::Graphics::Physics::ConstraintAttract
// Client::Graphics::Physics::ConstraintBase
[GenerateInterop]
[Inherits<ConstraintBase>]
[StructLayout(LayoutKind.Explicit, Size = 0x60)]
public unsafe partial struct ConstraintAttract {
[MemberFunction("E8 ?? ?? ?? ?? 48 8B F0 EB ?? 33 F6 F3 0F 10 44 24")]
public partial ConstraintAttract* Ctor();
}
21 changes: 21 additions & 0 deletions FFXIVClientStructs/FFXIV/Client/Graphics/Physics/ConstraintBase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics;

// Client::Graphics::Physics::ConstraintBase
[GenerateInterop(isInherited: true)]
[StructLayout(LayoutKind.Explicit, Size = 0x18)]
public unsafe partial struct ConstraintBase {
/// <remarks> Set in constructor. </remarks>
[FieldOffset(0x10)] public ConstraintType Type;

[MemberFunction("48 C7 41 ?? ?? ?? ?? ?? 48 89 01 48 8B C1 89 51 ?? C3")] // don't use the lea instruction sig
public partial ConstraintBase* Ctor(ConstraintType type);
}

public enum ConstraintType : uint {
/// <remarks> Corresponds to <see cref="ConstraintSpring"/>. </remarks>
Spring = 0,
/// <remarks> Corresponds to <see cref="ConstraintAttract"/>. </remarks>
Attract = 1,
/// <remarks> Corresponds to <see cref="ConstraintPin"/>. </remarks>
Pin = 2,
}
11 changes: 11 additions & 0 deletions FFXIVClientStructs/FFXIV/Client/Graphics/Physics/ConstraintPin.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics;

// Client::Graphics::Physics::ConstraintPin
// Client::Graphics::Physics::ConstraintBase
[GenerateInterop]
[Inherits<ConstraintBase>]
[StructLayout(LayoutKind.Explicit, Size = 0x50)]
public unsafe partial struct ConstraintPin {
[MemberFunction("E8 ?? ?? ?? ?? 48 8B F0 48 8B 57")]
public partial ConstraintPin* Ctor();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics;

// Client::Graphics::Physics::ConstraintSpring
// Client::Graphics::Physics::ConstraintBase
[GenerateInterop]
[Inherits<ConstraintBase>]
[StructLayout(LayoutKind.Explicit, Size = 0x38)]
public unsafe partial struct ConstraintSpring {
[MemberFunction("E8 ?? ?? ?? ?? 48 8B F0 EB ?? 33 F6 F3 0F 10 84 24")]
public partial ConstraintSpring* Ctor();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace FFXIVClientStructs.FFXIV.Client.System.Resource.Handle;

// Client::System::Resource::Handle::BonePhysicsResourceHandle
// Client::System::Resource::Handle::DefaultResourceHandle
// Client::System::Resource::Handle::ResourceHandle
// Client::System::Common::NonCopyable
[GenerateInterop]
[Inherits<DefaultResourceHandle>]
[StructLayout(LayoutKind.Explicit, Size = 0x120)]
public partial struct BonePhysicsResourceHandle;
Loading
Loading