diff options
| author | Léo Lam <leo@leolam.fr> | 2022-01-07 01:12:36 +0100 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2022-01-07 01:33:26 +0100 |
| commit | 5ffa9564ca8d1e4946a1f1ccd0d8728ed95ce8b3 (patch) | |
| tree | d4bf22396f2d3669409f68c4bdea63b5050c050c /src | |
| parent | 8a9fb5d10c63e3b6c6a7a87fff122c4920931bc5 (diff) | |
ksys/phys: Add TeraMeshRigidBodyResource
Diffstat (limited to 'src')
6 files changed, 77 insertions, 2 deletions
diff --git a/src/KingSystem/Physics/CMakeLists.txt b/src/KingSystem/Physics/CMakeLists.txt index 57161569..5287bd4d 100644 --- a/src/KingSystem/Physics/CMakeLists.txt +++ b/src/KingSystem/Physics/CMakeLists.txt @@ -35,6 +35,10 @@ target_sources(uking PRIVATE RigidBody/Shape/physSphereShape.h RigidBody/Shape/physWaterCylinderShape.cpp RigidBody/Shape/physWaterCylinderShape.h + RigidBody/TeraMesh/physTeraMeshRigidBody.cpp + RigidBody/TeraMesh/physTeraMeshRigidBody.h + RigidBody/TeraMesh/physTeraMeshRigidBodyResource.cpp + RigidBody/TeraMesh/physTeraMeshRigidBodyResource.h StaticCompound/physStaticCompound.cpp StaticCompound/physStaticCompound.h diff --git a/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.cpp b/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.cpp new file mode 100644 index 00000000..b944ef2d --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.cpp @@ -0,0 +1 @@ +#include "KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.h" diff --git a/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.h b/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.h new file mode 100644 index 00000000..fe1cf5bf --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.h @@ -0,0 +1,13 @@ +#pragma once + +#include "KingSystem/Physics/RigidBody/physRigidBody.h" + +namespace ksys::phys { + +// FIXME +class TeraMeshRigidBody : public RigidBody { +public: + TeraMeshRigidBody(hkpRigidBody* hk_body, sead::Heap* heap); +}; + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBodyResource.cpp b/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBodyResource.cpp new file mode 100644 index 00000000..129278af --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBodyResource.cpp @@ -0,0 +1,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 diff --git a/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBodyResource.h b/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBodyResource.h new file mode 100644 index 00000000..53d9c2c6 --- /dev/null +++ b/src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBodyResource.h @@ -0,0 +1,29 @@ +#pragma once + +#include "KingSystem/Resource/resResource.h" + +class hkpRigidBody; + +namespace ksys::phys { + +class TeraMeshRigidBody; + +class TeraMeshRigidBodyResource : public res::Resource { + SEAD_RTTI_OVERRIDE(TeraMeshRigidBodyResource, res::Resource) + +public: + TeraMeshRigidBodyResource() = default; + ~TeraMeshRigidBodyResource() override; + + hkpRigidBody* getHkpRigidBody() const { return mHkpRigidBody; } + TeraMeshRigidBody* getRigidBody() const { return mRigidBody; } + + bool needsParse() const override { return true; } + bool parse_(u8* data, size_t size, sead::Heap* heap) override; + +private: + hkpRigidBody* mHkpRigidBody = nullptr; + TeraMeshRigidBody* mRigidBody = nullptr; +}; + +} // namespace ksys::phys diff --git a/src/KingSystem/Physics/RigidBody/physRigidBody.h b/src/KingSystem/Physics/RigidBody/physRigidBody.h index d6c14505..af6e39fc 100644 --- a/src/KingSystem/Physics/RigidBody/physRigidBody.h +++ b/src/KingSystem/Physics/RigidBody/physRigidBody.h @@ -99,8 +99,7 @@ private: MotionAccessor* mMotionAccessor = nullptr; u16 _c0 = 0; void* _c8 = nullptr; - void* _d0; }; -KSYS_CHECK_SIZE_NX150(RigidBody, 0xD8); +KSYS_CHECK_SIZE_NX150(RigidBody, 0xD0); } // namespace ksys::phys |
