diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 2d49b81f..2c5d430e 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -97516,12 +97516,12 @@ Address,Quality,Size,Name 0x000000710131fe88,U,000172, 0x000000710131ff34,U,000160, 0x000000710131ffd4,U,000848, -0x0000007101320324,U,000332,TeraMeshRigidBody::ctor -0x0000007101320470,U,000076, -0x00000071013204bc,U,000080, -0x000000710132050c,U,000084, -0x0000007101320560,U,000088, -0x00000071013205b8,U,000096, +0x0000007101320324,O,000332,_ZN4ksys4phys17TeraMeshRigidBodyC1EP12hkpRigidBodyPN4sead4HeapE +0x0000007101320470,O,000076,_ZN4ksys4phys17TeraMeshRigidBodyD1Ev +0x00000071013204bc,O,000080,_ZThn32_N4ksys4phys17TeraMeshRigidBodyD1Ev +0x000000710132050c,O,000084,_ZN4ksys4phys17TeraMeshRigidBodyD0Ev +0x0000007101320560,O,000088,_ZThn32_N4ksys4phys17TeraMeshRigidBodyD0Ev +0x00000071013205b8,O,000096,_ZN4ksys4phys17TeraMeshRigidBody17getCollisionMasksEPNS0_23RigidBodyCollisionMasksEPKjRKN4sead7Vector3IfEE 0x0000007101320618,U,000088,phys::WorldBorder::ctor 0x0000007101320670,U,000072, 0x00000071013206b8,U,000088, diff --git a/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.cpp b/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.cpp index b944ef2d..438a035a 100644 --- a/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.cpp +++ b/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.cpp @@ -1 +1,36 @@ #include "KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.h" +#include +#include "KingSystem/Physics/RigidBody/physRigidBodyParam.h" +#include "KingSystem/Physics/StaticCompound/physStaticCompoundUtil.h" + +namespace ksys::phys { + +TeraMeshRigidBody::TeraMeshRigidBody(hkpRigidBody* hk_body, sead::Heap* heap) + : RigidBody(RigidBody::Type::TeraMesh, ContactLayerType::Entity, hk_body, "TeraMesh", heap, + true) { + RigidBodyInstanceParam param; + param.motion_type = MotionType::Fixed; + initMotionAccessor(param, heap, false); +} + +TeraMeshRigidBody::~TeraMeshRigidBody() { + if (isAddedToWorld()) { + removeFromWorldImmediately(); + } +} + +u32 TeraMeshRigidBody::getCollisionMasks(RigidBody::CollisionMasks* masks, const u32* unk, + const sead::Vector3f& contact_point) { + const auto* collidable = getHkBody()->getCollidable(); + masks->ignored_layers = ~mContactMask; + if (unk != nullptr) { + getCollisionFilterInfoFromCollidable(masks, &masks->collision_filter_info, *collidable, + unk); + return 0; + } + masks->material_mask = collidable->getShape()->getUserData(); + masks->collision_filter_info = collidable->getCollisionFilterInfo(); + return 0; +} + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.h b/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.h index 9952e3fd..046f61b5 100644 --- a/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.h +++ b/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.h @@ -4,11 +4,12 @@ namespace ksys::phys { -// FIXME class TeraMeshRigidBody : public RigidBody { public: TeraMeshRigidBody(hkpRigidBody* hk_body, sead::Heap* heap); + ~TeraMeshRigidBody() override; + u32 getCollisionMasks(RigidBody::CollisionMasks* masks, const u32* unk, const sead::Vector3f& contact_point) override; };