From 763a4905d0fe8302afa0f7b13da1d6fffadf6a81 Mon Sep 17 00:00:00 2001 From: antopilo Date: Tue, 14 Mar 2023 22:38:04 -0400 Subject: [PATCH] Added convex hull collision shape --- Nuake/src/Core/Physics/DynamicWorld.cpp | 24 +++++++++++++++++++++--- Nuake/src/Core/Physics/PhysicsShapes.h | 21 +++++++++++++++++++-- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/Nuake/src/Core/Physics/DynamicWorld.cpp b/Nuake/src/Core/Physics/DynamicWorld.cpp index 52c35cb1..8c218b1c 100644 --- a/Nuake/src/Core/Physics/DynamicWorld.cpp +++ b/Nuake/src/Core/Physics/DynamicWorld.cpp @@ -330,12 +330,30 @@ namespace Nuake shapeResult = shapeSettings.Create(); } - break; + break; + case CONVEX_HULL: + { + ConvexHullShape* shape = (ConvexHullShape*)rbShape.get(); + + const auto& hullPoints = shape->GetPoints(); + JPH::Array points; + points.reserve(std::size(hullPoints)); + for (const auto& p : hullPoints) + { + points.push_back(JPH::Vec3(p.x, p.y, p.z)); + } + + JPH::ConvexHullShapeSettings shapeSettings(points); + shapeResult = shapeSettings.Create(); + } + break; } - float mass = rb->_mass; JPH::EMotionType motionType = JPH::EMotionType::Static; - if (mass > 0.0f) + + float mass = rb->_mass; + // According to jolt documentation, Mesh shapes should only be static. + if (mass > 0.0f && rb->GetShape()->GetType() != MESH) { motionType = JPH::EMotionType::Dynamic; } diff --git a/Nuake/src/Core/Physics/PhysicsShapes.h b/Nuake/src/Core/Physics/PhysicsShapes.h index 106c76c5..91570d1e 100644 --- a/Nuake/src/Core/Physics/PhysicsShapes.h +++ b/Nuake/src/Core/Physics/PhysicsShapes.h @@ -8,7 +8,7 @@ namespace Nuake { enum RigidbodyShapes { - BOX, SPHERE, CAPSULE, MESH, CYLINDER + BOX, SPHERE, CAPSULE, MESH, CYLINDER, CONVEX_HULL }; class PhysicShape @@ -92,6 +92,23 @@ namespace Nuake void SetMesh(Ref mesh) { m_Mesh = mesh; } Ref GetMesh() { return m_Mesh; } }; - } + class ConvexHullShape : public PhysicShape + { + private: + std::vector _points; + + public: + ConvexHullShape(const std::vector& points) : _points(points) + { + m_Type = CONVEX_HULL; + } + + std::vector GetPoints() const { return _points; } + void SetPoints(const std::vector& points) + { + _points = points; + } + }; + } }