diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 2aa12f31..919d50e1 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -83804,7 +83804,7 @@ Address,Quality,Size,Name 0x0000007100fb6128,U,000004,nullsub_4242 0x0000007100fb612c,U,000004,j__ZdlPv_1005 0x0000007100fb6130,O,000004,_ZN18hkpCollisionFilter4initEP8hkpWorld -0x0000007100fb6134,U,000008, +0x0000007100fb6134,O,000008,_ZN14hkpGroupFilter11dummyUnusedEv 0x0000007100fb613c,U,000204, 0x0000007100fb6208,U,000092, 0x0000007100fb6264,U,000044, @@ -104117,27 +104117,27 @@ Address,Quality,Size,Name 0x00000071015c9ab4,U,000076, 0x00000071015c9b00,U,000256, 0x00000071015c9c00,U,000004,nullsub_5103 -0x00000071015c9c04,U,000100, -0x00000071015c9c68,U,000004,nullsub_5104 -0x00000071015c9c6c,U,000004,nullsub_5105 -0x00000071015c9c70,U,000004,nullsub_5106 -0x00000071015c9c74,U,000004,nullsub_5107 -0x00000071015c9c78,U,000004,nullsub_5108 -0x00000071015c9c7c,U,000084, -0x00000071015c9cd0,U,000088, -0x00000071015c9d28,U,000088, -0x00000071015c9d80,U,000088, -0x00000071015c9dd8,U,000088, -0x00000071015c9e30,U,000108, -0x00000071015c9e9c,U,000108, -0x00000071015c9f08,U,000244, -0x00000071015c9ffc,U,000248, -0x00000071015ca0f4,U,000356, -0x00000071015ca258,U,000028, -0x00000071015ca274,U,000152, -0x00000071015ca30c,U,000152, -0x00000071015ca3a4,U,000108, -0x00000071015ca410,U,000108, +0x00000071015c9c04,L,000100,_ZN14hkpGroupFilterC1Ev +0x00000071015c9c68,L,000004,_ZN14hkpGroupFilterD1Ev +0x00000071015c9c6c,L,000004,_ZThn16_N14hkpGroupFilterD1Ev +0x00000071015c9c70,L,000004,_ZThn24_N14hkpGroupFilterD1Ev +0x00000071015c9c74,L,000004,_ZThn32_N14hkpGroupFilterD1Ev +0x00000071015c9c78,L,000004,_ZThn40_N14hkpGroupFilterD1Ev +0x00000071015c9c7c,L,000084,_ZN14hkpGroupFilterD0Ev +0x00000071015c9cd0,L,000088,_ZThn16_N14hkpGroupFilterD0Ev +0x00000071015c9d28,L,000088,_ZThn24_N14hkpGroupFilterD0Ev +0x00000071015c9d80,L,000088,_ZThn32_N14hkpGroupFilterD0Ev +0x00000071015c9dd8,L,000088,_ZThn40_N14hkpGroupFilterD0Ev +0x00000071015c9e30,L,000108,_ZNK14hkpGroupFilter18isCollisionEnabledERK13hkpCollidableS2_ +0x00000071015c9e9c,L,000108,_ZThn16_NK14hkpGroupFilter18isCollisionEnabledERK13hkpCollidableS2_ +0x00000071015c9f08,L,000244,_ZNK14hkpGroupFilter18isCollisionEnabledERK17hkpCollisionInputRK9hkpCdBodyS5_RK17hkpShapeContainerS8_jj +0x00000071015c9ffc,L,000248,_ZThn24_NK14hkpGroupFilter18isCollisionEnabledERK17hkpCollisionInputRK9hkpCdBodyS5_RK17hkpShapeContainerS8_jj +0x00000071015ca0f4,L,000356,_ZNK14hkpGroupFilter18isCollisionEnabledERK17hkpCollisionInputRK9hkpCdBodyS5_RK17hkpShapeContainerj +0x00000071015ca258,L,000028,_ZThn24_NK14hkpGroupFilter18isCollisionEnabledERK17hkpCollisionInputRK9hkpCdBodyS5_RK17hkpShapeContainerj +0x00000071015ca274,L,000152,_ZNK14hkpGroupFilter18isCollisionEnabledERK20hkpShapeRayCastInputRK17hkpShapeContainerj +0x00000071015ca30c,L,000152,_ZThn32_NK14hkpGroupFilter18isCollisionEnabledERK20hkpShapeRayCastInputRK17hkpShapeContainerj +0x00000071015ca3a4,L,000108,_ZNK14hkpGroupFilter18isCollisionEnabledERK20hkpWorldRayCastInputRK13hkpCollidable +0x00000071015ca410,L,000108,_ZThn40_NK14hkpGroupFilter18isCollisionEnabledERK20hkpWorldRayCastInputRK13hkpCollidable 0x00000071015ca47c,U,000216, 0x00000071015ca554,U,000108, 0x00000071015ca5c0,U,000084, diff --git a/lib/hkStubs/CMakeLists.txt b/lib/hkStubs/CMakeLists.txt index 5c82e85c..81d8eb8a 100644 --- a/lib/hkStubs/CMakeLists.txt +++ b/lib/hkStubs/CMakeLists.txt @@ -33,6 +33,8 @@ add_library(hkStubs OBJECT Havok/Physics2012/Collide/Filter/hkpConvexListFilter.h Havok/Physics2012/Collide/Filter/hkpRayCollidableFilter.h Havok/Physics2012/Collide/Filter/hkpShapeCollectionFilter.h + Havok/Physics2012/Collide/Filter/Group/hkpGroupFilter.cpp + Havok/Physics2012/Collide/Filter/Group/hkpGroupFilter.h Havok/Physics2012/Collide/Shape/hkpShape.h Havok/Physics2012/Collide/Shape/hkpShapeBase.h Havok/Physics2012/Collide/Shape/Convex/hkpConvexShape.h diff --git a/lib/hkStubs/Havok/Physics2012/Collide/Filter/Group/hkpGroupFilter.cpp b/lib/hkStubs/Havok/Physics2012/Collide/Filter/Group/hkpGroupFilter.cpp new file mode 100644 index 00000000..27e293c2 --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Collide/Filter/Group/hkpGroupFilter.cpp @@ -0,0 +1,10 @@ +#include + +hkpGroupFilter::hkpGroupFilter() { + m_type = HK_FILTER_GROUP; + for (auto& x : m_collisionLookupTable) + x = 0xffffffff; + m_nextFreeSystemGroup = 0; +} + +hkpGroupFilter::~hkpGroupFilter() = default; diff --git a/lib/hkStubs/Havok/Physics2012/Collide/Filter/Group/hkpGroupFilter.h b/lib/hkStubs/Havok/Physics2012/Collide/Filter/Group/hkpGroupFilter.h new file mode 100644 index 00000000..3113fbca --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Collide/Filter/Group/hkpGroupFilter.h @@ -0,0 +1,96 @@ +#pragma once + +#include +#include "Havok/Common/Base/Math/Vector/hkVector4.h" + +class hkpGroupFilter : public hkpCollisionFilter { +public: + HK_DECLARE_CLASS_ALLOCATOR(hkpGroupFilter) + + enum { + USE_COLLIDABLE_FILTER_INFO = 0xffffffff, + }; + + hkpGroupFilter(); + ~hkpGroupFilter() override; + + explicit hkpGroupFilter(hkFinishLoadedObjectFlag flag) : hkpCollisionFilter(flag) { + if (flag.m_finishing) { + m_type = HK_FILTER_GROUP; + } + } + + void enableCollisionsBetween(int layerA, int layerB); + void disableCollisionsBetween(int layerA, int layerB); + + void enableCollisionsUsingBitfield(hkUint32 layerBitsA, hkUint32 layerBitsB); + void disableCollisionsUsingBitfield(hkUint32 layerBitsA, hkUint32 layerBitsB); + + static inline hkUint32 calcFilterInfo(int layer, int systemGroup = 0, int subSystemId = 0, + int subSystemDontCollideWith = 0); + + static inline int getLayerFromFilterInfo(hkUint32 filterInfo); + static inline int setLayer(hkUint32 filterInfo, int newLayer); + static inline int getSystemGroupFromFilterInfo(hkUint32 filterInfo); + static inline int getSubSystemIdFromFilterInfo(hkUint32 filterInfo); + static inline int getSubSystemDontCollideWithFromFilterInfo(hkUint32 filterInfo); + + /// Creates a new unique identifier for system groups (maximum 65k). + inline int getNewSystemGroup(); + + hkBool isCollisionEnabled(const hkpCollidable& a, const hkpCollidable& b) const override; + + hkBool isCollisionEnabled(const hkpCollisionInput& input, const hkpCdBody& a, + const hkpCdBody& b, const hkpShapeContainer& bContainer, + hkpShapeKey bKey) const override; + + hkBool isCollisionEnabled(const hkpCollisionInput& input, const hkpCdBody& collectionBodyA, + const hkpCdBody& collectionBodyB, + const hkpShapeContainer& containerShapeA, + const hkpShapeContainer& containerShapeB, hkpShapeKey keyA, + hkpShapeKey keyB) const override; + + hkBool isCollisionEnabled(const hkpShapeRayCastInput& aInput, + const hkpShapeContainer& bContainer, hkpShapeKey bKey) const override; + + hkBool isCollisionEnabled(const hkpWorldRayCastInput& inputA, + const hkpCollidable& collidableB) const override; + + hkBool isCollisionEnabled(hkUint32 infoA, hkUint32 infoB) const; + + virtual int dummyUnused() { return 0; } + + int m_nextFreeSystemGroup; + hkUint32 m_collisionLookupTable[32]; + hkVector4 m_pad256[4]; +}; + +inline hkUint32 hkpGroupFilter::calcFilterInfo(int layer, int systemGroup, int subSystemId, + int subSystemDontCollideWith) { + return (systemGroup << 16) | (subSystemDontCollideWith << 10) | (subSystemId << 5) | layer; +} + +inline int hkpGroupFilter::getLayerFromFilterInfo(hkUint32 filterInfo) { + return int(filterInfo & 0x1f); +} + +inline int hkpGroupFilter::setLayer(hkUint32 filterInfo, int newLayer) { + hkUint32 collisionLayerMask = 0xffffffff - 0x1f; + return int(newLayer + (collisionLayerMask & filterInfo)); +} + +inline int hkpGroupFilter::getSystemGroupFromFilterInfo(hkUint32 filterInfo) { + return int(filterInfo >> 16); +} + +inline int hkpGroupFilter::getSubSystemIdFromFilterInfo(hkUint32 filterInfo) { + return int((filterInfo >> 5) & 0x1f); +} + +inline int hkpGroupFilter::getSubSystemDontCollideWithFromFilterInfo(hkUint32 filterInfo) { + return int((filterInfo >> 10) & 0x1f); +} + +inline int hkpGroupFilter::getNewSystemGroup() { + return ++m_nextFreeSystemGroup; +}