Skip to content
Open
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 @@ -13,6 +13,15 @@ public struct BoneSimulators {
[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;
}

// Client::Graphics::Physics::BonePhysicsModule
[StructLayout(LayoutKind.Explicit, Size = 0x590)]
[GenerateInterop]
Expand All @@ -23,6 +32,7 @@ public unsafe partial struct BonePhysicsModule {
[FieldOffset(0x94)] public float WindVariation;
[FieldOffset(0x98)] public Skeleton* Skeleton;
[FieldOffset(0xA0)] public BoneSimulators BoneSimulators;
[FieldOffset(0x118)] public BoneCollisions BoneCollisions;
[FieldOffset(0x190), FixedSizeArray] internal FixedSizeArray5<Pointer<ResourceHandle>> _bonePhysicsResourceHandles;
[FieldOffset(0x1B8)] public float FrameDeltaTime;
[FieldOffset(0x578)] public float OverrideSimulationTime;
Expand All @@ -36,4 +46,12 @@ public unsafe partial struct BonePhysicsModule {
/// <summary> Limits the returned value to 60 FPS, used to set 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 BoneSimulators and 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 BoneSimulators and BoneCollisions corresponding to resourceIndex. This resource handle is then stored in BonePhysicsResourceHandles. </summary>
[MemberFunction("E8 ?? ?? ?? ?? 48 8B 03 48 8B CB FF C6")]
public partial void Load(ResourceHandle* handle, uint resourceIndex);
}
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 void 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 void 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
[Inherits<ReferencedClassBase>]
[StructLayout(LayoutKind.Explicit, Size = 0x90)]
[GenerateInterop(isInherited: true)]
public unsafe partial struct CollisionBase {
/// <remarks> Set in constructor. </remarks>
[FieldOffset(0x80)] public CollisionShape Shape;

public enum CollisionShape : byte {
/// <remarks> Corresponds to CollisionCapsule. </remarks>
Capsule = 0,
/// <remarks> Corresponds to CollisionEllipsoid. </remarks>
Ellipsoid = 1,
/// <remarks> Corresponds to CollisionNormalPlane. </remarks>
NormalPlane = 2,
/// <remarks> Corresponds to CollisionThreePointPlane. </remarks>
ThreePointPlane = 3,
/// <remarks> Corresponds to CollisionSphere. </remarks>
Sphere = 4,
}

[MemberFunction("C7 41 ?? ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ?? 48 89 01 48 8B C1")]
public partial CollisionBase* 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::CollisionCapsule
// Client::Graphics::Physics::CollisionBase
// Client::Graphics::ReferencedClassBase
[Inherits<CollisionBase>]
[StructLayout(LayoutKind.Explicit, Size = 0x120)]
[GenerateInterop]
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
[Inherits<CollisionBase>]
[StructLayout(LayoutKind.Explicit, Size = 0x160)]
[GenerateInterop]
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
[Inherits<CollisionPlane>]
[StructLayout(LayoutKind.Explicit, Size = 0x110)]
[GenerateInterop]
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
[Inherits<CollisionBase>]
[StructLayout(LayoutKind.Explicit, Size = 0xE0)]
[GenerateInterop(isInherited: true)]
public unsafe partial struct CollisionPlane {
[MemberFunction("E8 ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ?? 48 89 03 B8 ?? ?? ?? ?? 66 89 83 ?? ?? ?? ?? 33 C0")]
public partial CollisionPlane* Ctor(CollisionBase.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
[Inherits<CollisionBase>]
[StructLayout(LayoutKind.Explicit, Size = 0xD0)]
[GenerateInterop]
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
[Inherits<CollisionPlane>]
[StructLayout(LayoutKind.Explicit, Size = 0x120)]
[GenerateInterop]
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
[Inherits<ConstraintBase>]
[StructLayout(LayoutKind.Explicit, Size = 0x60)]
[GenerateInterop]
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
[StructLayout(LayoutKind.Explicit, Size = 0x18)]
[GenerateInterop(isInherited: true)]
public unsafe partial struct ConstraintBase {
/// <remarks> Set in constructor. </remarks>
[FieldOffset(0x10)] public ConstraintType Shape;

public enum ConstraintType : uint {
/// <remarks> Corresponds to ConstraintSpring. </remarks>
Spring = 0,
/// <remarks> Corresponds to ConstraintAttract. </remarks>
Attract = 1,
/// <remarks> Corresponds to ConstraintPin. </remarks>
Pin = 2,
}

[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);
}
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
[Inherits<ConstraintBase>]
[StructLayout(LayoutKind.Explicit, Size = 0x50)]
[GenerateInterop]
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
[Inherits<ConstraintBase>]
[StructLayout(LayoutKind.Explicit, Size = 0x38)]
[GenerateInterop]
public unsafe partial struct ConstraintSpring {
[MemberFunction("E8 ?? ?? ?? ?? 48 8B F0 EB ?? 33 F6 F3 0F 10 84 24")]
public partial ConstraintSpring* Ctor();
}
75 changes: 74 additions & 1 deletion ida/data.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24953,6 +24953,7 @@ classes:
0x1417ECF30: ctor
0x1417ED0C0: Initialize
0x1417EDB20: Update
0x1417EE080: CollisionObjectTask
0x1417EE0E0: BoneSimulatorTask
Client::Graphics::Physics::BonePhysicsModule:
vtbls:
Expand All @@ -24963,6 +24964,8 @@ classes:
0x1418B0CA0: ctor
0x1418B0E00: Finalizer
0x1418B0EE0: Initialize
0x1418B14D0: CreateJobData
0x1418B1600: Load
0x1418B44F0: GetSimulationTime
0x1418B4590: GetSimulationTimeInv
Client::Graphics::Physics::BoneKineDriverModule:
Expand All @@ -24980,8 +24983,13 @@ classes:
Client::Graphics::Physics::BoneSimulator:
vtbls:
- ea: 0x14230F390
vfuncs:
0: Dtor
1: ClearSkeleton
funcs:
0x1419315B0: ctor
0x1419315B0: Ctor
0x1419318A0: Finalizer
0x141931AA0: SetSkeleton
0x141931D40: Reset
0x141931F10: Update
0x1419335E0: UpdateWithoutIntegration
Expand Down Expand Up @@ -25741,6 +25749,71 @@ classes:
Common::Component::BGCollision::Math::AABB:
funcs:
0x14206C9A0: ctorTransformed
Client::Graphics::Physics::CollisionBase:
vtbls:
- ea: 0x142451CA0
base: Client::Graphics::ReferencedClassBase
funcs:
0x141C832D0: Ctor
Client::Graphics::Physics::CollisionEllipsoid:
vtbls:
- ea: 0x142429B40
base: Client::Graphics::Physics::CollisionBase
funcs:
0x141BD7530: Ctor
Client::Graphics::Physics::CollisionPlane:
vtbls:
- ea: 0x142429B90
base: Client::Graphics::Physics::CollisionBase
funcs:
0x141BD8A90: Ctor
Client::Graphics::Physics::CollisionNormalPlane:
vtbls:
- ea: 0x142429BE0
base: Client::Graphics::Physics::CollisionPlane
funcs:
0x141BD9450: Ctor
Client::Graphics::Physics::CollisionSphere:
vtbls:
- ea: 0x142429938
base: Client::Graphics::Physics::CollisionBase
funcs:
0x141BD2950: Ctor
Client::Graphics::Physics::CollisionThreePointPlane:
vtbls:
- ea: 0x142429C30
base: Client::Graphics::Physics::CollisionPlane
funcs:
0x141BD99D0: Ctor
Client::Graphics::Physics::CollisionCapsule:
vtbls:
- ea: 0x142429988
base: Client::Graphics::Physics::CollisionBase
funcs:
0x141BD4720: Ctor
Client::Graphics::Physics::ConstraintBase:
vtbls:
- ea: 0x14242FEE0
funcs:
0x141C89310: Ctor
Client::Graphics::Physics::ConstraintAttract:
vtbls:
- ea: 0x14242FF08
base: Client::Graphics::Physics::ConstraintBase
funcs:
0x141C29600: Ctor
Client::Graphics::Physics::ConstraintPin:
vtbls:
- ea: 0x142430090
base: Client::Graphics::Physics::ConstraintBase
funcs:
0x141C29A60: Ctor
Client::Graphics::Physics::ConstraintSpring:
vtbls:
- ea: 0x1424300B8
base: Client::Graphics::Physics::ConstraintBase
funcs:
0x141C29C50: Ctor
# havok
hkArrayUtil:
funcs:
Expand Down
Loading