From 17fcbf8c43c49d3c7d4f01340aaffd8267dde603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Sat, 18 Dec 2021 14:50:33 +0100 Subject: [PATCH] Havok: Add hkpWorldCinfo --- data/uking_functions.csv | 16 +- lib/hkStubs/.clang-tidy | 2 +- lib/hkStubs/CMakeLists.txt | 34 +++-- .../Common/Base/Container/Array/hkArray.h | 60 ++++++++ .../Base/Container/hkContainerAllocators.h | 23 +++ .../Havok/Common/Base/Math/Vector/hkVector4.h | 14 +- .../Common/Base/Math/Vector/hkVector4f.h | 42 +++++ .../Common/Base/Types/Geometry/Aabb/hkAabb.h | 17 +++ .../Havok/Common/Base/Types/hkBaseTypes.h | 20 +++ .../Havok/Common/Base/Types/hkRefPtr.h | 143 ++++++++++++++++++ .../Collide/Shape/Convex/hkpConvexShape.h | 6 - .../Shape/HeightField/hkpSphereRepShape.h | 6 - .../Havok/Physics/Dynamics/World/hkpWorld.cpp | 3 - .../Filter/hkpCollidableCollidableFilter.h | 13 ++ .../Collide/Filter/hkpCollisionFilter.h | 64 ++++++++ .../Collide/Filter/hkpConvexListFilter.h | 28 ++++ .../Collide/Filter/hkpRayCollidableFilter.h | 14 ++ .../Collide/Filter/hkpShapeCollectionFilter.h | 33 ++++ .../Shape/Convex/Capsule/hkpCapsuleShape.h | 2 +- .../Collide/Shape/Convex/hkpConvexShape.h | 6 + .../Shape/HeightField/hkpSphereRepShape.h | 6 + .../Shape/Query/hkpRayShapeCollectionFilter.h | 16 ++ .../Collide/Shape/hkpShape.h | 1 + .../Physics2012/Collide/Shape/hkpShapeBase.h | 8 + .../Dynamics/Entity/hkpEntity.h | 2 +- .../Dynamics/Entity/hkpRigidBody.h | 2 +- .../Default/hkpDefaultWorldMemoryWatchDog.h | 25 +++ .../Memory/hkpWorldMemoryAvailableWatchDog.h | 28 ++++ .../Physics2012/Dynamics/World/hkpWorld.cpp | 3 + .../Dynamics/World/hkpWorld.h | 0 .../Dynamics/World/hkpWorldCinfo.cpp | 135 +++++++++++++++++ .../Dynamics/World/hkpWorldCinfo.h | 123 +++++++++++++++ .../Dynamics/World/hkpWorldEntity.h | 2 +- .../RigidBody/Shape/physCapsuleShape.cpp | 2 +- .../RigidBody/Shape/physCapsuleShape.h | 2 +- .../Physics/RigidBody/physRigidBody.cpp | 2 +- 36 files changed, 851 insertions(+), 52 deletions(-) create mode 100644 lib/hkStubs/Havok/Common/Base/Container/Array/hkArray.h create mode 100644 lib/hkStubs/Havok/Common/Base/Container/hkContainerAllocators.h create mode 100644 lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4f.h create mode 100644 lib/hkStubs/Havok/Common/Base/Types/Geometry/Aabb/hkAabb.h create mode 100644 lib/hkStubs/Havok/Common/Base/Types/hkRefPtr.h delete mode 100644 lib/hkStubs/Havok/Physics/Collide/Shape/Convex/hkpConvexShape.h delete mode 100644 lib/hkStubs/Havok/Physics/Collide/Shape/HeightField/hkpSphereRepShape.h delete mode 100644 lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorld.cpp create mode 100644 lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpCollidableCollidableFilter.h create mode 100644 lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpCollisionFilter.h create mode 100644 lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpConvexListFilter.h create mode 100644 lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpRayCollidableFilter.h create mode 100644 lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpShapeCollectionFilter.h rename lib/hkStubs/Havok/{Physics => Physics2012}/Collide/Shape/Convex/Capsule/hkpCapsuleShape.h (80%) create mode 100644 lib/hkStubs/Havok/Physics2012/Collide/Shape/Convex/hkpConvexShape.h create mode 100644 lib/hkStubs/Havok/Physics2012/Collide/Shape/HeightField/hkpSphereRepShape.h create mode 100644 lib/hkStubs/Havok/Physics2012/Collide/Shape/Query/hkpRayShapeCollectionFilter.h rename lib/hkStubs/Havok/{Physics => Physics2012}/Collide/Shape/hkpShape.h (79%) create mode 100644 lib/hkStubs/Havok/Physics2012/Collide/Shape/hkpShapeBase.h rename lib/hkStubs/Havok/{Physics => Physics2012}/Dynamics/Entity/hkpEntity.h (88%) rename lib/hkStubs/Havok/{Physics => Physics2012}/Dynamics/Entity/hkpRigidBody.h (72%) create mode 100644 lib/hkStubs/Havok/Physics2012/Dynamics/World/Memory/Default/hkpDefaultWorldMemoryWatchDog.h create mode 100644 lib/hkStubs/Havok/Physics2012/Dynamics/World/Memory/hkpWorldMemoryAvailableWatchDog.h create mode 100644 lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorld.cpp rename lib/hkStubs/Havok/{Physics => Physics2012}/Dynamics/World/hkpWorld.h (100%) create mode 100644 lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorldCinfo.cpp create mode 100644 lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorldCinfo.h rename lib/hkStubs/Havok/{Physics => Physics2012}/Dynamics/World/hkpWorldEntity.h (90%) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index bc351901..8e22c0e9 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -78787,7 +78787,7 @@ Address,Quality,Size,Name 0x0000007100e71764,U,001160,sinitHorseStrings 0x0000007100e71bec,U,000604, 0x0000007100e71e48,U,000088, -0x0000007100e71ea0,U,000004,nullsub_3986 +0x0000007100e71ea0,O,000004,_ZN12hkBaseObject32__first_virtual_table_function__Ev 0x0000007100e71ea4,U,000204, 0x0000007100e71f70,U,000092, 0x0000007100e71fcc,U,000008, @@ -83582,7 +83582,7 @@ Address,Quality,Size,Name 0x0000007100fabcdc,O,000008,_ZNK4ksys4phys11CapsuleBody8getShapeEv 0x0000007100fabce4,U,000252, 0x0000007100fabde0,U,000160, -0x0000007100fabe80,m,000192,_ZN4ksys4phys11CapsuleBody14sub_7100FABE80EPN4sead7Vector3IfEES5_RK9hkVector4 +0x0000007100fabe80,m,000192,_ZN4ksys4phys11CapsuleBody14sub_7100FABE80EPN4sead7Vector3IfEES5_RK10hkVector4f 0x0000007100fabf40,U,000204, 0x0000007100fac00c,U,000092, 0x0000007100fac068,U,000008, @@ -95462,13 +95462,13 @@ Address,Quality,Size,Name 0x00000071012b3ce8,U,000052, 0x00000071012b3d1c,U,000104, 0x00000071012b3d84,U,000104, -0x00000071012b3dec,U,000356, +0x00000071012b3dec,O,000356,_ZN13hkpWorldCinfoD2Ev 0x00000071012b3f50,U,000096, 0x00000071012b3fb0,U,000024, 0x00000071012b3fc8,U,000024, 0x00000071012b3fe0,U,000112, 0x00000071012b4050,U,000092, -0x00000071012b40ac,U,000088, +0x00000071012b40ac,O,000088,_ZN13hkpWorldCinfoD0Ev 0x00000071012b4104,U,000032, 0x00000071012b4124,U,000252, 0x00000071012b4220,U,000084, @@ -105210,10 +105210,10 @@ Address,Quality,Size,Name 0x0000007101607d74,U,000092, 0x0000007101607dd0,U,000068, 0x0000007101607e14,U,000232, -0x0000007101607efc,L,000344,hkpWorldCinfo::hkpWorldCinfo -0x0000007101608054,U,000032, -0x0000007101608074,U,000244, -0x0000007101608168,U,000084, +0x0000007101607efc,L,000344,_ZN13hkpWorldCinfoC1Ev +0x0000007101608054,L,000032,_ZN13hkpWorldCinfo22setBroadPhaseWorldSizeEf +0x0000007101608074,L,000244,_ZN13hkpWorldCinfo15setupSolverInfoENS_10SolverTypeE +0x0000007101608168,L,000084,_ZN13hkpWorldCinfoC1E24hkFinishLoadedObjectFlag 0x00000071016081bc,L,000968,hkpWorldOperationUtil::updateEntityBP 0x0000007101608584,U,000452, 0x0000007101608748,U,000432, diff --git a/lib/hkStubs/.clang-tidy b/lib/hkStubs/.clang-tidy index 31a44c37..da736435 100644 --- a/lib/hkStubs/.clang-tidy +++ b/lib/hkStubs/.clang-tidy @@ -1,3 +1,3 @@ --- InheritParentConfig: true -Checks: "-modernize-use-equals-default" +Checks: "-modernize-use-equals-default,-cppcoreguidelines-pro-type-member-init" diff --git a/lib/hkStubs/CMakeLists.txt b/lib/hkStubs/CMakeLists.txt index 3ec0a122..e8264c94 100644 --- a/lib/hkStubs/CMakeLists.txt +++ b/lib/hkStubs/CMakeLists.txt @@ -3,10 +3,13 @@ project(hkStubs CXX ASM) add_library(hkStubs OBJECT Havok/Common/Base/hkBase.h + Havok/Common/Base/Container/hkContainerAllocators.h + Havok/Common/Base/Container/Array/hkArray.h Havok/Common/Base/Container/String/hkStringPtr.h Havok/Common/Base/Math/hkMath.h Havok/Common/Base/Math/Vector/hkVector4.h + Havok/Common/Base/Math/Vector/hkVector4f.h Havok/Common/Base/Memory/Allocator/hkMemoryAllocator.h Havok/Common/Base/Memory/Allocator/Lifo/hkLifoAllocator.h @@ -21,17 +24,30 @@ add_library(hkStubs OBJECT Havok/Common/Base/Types/hkBaseDefs.h Havok/Common/Base/Types/hkBaseTypes.h + Havok/Common/Base/Types/hkRefPtr.h + Havok/Common/Base/Types/Geometry/Aabb/hkAabb.h - Havok/Physics/Collide/Shape/hkpShape.h - Havok/Physics/Collide/Shape/Convex/hkpConvexShape.h - Havok/Physics/Collide/Shape/Convex/Capsule/hkpCapsuleShape.h - Havok/Physics/Collide/Shape/HeightField/hkpSphereRepShape.h + Havok/Physics2012/Collide/Filter/hkpCollidableCollidableFilter.h + Havok/Physics2012/Collide/Filter/hkpCollisionFilter.h + Havok/Physics2012/Collide/Filter/hkpConvexListFilter.h + Havok/Physics2012/Collide/Filter/hkpRayCollidableFilter.h + Havok/Physics2012/Collide/Filter/hkpShapeCollectionFilter.h + Havok/Physics2012/Collide/Shape/hkpShape.h + Havok/Physics2012/Collide/Shape/hkpShapeBase.h + Havok/Physics2012/Collide/Shape/Convex/hkpConvexShape.h + Havok/Physics2012/Collide/Shape/Convex/Capsule/hkpCapsuleShape.h + Havok/Physics2012/Collide/Shape/HeightField/hkpSphereRepShape.h + Havok/Physics2012/Collide/Shape/Query/hkpRayShapeCollectionFilter.h - Havok/Physics/Dynamics/Entity/hkpEntity.h - Havok/Physics/Dynamics/Entity/hkpRigidBody.h - Havok/Physics/Dynamics/World/hkpWorld.cpp - Havok/Physics/Dynamics/World/hkpWorld.h - Havok/Physics/Dynamics/World/hkpWorldEntity.h + Havok/Physics2012/Dynamics/Entity/hkpEntity.h + Havok/Physics2012/Dynamics/Entity/hkpRigidBody.h + Havok/Physics2012/Dynamics/World/hkpWorld.cpp + Havok/Physics2012/Dynamics/World/hkpWorld.h + Havok/Physics2012/Dynamics/World/hkpWorldCinfo.cpp + Havok/Physics2012/Dynamics/World/hkpWorldCinfo.h + Havok/Physics2012/Dynamics/World/hkpWorldEntity.h + Havok/Physics2012/Dynamics/World/Memory/hkpWorldMemoryAvailableWatchDog.h + Havok/Physics2012/Dynamics/World/Memory/Default/hkpDefaultWorldMemoryWatchDog.h ) target_compile_options(hkStubs PRIVATE -fno-exceptions) diff --git a/lib/hkStubs/Havok/Common/Base/Container/Array/hkArray.h b/lib/hkStubs/Havok/Common/Base/Container/Array/hkArray.h new file mode 100644 index 00000000..ccfeee69 --- /dev/null +++ b/lib/hkStubs/Havok/Common/Base/Container/Array/hkArray.h @@ -0,0 +1,60 @@ +#pragma once + +#include +#include +#include + +/// Base class for hkArray (a std::vector-like container). +// FIXME: incomplete +template +class hkArrayBase { +public: + HK_DECLARE_CLASS_ALLOCATOR(hkArrayBase) + + enum : int { + CAPACITY_MASK = 0x3FFFFFFF, + FLAG_MASK = 0xC0000000, + DONT_DEALLOCATE_FLAG = 0x80000000, + }; + + HK_FORCE_INLINE hkArrayBase(); + explicit hkArrayBase(hkFinishLoadedObjectFlag f) {} + + HK_FORCE_INLINE ~hkArrayBase(); + + hkArrayBase(const hkArrayBase&) = delete; + auto operator=(const hkArrayBase&) = delete; + +protected: + T* m_data; + int m_size; + int m_capacityAndFlags; +}; + +/// A dynamically resizable array, similar to std::vector. +// FIXME: incomplete +template +class hkArray : public hkArrayBase { +public: + using AllocatorType = Allocator; + + HK_FORCE_INLINE hkArray() = default; + explicit hkArray(hkFinishLoadedObjectFlag f) : hkArrayBase(f) {} + + HK_FORCE_INLINE ~hkArray(); + + HK_FORCE_INLINE hkArray& operator=(const hkArrayBase& other); + HK_FORCE_INLINE hkArray& operator=(const hkArray& other); + +protected: + HK_FORCE_INLINE hkArray(const hkArray& other); +}; + +template +inline hkArrayBase::hkArrayBase() + : m_data(nullptr), m_size(0), m_capacityAndFlags(DONT_DEALLOCATE_FLAG) {} + +template +inline hkArrayBase::~hkArrayBase() { + // Assert non-POD element destruction +} diff --git a/lib/hkStubs/Havok/Common/Base/Container/hkContainerAllocators.h b/lib/hkStubs/Havok/Common/Base/Container/hkContainerAllocators.h new file mode 100644 index 00000000..257e6629 --- /dev/null +++ b/lib/hkStubs/Havok/Common/Base/Container/hkContainerAllocators.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include + +struct hkContainerHeapAllocator { + HK_DECLARE_CLASS_ALLOCATOR(hkContainerHeapAllocator) + + struct Allocator : hkMemoryAllocator { + HK_DECLARE_CLASS_ALLOCATOR(Allocator) + + void* blockAlloc(int numBytes) override; + void blockFree(void* p, int numBytes) override; + void* bufAlloc(int& reqNumBytesInOut) override; + void bufFree(void* p, int numBytes) override; + void* bufRealloc(void* pold, int oldNumBytes, int& reqNumBytesInOut) override; + void getMemoryStatistics(MemoryStatistics& u) const override; + int getAllocatedSize(const void* obj, int nbytes) const override; + }; + + static Allocator s_alloc; + static hkMemoryAllocator& get() { return s_alloc; } +}; diff --git a/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4.h b/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4.h index 6ca0f7ee..2fdfc076 100644 --- a/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4.h +++ b/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4.h @@ -1,15 +1,5 @@ #pragma once -class hkVector4 { -public: - hkVector4() {} - hkVector4(hkReal x, hkReal y, hkReal z, hkReal w = 0) { - v[0] = x; - v[1] = y; - v[2] = z; - v[3] = w; - } - m128 v; +#include - void sub_7100FABE80(const hkVector4&, const hkVector4&); -}; +using hkVector4 = hkVector4f; diff --git a/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4f.h b/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4f.h new file mode 100644 index 00000000..f8436323 --- /dev/null +++ b/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4f.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include +#include + +class hkVector4f { +public: + HK_DECLARE_CLASS_ALLOCATOR(hkVector4f) + + HK_FORCE_INLINE hkVector4f() {} + HK_FORCE_INLINE hkVector4f(hkReal x, hkReal y, hkReal z, hkReal w = 0); + + // This prevents hkVector4f from being passed in registers. + // NOLINTNEXTLINE(modernize-use-equals-default) + HK_FORCE_INLINE hkVector4f(const hkVector4f& other) : v(other.v) {} + + HK_FORCE_INLINE void set(hkReal x, hkReal y, hkReal z, hkReal w = 0); + HK_FORCE_INLINE void setAll(hkReal x); + + void sub_7100FABE80(const hkVector4f&, const hkVector4f&); + + m128 v; +}; + +inline hkVector4f::hkVector4f(hkReal x, hkReal y, hkReal z, hkReal w) { + v[0] = x; + v[1] = y; + v[2] = z; + v[3] = w; +} + +inline void hkVector4f::set(hkReal x, hkReal y, hkReal z, hkReal w) { + v[0] = x; + v[1] = y; + v[2] = z; + v[3] = w; +} + +inline void hkVector4f::setAll(hkReal x) { + v = {x, x, x, x}; +} diff --git a/lib/hkStubs/Havok/Common/Base/Types/Geometry/Aabb/hkAabb.h b/lib/hkStubs/Havok/Common/Base/Types/Geometry/Aabb/hkAabb.h new file mode 100644 index 00000000..05a9960a --- /dev/null +++ b/lib/hkStubs/Havok/Common/Base/Types/Geometry/Aabb/hkAabb.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +/// Axis aligned bounding box +// FIXME: incomplete +class hkAabb { +public: + HK_DECLARE_CLASS_ALLOCATOR(hkAabb) + + hkAabb() {} + HK_FORCE_INLINE hkAabb(const hkVector4& min, const hkVector4& max) : m_min(min), m_max(max) {} + + hkVector4 m_min; + hkVector4 m_max; +}; diff --git a/lib/hkStubs/Havok/Common/Base/Types/hkBaseTypes.h b/lib/hkStubs/Havok/Common/Base/Types/hkBaseTypes.h index ee70e93c..714e7014 100644 --- a/lib/hkStubs/Havok/Common/Base/Types/hkBaseTypes.h +++ b/lib/hkStubs/Havok/Common/Base/Types/hkBaseTypes.h @@ -71,6 +71,26 @@ private: hkInt16 m_value; }; +class hkBool { +public: + HK_ALWAYS_INLINE hkBool() = default; + // NOLINTNEXTLINE(google-explicit-constructor) + HK_FORCE_INLINE hkBool(bool b) : m_bool(static_cast(b)) {} + + HK_FORCE_INLINE explicit operator bool() const { return m_bool != 0; } + + HK_FORCE_INLINE hkBool& operator=(bool e) { + m_bool = static_cast(e); + return *this; + } + + HK_FORCE_INLINE hkBool operator==(bool e) const { return (m_bool != 0) == e; } + HK_FORCE_INLINE hkBool operator!=(bool e) const { return (m_bool != 0) != e; } + +private: + char m_bool; +}; + /// For storing an enum with a particular storage size when specifying the underlying type of the /// enum is not an option. template diff --git a/lib/hkStubs/Havok/Common/Base/Types/hkRefPtr.h b/lib/hkStubs/Havok/Common/Base/Types/hkRefPtr.h new file mode 100644 index 00000000..e5dce9c8 --- /dev/null +++ b/lib/hkStubs/Havok/Common/Base/Types/hkRefPtr.h @@ -0,0 +1,143 @@ +#pragma once + +#include +#include +#include + +/// Owning reference. Assign to a hkRefPtr as soon as possible. +/// @warning This will NOT automatically destruct the contained object. +template +class hkRefNew { +public: + hkRefNew(T* ptr) : m_ptr(ptr) {} // NOLINT(google-explicit-constructor) + + hkRefNew(const hkRefNew&) = delete; + auto operator=(const hkRefNew&) = delete; + + T* release() { return std::exchange(m_ptr, nullptr); } + +private: + T* m_ptr; +}; + +/// A simple reference counting pointer intended to be used with hkReferencedObjects. +template +class hkRefPtr { +public: + /// Default constructor. Initializes the pointer to nullptr. + HK_FORCE_INLINE hkRefPtr(); + /// Copy constructor. Increments the reference count. + HK_FORCE_INLINE hkRefPtr(const hkRefPtr& other); + HK_FORCE_INLINE hkRefPtr(T* ptr); // NOLINT(google-explicit-constructor) + /// "Move" constructor. Steals the reference from ptr. + HK_FORCE_INLINE hkRefPtr(hkRefNew ptr); // NOLINT(google-explicit-constructor) + + HK_FORCE_INLINE explicit hkRefPtr(hkFinishLoadedObjectFlag); + + /// Decrements the reference count. + HK_FORCE_INLINE ~hkRefPtr(); + + HK_FORCE_INLINE hkRefPtr& operator=(const hkRefPtr& other); + HK_FORCE_INLINE hkRefPtr& operator=(T* ptr); + HK_FORCE_INLINE hkRefPtr& operator=(hkRefNew ptr); + + HK_FORCE_INLINE T* val() const; + HK_FORCE_INLINE T* operator->() const; + HK_FORCE_INLINE operator T*() const; // NOLINT(google-explicit-constructor) + + HK_FORCE_INLINE void setAndDontIncrementRefCount(T* ptr); + HK_FORCE_INLINE void unsetAndDontDecrementRefCount(); + +private: + void addReference() const { + if (m_ptr) + m_ptr->addReference(); + } + + void removeReference() const { + if (m_ptr) + m_ptr->removeReference(); + } + + T* m_ptr; +}; + +template +inline hkRefPtr::hkRefPtr() : m_ptr(nullptr) {} + +template +inline hkRefPtr::hkRefPtr(const hkRefPtr& other) { + other.addReference(); + m_ptr = other.m_ptr; +} + +template +inline hkRefPtr::hkRefPtr(T* ptr) { + if (ptr) + ptr->addReference(); + m_ptr = ptr; +} + +template +inline hkRefPtr::hkRefPtr(hkRefNew ptr) : m_ptr(ptr.release()) {} + +template +inline hkRefPtr::hkRefPtr(hkFinishLoadedObjectFlag) {} + +template +inline hkRefPtr::~hkRefPtr() { + removeReference(); + m_ptr = nullptr; +} + +template +// NOLINTNEXTLINE(bugprone-unhandled-self-assignment) +inline hkRefPtr& hkRefPtr::operator=(const hkRefPtr& other) { + other.addReference(); + removeReference(); + m_ptr = other.m_ptr; + return *this; +} + +template +inline hkRefPtr& hkRefPtr::operator=(T* ptr) { + if (ptr) + ptr->addReference(); + removeReference(); + m_ptr = ptr; + return *this; +} + +template +inline hkRefPtr& hkRefPtr::operator=(hkRefNew ptr) { + removeReference(); + m_ptr = ptr.release(); + return *this; +} + +template +inline T* hkRefPtr::val() const { + return m_ptr; +} + +template +inline T* hkRefPtr::operator->() const { + return val(); +} + +template +inline hkRefPtr::operator T*() const { + return val(); +} + +template +inline void hkRefPtr::setAndDontIncrementRefCount(T* ptr) { + if (m_ptr && m_ptr != ptr) + m_ptr->removeReference(); + m_ptr = ptr; +} + +template +inline void hkRefPtr::unsetAndDontDecrementRefCount() { + m_ptr = nullptr; +} diff --git a/lib/hkStubs/Havok/Physics/Collide/Shape/Convex/hkpConvexShape.h b/lib/hkStubs/Havok/Physics/Collide/Shape/Convex/hkpConvexShape.h deleted file mode 100644 index b742852e..00000000 --- a/lib/hkStubs/Havok/Physics/Collide/Shape/Convex/hkpConvexShape.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include - -// TODO -class hkpConvexShape {}; diff --git a/lib/hkStubs/Havok/Physics/Collide/Shape/HeightField/hkpSphereRepShape.h b/lib/hkStubs/Havok/Physics/Collide/Shape/HeightField/hkpSphereRepShape.h deleted file mode 100644 index 4e48a478..00000000 --- a/lib/hkStubs/Havok/Physics/Collide/Shape/HeightField/hkpSphereRepShape.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include - -// TODO -class hkpSphereRepShape {}; diff --git a/lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorld.cpp b/lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorld.cpp deleted file mode 100644 index c51ce06c..00000000 --- a/lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorld.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "Havok/Physics/Dynamics/World/hkpWorld.h" - -hkpWorld::hkpWorld() {} diff --git a/lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpCollidableCollidableFilter.h b/lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpCollidableCollidableFilter.h new file mode 100644 index 00000000..4aa294db --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpCollidableCollidableFilter.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +class hkpCollidable; + +class hkpCollidableCollidableFilter { +public: + virtual ~hkpCollidableCollidableFilter() = default; + + /// Whether the two objects can collide. + virtual hkBool isCollisionEnabled(const hkpCollidable& a, const hkpCollidable& b) const = 0; +}; diff --git a/lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpCollisionFilter.h b/lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpCollisionFilter.h new file mode 100644 index 00000000..15be42c3 --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpCollisionFilter.h @@ -0,0 +1,64 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +class hkpWorld; + +class hkpCollisionFilter : public hkReferencedObject, + public hkpCollidableCollidableFilter, + public hkpShapeCollectionFilter, + public hkpRayShapeCollectionFilter, + public hkpRayCollidableFilter { +public: + HK_DECLARE_CLASS_ALLOCATOR(hkpCollisionFilter) + + enum hkpFilterType { + HK_FILTER_UNKNOWN = 0, + HK_FILTER_NULL = 1, + HK_FILTER_GROUP = 2, + HK_FILTER_LIST = 3, + HK_FILTER_CUSTOM = 4, + HK_FILTER_PAIR = 5, + HK_FILTER_CONSTRAINT = 6, + }; + + hkpCollisionFilter(); + explicit hkpCollisionFilter(hkFinishLoadedObjectFlag flag) : hkReferencedObject(flag) {} + + virtual void init(hkpWorld* world) {} + + hkBool isCollisionEnabled(const hkpCollidable& a, const hkpCollidable& b) const override = 0; + + hkBool isCollisionEnabled(const hkpCollisionInput& input, const hkpCdBody& a, + const hkpCdBody& b, const hkpShapeContainer& bContainer, + hkpShapeKey bKey) const override = 0; + + hkBool isCollisionEnabled(const hkpCollisionInput& input, const hkpCdBody& collectionBodyA, + const hkpCdBody& collectionBodyB, + const hkpShapeContainer& containerShapeA, + const hkpShapeContainer& containerShapeB, hkpShapeKey keyA, + hkpShapeKey keyB) const override = 0; + + int numShapeKeyHitsLimitBreached(const hkpCollisionInput& input, const hkpCdBody& bodyA, + const hkpCdBody& bodyB, const hkpBvTreeShape* bvTreeShapeB, + hkAabb& aabb, hkpShapeKey* shapeKeysInOut, + int shapeKeysCapacity) const override; + + hkBool isCollisionEnabled(const hkpShapeRayCastInput& aInput, + const hkpShapeContainer& bContainer, + hkpShapeKey bKey) const override = 0; + + hkBool isCollisionEnabled(const hkpWorldRayCastInput& a, + const hkpCollidable& collidableB) const override = 0; + +public: + hkUint32 m_prepad[2]; + hkEnum m_type; + hkUint32 m_postpad[3]; +}; diff --git a/lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpConvexListFilter.h b/lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpConvexListFilter.h new file mode 100644 index 00000000..059b7128 --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpConvexListFilter.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include + +class hkpCdBody; +class hkpCollisionInput; + +class hkpConvexListFilter : public hkReferencedObject { +public: + HK_DECLARE_CLASS_ALLOCATOR(hkpConvexListFilter) + + enum ConvexListCollisionType { + TREAT_CONVEX_LIST_AS_NORMAL, + TREAT_CONVEX_LIST_AS_LIST, + TREAT_CONVEX_LIST_AS_CONVEX, + }; + + virtual ConvexListCollisionType + getConvexListCollisionType(const hkpCdBody& convexListBody, const hkpCdBody& otherBody, + const hkpCollisionInput& input) const = 0; + +public: + explicit hkpConvexListFilter(hkFinishLoadedObjectFlag flag) : hkReferencedObject(flag) {} + +protected: + hkpConvexListFilter() = default; +}; diff --git a/lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpRayCollidableFilter.h b/lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpRayCollidableFilter.h new file mode 100644 index 00000000..e909d410 --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpRayCollidableFilter.h @@ -0,0 +1,14 @@ +#pragma once + +#include + +class hkpWorldRayCastInput; +class hkpCollidable; + +class hkpRayCollidableFilter { +public: + virtual ~hkpRayCollidableFilter() = default; + + virtual hkBool isCollisionEnabled(const hkpWorldRayCastInput& a, + const hkpCollidable& collidableB) const = 0; +}; diff --git a/lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpShapeCollectionFilter.h b/lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpShapeCollectionFilter.h new file mode 100644 index 00000000..6d8c8778 --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Collide/Filter/hkpShapeCollectionFilter.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include + +class hkAabb; +class hkpBvTreeShape; +class hkpCdBody; +class hkpCollisionInput; +class hkpShapeContainer; + +class hkpShapeCollectionFilter { +public: + virtual hkBool isCollisionEnabled(const hkpCollisionInput& input, const hkpCdBody& bodyA, + const hkpCdBody& collectionBodyB, + const hkpShapeContainer& containerShapeB, + hkpShapeKey keyB) const = 0; + + virtual hkBool isCollisionEnabled(const hkpCollisionInput& input, + const hkpCdBody& collectionBodyA, + const hkpCdBody& collectionBodyB, + const hkpShapeContainer& containerShapeA, + const hkpShapeContainer& containerShapeB, hkpShapeKey keyA, + hkpShapeKey keyB) const = 0; + + virtual int numShapeKeyHitsLimitBreached(const hkpCollisionInput& input, const hkpCdBody& bodyA, + const hkpCdBody& bodyB, + const hkpBvTreeShape* bvTreeShapeB, hkAabb& aabb, + hkpShapeKey* shapeKeysInOut, + int shapeKeysCapacity) const = 0; + + virtual ~hkpShapeCollectionFilter() = default; +}; diff --git a/lib/hkStubs/Havok/Physics/Collide/Shape/Convex/Capsule/hkpCapsuleShape.h b/lib/hkStubs/Havok/Physics2012/Collide/Shape/Convex/Capsule/hkpCapsuleShape.h similarity index 80% rename from lib/hkStubs/Havok/Physics/Collide/Shape/Convex/Capsule/hkpCapsuleShape.h rename to lib/hkStubs/Havok/Physics2012/Collide/Shape/Convex/Capsule/hkpCapsuleShape.h index 0935d807..1cc21fea 100644 --- a/lib/hkStubs/Havok/Physics/Collide/Shape/Convex/Capsule/hkpCapsuleShape.h +++ b/lib/hkStubs/Havok/Physics2012/Collide/Shape/Convex/Capsule/hkpCapsuleShape.h @@ -1,7 +1,7 @@ #pragma once #include -#include +#include class hkpCapsuleShape : public hkpShape { public: diff --git a/lib/hkStubs/Havok/Physics2012/Collide/Shape/Convex/hkpConvexShape.h b/lib/hkStubs/Havok/Physics2012/Collide/Shape/Convex/hkpConvexShape.h new file mode 100644 index 00000000..ad2e7be1 --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Collide/Shape/Convex/hkpConvexShape.h @@ -0,0 +1,6 @@ +#pragma once + +#include + +// TODO +class hkpConvexShape {}; diff --git a/lib/hkStubs/Havok/Physics2012/Collide/Shape/HeightField/hkpSphereRepShape.h b/lib/hkStubs/Havok/Physics2012/Collide/Shape/HeightField/hkpSphereRepShape.h new file mode 100644 index 00000000..ab1d7dd9 --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Collide/Shape/HeightField/hkpSphereRepShape.h @@ -0,0 +1,6 @@ +#pragma once + +#include + +// TODO +class hkpSphereRepShape {}; diff --git a/lib/hkStubs/Havok/Physics2012/Collide/Shape/Query/hkpRayShapeCollectionFilter.h b/lib/hkStubs/Havok/Physics2012/Collide/Shape/Query/hkpRayShapeCollectionFilter.h new file mode 100644 index 00000000..8c1ee83c --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Collide/Shape/Query/hkpRayShapeCollectionFilter.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include + +class hkpShapeRayCastInput; +class hkpShapeContainer; + +class hkpRayShapeCollectionFilter { +public: + virtual hkBool isCollisionEnabled(const hkpShapeRayCastInput& aInput, + const hkpShapeContainer& bContainer, + hkpShapeKey bKey) const = 0; + + virtual ~hkpRayShapeCollectionFilter() = default; +}; diff --git a/lib/hkStubs/Havok/Physics/Collide/Shape/hkpShape.h b/lib/hkStubs/Havok/Physics2012/Collide/Shape/hkpShape.h similarity index 79% rename from lib/hkStubs/Havok/Physics/Collide/Shape/hkpShape.h rename to lib/hkStubs/Havok/Physics2012/Collide/Shape/hkpShape.h index ed5acd02..a8fc1ead 100644 --- a/lib/hkStubs/Havok/Physics/Collide/Shape/hkpShape.h +++ b/lib/hkStubs/Havok/Physics2012/Collide/Shape/hkpShape.h @@ -2,6 +2,7 @@ #include +// FIXME: incomplete. Also this should be inheriting from hkpBase class hkpShape : public hkReferencedObject { public: virtual ~hkpShape(); diff --git a/lib/hkStubs/Havok/Physics2012/Collide/Shape/hkpShapeBase.h b/lib/hkStubs/Havok/Physics2012/Collide/Shape/hkpShapeBase.h new file mode 100644 index 00000000..0e869cda --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Collide/Shape/hkpShapeBase.h @@ -0,0 +1,8 @@ +#pragma once + +#include + +using hkpVertexId = hkUint16; +using hkpShapeKey = hkUint32; + +// FIXME: hkpShapeBase diff --git a/lib/hkStubs/Havok/Physics/Dynamics/Entity/hkpEntity.h b/lib/hkStubs/Havok/Physics2012/Dynamics/Entity/hkpEntity.h similarity index 88% rename from lib/hkStubs/Havok/Physics/Dynamics/Entity/hkpEntity.h rename to lib/hkStubs/Havok/Physics2012/Dynamics/Entity/hkpEntity.h index a51c2209..12059ceb 100644 --- a/lib/hkStubs/Havok/Physics/Dynamics/Entity/hkpEntity.h +++ b/lib/hkStubs/Havok/Physics2012/Dynamics/Entity/hkpEntity.h @@ -1,6 +1,6 @@ #pragma once -#include +#include class hkpMotion { public: diff --git a/lib/hkStubs/Havok/Physics/Dynamics/Entity/hkpRigidBody.h b/lib/hkStubs/Havok/Physics2012/Dynamics/Entity/hkpRigidBody.h similarity index 72% rename from lib/hkStubs/Havok/Physics/Dynamics/Entity/hkpRigidBody.h rename to lib/hkStubs/Havok/Physics2012/Dynamics/Entity/hkpRigidBody.h index 7a5a2534..baeab5c1 100644 --- a/lib/hkStubs/Havok/Physics/Dynamics/Entity/hkpRigidBody.h +++ b/lib/hkStubs/Havok/Physics2012/Dynamics/Entity/hkpRigidBody.h @@ -1,6 +1,6 @@ #pragma once -#include +#include class hkpRigidBody : public hkpEntity { public: diff --git a/lib/hkStubs/Havok/Physics2012/Dynamics/World/Memory/Default/hkpDefaultWorldMemoryWatchDog.h b/lib/hkStubs/Havok/Physics2012/Dynamics/World/Memory/Default/hkpDefaultWorldMemoryWatchDog.h new file mode 100644 index 00000000..fd1a5e99 --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Dynamics/World/Memory/Default/hkpDefaultWorldMemoryWatchDog.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +class hkpDefaultWorldMemoryWatchDog : public hkWorldMemoryAvailableWatchDog { +public: + HK_DECLARE_CLASS_ALLOCATOR(hkpDefaultWorldMemoryWatchDog) + + explicit hkpDefaultWorldMemoryWatchDog(hkInt32 freeHeapMemoryRequested = 20000); + + explicit hkpDefaultWorldMemoryWatchDog(hkFinishLoadedObjectFlag flag) + : hkWorldMemoryAvailableWatchDog(flag) {} + + hkInt32 getAmountOfFreeHeapMemoryRequested() override; + void freeHeapMemoryTillRequestedAmountIsAvailable(hkpWorld* world) override; + void reduceConstraintsInIsland(const MemUsageInfo& info, int numIterations) override; + +protected: + static void removeObjectsFromIsland(hkpSimulationIsland* island, + int minAutoRemoveLevelToProcess, + hkInt32 freeHeapMemoryRequested, + int& maxFoundAutoRemoveLevelOut); + + hkInt32 m_freeHeapMemoryRequested; +}; diff --git a/lib/hkStubs/Havok/Physics2012/Dynamics/World/Memory/hkpWorldMemoryAvailableWatchDog.h b/lib/hkStubs/Havok/Physics2012/Dynamics/World/Memory/hkpWorldMemoryAvailableWatchDog.h new file mode 100644 index 00000000..ef3f2023 --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Dynamics/World/Memory/hkpWorldMemoryAvailableWatchDog.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include + +class hkpSimulationIsland; +class hkpWorld; + +class hkWorldMemoryAvailableWatchDog : public hkReferencedObject { +public: + HK_DECLARE_CLASS_ALLOCATOR(hkWorldMemoryAvailableWatchDog) + + struct MemUsageInfo { + HK_DECLARE_CLASS_ALLOCATOR(MemUsageInfo) + + int m_maxRuntimeBlockSize; + int m_sumRuntimeBlockSize; + hkpSimulationIsland* m_largestSimulationIsland; + }; + + inline hkWorldMemoryAvailableWatchDog() = default; + inline explicit hkWorldMemoryAvailableWatchDog(hkFinishLoadedObjectFlag flag) + : hkReferencedObject(flag) {} + + virtual hkInt32 getAmountOfFreeHeapMemoryRequested() = 0; + virtual void freeHeapMemoryTillRequestedAmountIsAvailable(hkpWorld* world) = 0; + virtual void reduceConstraintsInIsland(const MemUsageInfo& info, int numIterations) = 0; +}; diff --git a/lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorld.cpp b/lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorld.cpp new file mode 100644 index 00000000..9b0d353f --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorld.cpp @@ -0,0 +1,3 @@ +#include "Havok/Physics2012/Dynamics/World/hkpWorld.h" + +hkpWorld::hkpWorld() {} diff --git a/lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorld.h b/lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorld.h similarity index 100% rename from lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorld.h rename to lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorld.h diff --git a/lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorldCinfo.cpp b/lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorldCinfo.cpp new file mode 100644 index 00000000..c45229ba --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorldCinfo.cpp @@ -0,0 +1,135 @@ +#include + +hkpWorldCinfo::hkpWorldCinfo() { + m_gravity = {0, -9.8, 0}; + m_enableSimulationIslands = true; + m_broadPhaseQuerySize = 1024; + m_mtPostponeAndSortBroadPhaseBorderCallbacks = false; + m_broadPhaseWorldAabb = {{-500, -500, -500}, {500, 500, 500}}; + m_collisionFilter = nullptr; + m_convexListFilter = nullptr; + m_broadPhaseNumMarkers = 0; + m_sizeOfToiEventQueue = 250; + m_solverTau = 0.6; + m_solverDamp = 1.0; + m_contactRestingVelocity = 1.0; + m_solverIterations = 4; + m_solverMicrosteps = 1; + m_maxConstraintViolation = 1.8446726e+19; + m_forceCoherentConstraintOrderingInSolver = false; + m_snapCollisionToConvexEdgeThreshold = 0.524; + m_snapCollisionToConcaveEdgeThreshold = 0.698; + m_enableToiWeldRejection = false; + m_collisionTolerance = 0.1; + m_broadPhaseType = BROADPHASE_TYPE_SAP; + m_broadPhaseBorderBehaviour = BROADPHASE_BORDER_ASSERT; + m_toiCollisionResponseRotateNormal = 0.2; + m_useCompoundSpuElf = false; + m_processToisMultithreaded = true; + m_maxSectorsPerMidphaseCollideTask = 2; + m_maxSectorsPerNarrowphaseCollideTask = 4; + m_maxEntriesPerToiMidphaseCollideTask = 4; + m_maxEntriesPerToiNarrowphaseCollideTask = 12; + m_maxNumToiCollisionPairsSinglethreaded = 0; + m_numToisTillAllowedPenetrationSimplifiedToi = 3.0; + m_numToisTillAllowedPenetrationToi = 3.0; + m_numToisTillAllowedPenetrationToiHigher = 4.0; + m_numToisTillAllowedPenetrationToiForced = 20.0; + m_deactivationReferenceDistance = 0.02; + m_expectedMaxLinearVelocity = 200; + m_expectedMinPsiDeltaTime = 1.0f / 30.0f; + m_iterativeLinearCastEarlyOutDistance = 0.01; + m_enableDeprecatedWelding = false; + m_iterativeLinearCastMaxIterations = 20; + m_enableDeactivation = true; + m_shouldActivateOnRigidBodyTransformChange = true; + m_minDesiredIslandSize = 64; + m_deactivationNumInactiveFramesSelectFlag0 = 0; + m_deactivationNumInactiveFramesSelectFlag1 = 0; + m_deactivationIntegrateCounter = 0; + m_contactPointGeneration = CONTACT_POINT_REJECT_MANY; + m_allowToSkipConfirmedCallbacks = false; + m_simulationType = SIMULATION_TYPE_CONTINUOUS; + m_frameMarkerPsiSnap = 0.0001; + m_memoryWatchDog = nullptr; + m_processActionsInSingleThread = true; + m_allowIntegrationOfIslandsWithoutConstraintsInASeparateJob = false; + m_fireCollisionCallbacks = false; +} + +void hkpWorldCinfo::setBroadPhaseWorldSize(hkReal size) { + m_broadPhaseWorldAabb.m_min.setAll(-0.5f * size); + m_broadPhaseWorldAabb.m_max.setAll(0.5f * size); +} + +void hkpWorldCinfo::setupSolverInfo(hkpWorldCinfo::SolverType st) { + switch (st) { + case SOLVER_TYPE_2ITERS_SOFT: + m_solverTau = 0.3; + m_solverDamp = 0.9; + m_solverIterations = 2; + break; + case SOLVER_TYPE_2ITERS_MEDIUM: + m_solverTau = 0.6; + m_solverDamp = 1.0; + m_solverIterations = 2; + break; + case SOLVER_TYPE_2ITERS_HARD: + m_solverTau = 0.9; + m_solverDamp = 1.1; + m_solverIterations = 2; + break; + + case SOLVER_TYPE_4ITERS_SOFT: + m_solverTau = 0.3; + m_solverDamp = 0.9; + m_solverIterations = 4; + break; + case SOLVER_TYPE_4ITERS_MEDIUM: + m_solverTau = 0.6; + m_solverDamp = 1.0; + m_solverIterations = 4; + break; + case SOLVER_TYPE_4ITERS_HARD: + m_solverTau = 0.9; + m_solverDamp = 1.1; + m_solverIterations = 4; + break; + + case SOLVER_TYPE_8ITERS_SOFT: + m_solverTau = 0.3; + m_solverDamp = 0.9; + m_solverIterations = 8; + break; + case SOLVER_TYPE_8ITERS_MEDIUM: + m_solverTau = 0.6; + m_solverDamp = 1.0; + m_solverIterations = 8; + break; + case SOLVER_TYPE_8ITERS_HARD: + m_solverTau = 0.9; + m_solverDamp = 1.1; + m_solverIterations = 8; + break; + + case SOLVER_TYPE_INVALID: + case SOLVER_TYPE_MAX_ID: + break; + } +} + +hkpWorldCinfo::hkpWorldCinfo(hkFinishLoadedObjectFlag flag) + : hkReferencedObject(flag), m_collisionFilter(flag), m_convexListFilter(flag), + m_memoryWatchDog(flag) { + if (!flag.m_finishing) + return; + + if (m_contactRestingVelocity == 0.0) + m_contactRestingVelocity = 1.0; + + if (m_maxEntriesPerToiMidphaseCollideTask == -1) + m_maxEntriesPerToiMidphaseCollideTask = 4; + + if (m_maxEntriesPerToiNarrowphaseCollideTask == -1) + m_maxEntriesPerToiNarrowphaseCollideTask = 12; +} diff --git a/lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorldCinfo.h b/lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorldCinfo.h new file mode 100644 index 00000000..5e35453f --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorldCinfo.h @@ -0,0 +1,123 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class hkpWorldCinfo : public hkReferencedObject { +public: + HK_DECLARE_CLASS_ALLOCATOR(hkpWorldCinfo) + + enum SolverType { + SOLVER_TYPE_INVALID, + SOLVER_TYPE_2ITERS_SOFT, + SOLVER_TYPE_2ITERS_MEDIUM, + SOLVER_TYPE_2ITERS_HARD, + SOLVER_TYPE_4ITERS_SOFT, + SOLVER_TYPE_4ITERS_MEDIUM, + SOLVER_TYPE_4ITERS_HARD, + SOLVER_TYPE_8ITERS_SOFT, + SOLVER_TYPE_8ITERS_MEDIUM, + SOLVER_TYPE_8ITERS_HARD, + SOLVER_TYPE_MAX_ID + }; + + enum SimulationType { + SIMULATION_TYPE_INVALID, + SIMULATION_TYPE_DISCRETE, + SIMULATION_TYPE_CONTINUOUS, + SIMULATION_TYPE_MULTITHREADED, + }; + + enum ContactPointGeneration { + CONTACT_POINT_ACCEPT_ALWAYS, + CONTACT_POINT_REJECT_DUBIOUS, + CONTACT_POINT_REJECT_MANY, + }; + + enum BroadPhaseType { + BROADPHASE_TYPE_SAP, + BROADPHASE_TYPE_TREE, + BROADPHASE_TYPE_HYBRID, + }; + + enum BroadPhaseBorderBehaviour { + BROADPHASE_BORDER_ASSERT, + BROADPHASE_BORDER_FIX_ENTITY, + BROADPHASE_BORDER_REMOVE_ENTITY, + BROADPHASE_BORDER_DO_NOTHING, + }; + + hkpWorldCinfo(); + explicit hkpWorldCinfo(hkFinishLoadedObjectFlag flag); + ~hkpWorldCinfo() override = default; + + void setupSolverInfo(SolverType st); + void setBroadPhaseWorldSize(hkReal size); + + hkVector4 m_gravity; + hkInt32 m_broadPhaseQuerySize; + hkReal m_contactRestingVelocity; + hkEnum m_broadPhaseType; + hkEnum m_broadPhaseBorderBehaviour; + hkBool m_mtPostponeAndSortBroadPhaseBorderCallbacks; + hkAabb m_broadPhaseWorldAabb; + hkReal m_collisionTolerance; + hkRefPtr m_collisionFilter; + hkRefPtr m_convexListFilter; + hkReal m_expectedMaxLinearVelocity; + int m_sizeOfToiEventQueue; + hkReal m_expectedMinPsiDeltaTime; + hkRefPtr m_memoryWatchDog; + + hkInt32 m_broadPhaseNumMarkers; + hkEnum m_contactPointGeneration; + hkBool m_allowToSkipConfirmedCallbacks; + + hkReal m_solverTau; + hkReal m_solverDamp; + hkInt32 m_solverIterations; + hkInt32 m_solverMicrosteps; + hkReal m_maxConstraintViolation; + hkBool m_forceCoherentConstraintOrderingInSolver; + + hkReal m_snapCollisionToConvexEdgeThreshold; + hkReal m_snapCollisionToConcaveEdgeThreshold; + hkBool m_enableToiWeldRejection; + hkBool m_enableDeprecatedWelding; + hkReal m_iterativeLinearCastEarlyOutDistance; + hkInt32 m_iterativeLinearCastMaxIterations; + hkUint8 m_deactivationNumInactiveFramesSelectFlag0; + hkUint8 m_deactivationNumInactiveFramesSelectFlag1; + hkUint8 m_deactivationIntegrateCounter; + hkBool m_shouldActivateOnRigidBodyTransformChange; + hkReal m_deactivationReferenceDistance; + hkReal m_toiCollisionResponseRotateNormal; + + hkBool m_useCompoundSpuElf; + int m_maxSectorsPerMidphaseCollideTask; + int m_maxSectorsPerNarrowphaseCollideTask; + hkBool m_processToisMultithreaded; + int m_maxEntriesPerToiMidphaseCollideTask; + int m_maxEntriesPerToiNarrowphaseCollideTask; + int m_maxNumToiCollisionPairsSinglethreaded; + hkReal m_numToisTillAllowedPenetrationSimplifiedToi; + hkReal m_numToisTillAllowedPenetrationToi; + hkReal m_numToisTillAllowedPenetrationToiHigher; + hkReal m_numToisTillAllowedPenetrationToiForced; + + hkBool m_enableDeactivation; + hkEnum m_simulationType; + hkBool m_enableSimulationIslands; + hkUint32 m_minDesiredIslandSize; + hkBool m_processActionsInSingleThread; + hkBool m_allowIntegrationOfIslandsWithoutConstraintsInASeparateJob; + hkReal m_frameMarkerPsiSnap; + hkBool m_fireCollisionCallbacks; +}; diff --git a/lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorldEntity.h b/lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorldEntity.h similarity index 90% rename from lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorldEntity.h rename to lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorldEntity.h index 3dd937bc..f9fe99c0 100644 --- a/lib/hkStubs/Havok/Physics/Dynamics/World/hkpWorldEntity.h +++ b/lib/hkStubs/Havok/Physics2012/Dynamics/World/hkpWorldEntity.h @@ -1,6 +1,6 @@ #pragma once -#include +#include class hkpWorldEntity : public hkReferencedObject { public: diff --git a/src/KingSystem/Physics/RigidBody/Shape/physCapsuleShape.cpp b/src/KingSystem/Physics/RigidBody/Shape/physCapsuleShape.cpp index 45ccc240..42782577 100644 --- a/src/KingSystem/Physics/RigidBody/Shape/physCapsuleShape.cpp +++ b/src/KingSystem/Physics/RigidBody/Shape/physCapsuleShape.cpp @@ -1,5 +1,5 @@ #include "KingSystem/Physics/RigidBody/Shape/physCapsuleShape.h" -#include +#include #include #include diff --git a/src/KingSystem/Physics/RigidBody/Shape/physCapsuleShape.h b/src/KingSystem/Physics/RigidBody/Shape/physCapsuleShape.h index 73eb1d3b..0f6c9462 100644 --- a/src/KingSystem/Physics/RigidBody/Shape/physCapsuleShape.h +++ b/src/KingSystem/Physics/RigidBody/Shape/physCapsuleShape.h @@ -1,12 +1,12 @@ #pragma once +#include #include #include #include #include "KingSystem/Physics/RigidBody/physRigidBody.h" class hkpShape; -class hkVector4; namespace ksys::phys { diff --git a/src/KingSystem/Physics/RigidBody/physRigidBody.cpp b/src/KingSystem/Physics/RigidBody/physRigidBody.cpp index a79ea7dd..3fe1bbe9 100644 --- a/src/KingSystem/Physics/RigidBody/physRigidBody.cpp +++ b/src/KingSystem/Physics/RigidBody/physRigidBody.cpp @@ -1,5 +1,5 @@ #include "KingSystem/Physics/RigidBody/physRigidBody.h" -#include +#include #include "KingSystem/Physics/System/physMemSystem.h" namespace ksys::phys {