summaryrefslogtreecommitdiff
path: root/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBodyResource.cpp
blob: 129278afbb90bf6dd6e98fbf14c3b81fabf53c42 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBodyResource.h"
#include <Havok/Common/Serialize/Util/hkNativePackfileUtils.h>
#include <Havok/Common/Serialize/Util/hkRootLevelContainer.h>
#include <Havok/Physics2012/Dynamics/Entity/hkpRigidBody.h>
#include "KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.h"
#include "KingSystem/Utils/Debug.h"

namespace ksys::phys {

TeraMeshRigidBodyResource::~TeraMeshRigidBodyResource() {
    delete mRigidBody;
    if (mHkpRigidBody)
        hkNativePackfileUtils::unloadInPlace(getRawData(), int(getRawSize()));
}

bool TeraMeshRigidBodyResource::parse_(u8* data, size_t size, sead::Heap* heap) {
    const char* error = nullptr;
    auto* container = static_cast<hkRootLevelContainer*>(
        hkNativePackfileUtils::loadInPlace(getRawData(), int(getRawSize()), nullptr, &error));
    if (!container) {
        util::PrintDebugFmt("failed to load TeraMeshRigidBody resource: %s", error);
    }

    mHkpRigidBody = container->findObject<hkpRigidBody>();
    mRigidBody = new (heap) TeraMeshRigidBody(mHkpRigidBody, heap);
    return mRigidBody != nullptr;
}

}  // namespace ksys::phys