diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/BonePhysicsModule.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/BonePhysicsModule.cs index 31efb97ec9..aedf906a9f 100644 --- a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/BonePhysicsModule.cs +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/BonePhysicsModule.cs @@ -4,15 +4,6 @@ namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics; -[StructLayout(LayoutKind.Explicit, Size = 0x78)] -public struct BoneSimulators { - [FieldOffset(0x00)] public StdVector> BoneSimulator_1; - [FieldOffset(0x18)] public StdVector> BoneSimulator_2; - [FieldOffset(0x30)] public StdVector> BoneSimulator_3; - [FieldOffset(0x48)] public StdVector> BoneSimulator_4; - [FieldOffset(0x60)] public StdVector> BoneSimulator_5; -} - // Client::Graphics::Physics::BonePhysicsModule [StructLayout(LayoutKind.Explicit, Size = 0x590)] [GenerateInterop] @@ -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> _bonePhysicsResourceHandles; + [FieldOffset(0x118)] public BoneCollisions BoneCollisions; + [FieldOffset(0x190), FixedSizeArray] internal FixedSizeArray5> _bonePhysicsResourceHandles; // TODO: change element type to Pointer [FieldOffset(0x1B8)] public float FrameDeltaTime; [FieldOffset(0x578)] public float OverrideSimulationTime; - /// If true, returns OverrideSimulationTime when GetSimulationTime is called and FrameDeltaTime is above ~0.01667 (60 FPS.) + /// If , returns when is called and is above ~0.01667 (60 FPS.) [FieldOffset(0x588)] public bool UseOverrideSimulationTime; - /// Used to set BoneSimulator.SimulationTimeInv, and in turn calls GetSimulationTime. + /// Used to set , and in turn calls . [MemberFunction("E8 ?? ?? ?? ?? 0F 2F C6 76 ?? 48 8B CE")] public partial float GetSimulationTimeInv(); - /// Limits the returned value to 60 FPS, used to set BoneSimulator.SimulationTime. + /// Limits the returned value to 60 FPS, used to set . [MemberFunction("E8 ?? ?? ?? ?? F3 0F 5E F0 F3 0F 11 43")] public partial float GetSimulationTime(); + + /// Creates job data based on the lists in and . + [MemberFunction("E8 ?? ?? ?? ?? 48 8D 7F ?? 48 83 EB ?? 75 ?? 48 8B 45")] + public partial void CreateJobData(BonePhysicsUpdater* updater); + + /// + /// Loads data into the vector in and corresponding to resourceIndex. + /// This resource handle is then stored in . + /// + [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> BoneSimulator_1; + [FieldOffset(0x18)] public StdVector> BoneSimulator_2; + [FieldOffset(0x30)] public StdVector> BoneSimulator_3; + [FieldOffset(0x48)] public StdVector> BoneSimulator_4; + [FieldOffset(0x60)] public StdVector> BoneSimulator_5; +} + +[StructLayout(LayoutKind.Explicit, Size = 0x78)] +public struct BoneCollisions { + [FieldOffset(0x00)] public StdVector> BoneCollision_1; + [FieldOffset(0x18)] public StdVector> BoneCollision_2; + [FieldOffset(0x30)] public StdVector> BoneCollision_3; + [FieldOffset(0x48)] public StdVector> BoneCollision_4; + [FieldOffset(0x60)] public StdVector> BoneCollision_5; } diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/BonePhysicsUpdater.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/BonePhysicsUpdater.cs index 04e413fa2d..5eed0a5bb1 100644 --- a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/BonePhysicsUpdater.cs +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/BonePhysicsUpdater.cs @@ -8,14 +8,26 @@ public unsafe partial struct BonePhysicsUpdater { [FieldOffset(0xE0)] public JobSystem BoneSimulatorJob; [FieldOffset(0x1A0)] public JobSystem TransformUpdaterJob; - /// This is executed by BoneSimulatorUpdateJob. + /// This is executed by BoneSimulatorJob. [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); + /// This is executed by CollisionObjectJob. + [MemberFunction("48 89 5C 24 ?? 57 48 83 EC ?? 48 8B 3A 48 8B 5F")] + public partial void CollisionObjectTask(CollisionObjectJobData* data); + + /// Structure passed to BoneSimulatorTask. [GenerateInterop] [StructLayout(LayoutKind.Explicit, Size = 0x10)] public partial struct UpdateBoneSimulatorJobData { [FieldOffset(0x0)] public BoneSimulator* BoneSimulator; [FieldOffset(0x8)] public BonePhysicsModule* BonePhysicsModule; } + + /// Structure passed to CollisionObjectTask. + [GenerateInterop] + [StructLayout(LayoutKind.Explicit, Size = 0x8)] + public partial struct CollisionObjectJobData { + [FieldOffset(0x0)] public CollisionBase* CollisionObject; + } } diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/BoneSimulator.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/BoneSimulator.cs index e055704527..05738069ef 100644 --- a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/BoneSimulator.cs +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/BoneSimulator.cs @@ -16,6 +16,9 @@ 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 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 @@ -23,6 +26,9 @@ public unsafe partial struct BoneSimulator { [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; /// Non-exhaustive list of physics groups public enum PhysicsGroup : uint { @@ -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); + + /// Resets a lot of stuff and clears the Skeleton field? + [VirtualFunction(1)] + public partial void ClearSkeleton(); + /// Called when IsTimeIntegrating is true. [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); @@ -47,4 +66,8 @@ public enum PhysicsGroup : uint { /// Reset this bone simulator. [MemberFunction("E8 ?? ?? ?? ?? 48 8B 77 ?? 48 8D 8E")] public partial void Reset(); + + /// Sets the skeleton for this bone simulator, also calls Reset. + [MemberFunction("E8 ?? ?? ?? ?? 41 0F B6 44 24 ?? 41 89 45")] + public partial bool SetSkeleton(Skeleton* skeleton); } diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionBase.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionBase.cs new file mode 100644 index 0000000000..aafc37d416 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionBase.cs @@ -0,0 +1,27 @@ +namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics; + +// Client::Graphics::Physics::CollisionBase +// Client::Graphics::ReferencedClassBase +[GenerateInterop(isInherited: true)] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0x90)] +public unsafe partial struct CollisionBase { + /// Set in constructor. + [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 { + /// Corresponds to . + Capsule = 0, + /// Corresponds to . + Ellipsoid = 1, + /// Corresponds to . + NormalPlane = 2, + /// Corresponds to . + ThreePointPlane = 3, + /// Corresponds to . + Sphere = 4, +} diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionCapsule.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionCapsule.cs new file mode 100644 index 0000000000..070a40a604 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionCapsule.cs @@ -0,0 +1,12 @@ +namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics; + +// Client::Graphics::Physics::CollisionCapsule +// Client::Graphics::Physics::CollisionBase +// Client::Graphics::ReferencedClassBase +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0x120)] +public unsafe partial struct CollisionCapsule { + [MemberFunction("E8 ?? ?? ?? ?? 48 8B D8 48 89 5C 24")] + public partial CollisionCapsule* Ctor(); +} diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionEllipsoid.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionEllipsoid.cs new file mode 100644 index 0000000000..0eaefbc0c3 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionEllipsoid.cs @@ -0,0 +1,12 @@ +namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics; + +// Client::Graphics::Physics::CollisionEllipsoid +// Client::Graphics::Physics::CollisionBase +// Client::Graphics::ReferencedClassBase +[GenerateInterop] +[Inherits] +[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(); +} diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionNormalPlane.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionNormalPlane.cs new file mode 100644 index 0000000000..a1e8f3b059 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionNormalPlane.cs @@ -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] +[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(); +} diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionPlane.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionPlane.cs new file mode 100644 index 0000000000..fbd4dda4df --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionPlane.cs @@ -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] +[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); +} diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionSphere.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionSphere.cs new file mode 100644 index 0000000000..a5bb27da49 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionSphere.cs @@ -0,0 +1,12 @@ +namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics; + +// Client::Graphics::Physics::CollisionSphere +// Client::Graphics::Physics::CollisionBase +// Client::Graphics::ReferencedClassBase +[GenerateInterop] +[Inherits] +[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(); +} diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionThreePointPlane.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionThreePointPlane.cs new file mode 100644 index 0000000000..1b44283800 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/CollisionThreePointPlane.cs @@ -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] +[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(); +} diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/ConstraintAttract.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/ConstraintAttract.cs new file mode 100644 index 0000000000..248facf00c --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/ConstraintAttract.cs @@ -0,0 +1,11 @@ +namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics; + +// Client::Graphics::Physics::ConstraintAttract +// Client::Graphics::Physics::ConstraintBase +[GenerateInterop] +[Inherits] +[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(); +} diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/ConstraintBase.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/ConstraintBase.cs new file mode 100644 index 0000000000..2852664cdf --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/ConstraintBase.cs @@ -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 { + /// Set in constructor. + [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 { + /// Corresponds to . + Spring = 0, + /// Corresponds to . + Attract = 1, + /// Corresponds to . + Pin = 2, +} diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/ConstraintPin.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/ConstraintPin.cs new file mode 100644 index 0000000000..b4480feb13 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/ConstraintPin.cs @@ -0,0 +1,11 @@ +namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics; + +// Client::Graphics::Physics::ConstraintPin +// Client::Graphics::Physics::ConstraintBase +[GenerateInterop] +[Inherits] +[StructLayout(LayoutKind.Explicit, Size = 0x50)] +public unsafe partial struct ConstraintPin { + [MemberFunction("E8 ?? ?? ?? ?? 48 8B F0 48 8B 57")] + public partial ConstraintPin* Ctor(); +} diff --git a/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/ConstraintSpring.cs b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/ConstraintSpring.cs new file mode 100644 index 0000000000..ed6175e819 --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/Graphics/Physics/ConstraintSpring.cs @@ -0,0 +1,11 @@ +namespace FFXIVClientStructs.FFXIV.Client.Graphics.Physics; + +// Client::Graphics::Physics::ConstraintSpring +// Client::Graphics::Physics::ConstraintBase +[GenerateInterop] +[Inherits] +[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(); +} diff --git a/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/BonePhysicsResourceHandle.cs b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/BonePhysicsResourceHandle.cs new file mode 100644 index 0000000000..deecbaea5f --- /dev/null +++ b/FFXIVClientStructs/FFXIV/Client/System/Resource/Handle/BonePhysicsResourceHandle.cs @@ -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] +[StructLayout(LayoutKind.Explicit, Size = 0x120)] +public partial struct BonePhysicsResourceHandle; diff --git a/ida/data.yml b/ida/data.yml index 432c5fa69d..dfdf794a60 100644 --- a/ida/data.yml +++ b/ida/data.yml @@ -24953,6 +24953,7 @@ classes: 0x1417ECF30: ctor 0x1417ED0C0: Initialize 0x1417EDB20: Update + 0x1417EE080: CollisionObjectTask 0x1417EE0E0: BoneSimulatorTask Client::Graphics::Physics::BonePhysicsModule: vtbls: @@ -24963,6 +24964,8 @@ classes: 0x1418B0CA0: ctor 0x1418B0E00: Finalizer 0x1418B0EE0: Initialize + 0x1418B14D0: CreateJobData + 0x1418B1600: Load 0x1418B44F0: GetSimulationTime 0x1418B4590: GetSimulationTimeInv Client::Graphics::Physics::BoneKineDriverModule: @@ -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 @@ -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: