summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2022-01-07 01:12:36 +0100
committerLéo Lam <leo@leolam.fr>2022-01-07 01:33:26 +0100
commit5ffa9564ca8d1e4946a1f1ccd0d8728ed95ce8b3 (patch)
treed4bf22396f2d3669409f68c4bdea63b5050c050c /src
parent8a9fb5d10c63e3b6c6a7a87fff122c4920931bc5 (diff)
ksys/phys: Add TeraMeshRigidBodyResource
Diffstat (limited to 'src')
-rw-r--r--src/KingSystem/Physics/CMakeLists.txt4
-rw-r--r--src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.cpp1
-rw-r--r--src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBody.h13
-rw-r--r--src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBodyResource.cpp29
-rw-r--r--src/KingSystem/Physics/RigidBody/TeraMesh/physTeraMeshRigidBodyResource.h29
-rw-r--r--src/KingSystem/Physics/RigidBody/physRigidBody.h3
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