#include "KingSystem/Physics/System/physSystem.h" #include #include #include "KingSystem/Physics/Cloth/physClothResource.h" #include "KingSystem/Physics/Ragdoll/physRagdollControllerKeyList.h" #include "KingSystem/Physics/Ragdoll/physRagdollResource.h" #include "KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBodyResource.h" #include "KingSystem/Physics/RigidBody/physRigidBodyResource.h" #include "KingSystem/Physics/StaticCompound/physStaticCompound.h" #include "KingSystem/Physics/SupportBone/physSupportBoneResource.h" #include "KingSystem/Physics/System/physContactMgr.h" #include "KingSystem/Physics/System/physContactPointInfo.h" #include "KingSystem/Physics/System/physEntityGroupFilter.h" #include "KingSystem/Physics/System/physGroupFilter.h" #include "KingSystem/Physics/System/physMaterialTable.h" #include "KingSystem/Physics/System/physRayCastRequestMgr.h" #include "KingSystem/Physics/System/physSensorGroupFilter.h" #include "KingSystem/Physics/System/physSystemData.h" #include "KingSystem/Physics/physHavokMemoryAllocator.h" #include "KingSystem/Resource/resEntryFactory.h" #include "KingSystem/Resource/resSystem.h" namespace ksys::phys { SEAD_SINGLETON_DISPOSER_IMPL(System) bool System::isPaused() const { return mPaused; } void System::initSystemData(sead::Heap* heap) { res::registerEntryFactory(new (heap) res::EntryFactory(1.0, 0x400), "hkrb"); res::registerEntryFactory(new (heap) res::EntryFactory(1.0, 0x400), "hkrg"); res::registerEntryFactory(new (heap) res::EntryFactory(1.0, 0x100000), "bphyssb"); res::registerEntryFactory(new (heap) res::EntryFactory(2.0, 0x2800), "hkcl"); res::registerEntryFactory(new (heap) res::EntryFactory(1.3, 0x40000), "hksc"); res::registerEntryFactory(new (heap) res::EntryFactory(1.0, 0x800), "hktmrb"); res::registerEntryFactory(new (heap) res::EntryFactory(1.0, 0x4000), "brgcon"); mEntityGroupFilter = EntityGroupFilter::make(FirstEntity, LastEntity, heap); mSensorGroupFilter = SensorGroupFilter::make(LastSensor, heap); mGroupFilters.pushBack(mEntityGroupFilter); mGroupFilters.pushBack(mSensorGroupFilter); mContactMgr = new (heap) ContactMgr; if (mContactMgr) mContactMgr->init(heap); mMaterialTable = new (heap) MaterialTable; mSystemData = new (heap) SystemData; mSystemData->load(mPhysicsSystemHeap, mEntityGroupFilter, mSensorGroupFilter, mMaterialTable, mContactMgr); } ContactPointInfo* System::allocContactPointInfo(sead::Heap* heap, int num, const sead::SafeString& name, int a, int b, int c) const { return mContactMgr->makeContactPointInfo(heap, num, name, a, b, c); } void System::freeContactPointInfo(ContactPointInfo* info) const { mContactMgr->freeContactPointInfo(info); } CollisionInfo* System::allocCollisionInfo(sead::Heap* heap, const sead::SafeString& name) const { return mContactMgr->makeCollisionInfo(heap, name); } void System::freeCollisionInfo(CollisionInfo* info) const { mContactMgr->freeCollisionInfo(info); } ContactLayerCollisionInfoGroup* System::makeContactLayerCollisionInfoGroup(sead::Heap* heap, ContactLayer layer, int capacity, const sead::SafeString& name) { return mContactMgr->makeContactLayerCollisionInfoGroup(heap, layer, capacity, name); } void System::freeContactLayerCollisionInfoGroup(ContactLayerCollisionInfoGroup* group) { mContactMgr->freeContactLayerCollisionInfoGroup(group); } GroupFilter* System::getGroupFilter(ContactLayerType type) const { return mGroupFilters[static_cast(type)]; } RayCastForRequest* System::allocRayCastRequest(SystemGroupHandler* group_handler, GroundHit ground_hit) { return mRayCastRequestMgr->allocRequest(group_handler, ground_hit); } SystemGroupHandler* System::addSystemGroupHandler(ContactLayerType layer_type, int free_list_idx) { return getGroupFilter(layer_type)->addSystemGroupHandler(free_list_idx); } LayerContactPointInfo* System::allocLayerContactPointInfo(sead::Heap* heap, int num, int num2, const sead::SafeString& name, int a, int b, int c) const { return mContactMgr->makeLayerContactPointInfo(heap, num, num2, name, a, b, c); } void System::registerContactPointInfo(ContactPointInfo* info) const { mContactMgr->registerContactPointInfo(info); } RagdollControllerKeyList* System::getRagdollCtrlKeyList() const { if (!mSystemData) return nullptr; return mSystemData->getRagdollCtrlKeyList(); } bool System::isHavokMainHeapOom() const { return static_cast(mHavokAllocator->getHeapFreeSize()) / static_cast(mHavokAllocator->getHeapSize()) < 0.05f; } sead::Heap* System::getPhysicsTempHeap(LowPriority low_priority) const { if (low_priority != LowPriority::No || sead::ThreadMgr::instance()->getCurrentThread()->getPriority() > sead::Thread::cDefaultPriority) return mPhysicsTempLowHeap; if (mPhysicsTempDefaultHeap->getMaxAllocatableSize(8) <= 0x2800) mPhysicsTempDefaultHeap->dump(); return mPhysicsTempDefaultHeap; } } // namespace ksys::phys