From f18a84810f62ed20c4fa4b13148a26c4c5514785 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 17 Oct 2016 17:53:34 +0200 Subject: [PATCH] Physics2D: Add BoxCollider2D class --- include/Nazara/Physics2D/Collider2D.hpp | 27 ++++++++++++++++++++ include/Nazara/Physics2D/Collider2D.inl | 19 ++++++++++++++ src/Nazara/Physics2D/Collider2D.cpp | 33 ++++++++++++++++++++++++- 3 files changed, 78 insertions(+), 1 deletion(-) diff --git a/include/Nazara/Physics2D/Collider2D.hpp b/include/Nazara/Physics2D/Collider2D.hpp index c1cb096b0..f8cd7d6af 100644 --- a/include/Nazara/Physics2D/Collider2D.hpp +++ b/include/Nazara/Physics2D/Collider2D.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -55,6 +56,32 @@ namespace Nz static Collider2DLibrary::LibraryMap s_library; }; + class BoxCollider2D; + + using BoxCollider2DConstRef = ObjectRef; + using BoxCollider2DRef = ObjectRef; + + class NAZARA_PHYSICS2D_API BoxCollider2D : public Collider2D + { + public: + BoxCollider2D(const Vector2f& size, float radius = 0.f); + BoxCollider2D(const Rectf& rect, float radius = 0.f); + + float ComputeInertialMatrix(float mass) const override; + + inline const Rectf& GetRect() const; + inline Vector2f GetSize() const; + ColliderType2D GetType() const override; + + template static BoxCollider2DRef New(Args&&... args); + + private: + std::vector CreateShapes(RigidBody2D* body) const override; + + Rectf m_rect; + float m_radius; + }; + class CircleCollider2D; using CircleCollider2DConstRef = ObjectRef; diff --git a/include/Nazara/Physics2D/Collider2D.inl b/include/Nazara/Physics2D/Collider2D.inl index 5b384abb1..2cd44d326 100644 --- a/include/Nazara/Physics2D/Collider2D.inl +++ b/include/Nazara/Physics2D/Collider2D.inl @@ -7,6 +7,25 @@ namespace Nz { + inline const Rectf& BoxCollider2D::GetRect() const + { + return m_rect; + } + + inline Vector2f BoxCollider2D::GetSize() const + { + return m_rect.GetLengths(); + } + + template + BoxCollider2DRef BoxCollider2D::New(Args&&... args) + { + std::unique_ptr object(new BoxCollider2D(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); + } + inline float CircleCollider2D::GetRadius() const { return m_radius; diff --git a/src/Nazara/Physics2D/Collider2D.cpp b/src/Nazara/Physics2D/Collider2D.cpp index 555e81a39..a840393e8 100644 --- a/src/Nazara/Physics2D/Collider2D.cpp +++ b/src/Nazara/Physics2D/Collider2D.cpp @@ -10,6 +10,37 @@ namespace Nz { Collider2D::~Collider2D() = default; + + /******************************** BoxCollider2D *********************************/ + + BoxCollider2D::BoxCollider2D(const Vector2f& size, float radius) : + BoxCollider2D(Rectf(-size.x / 2.f, -size.y / 2.f, size.x / 2.f, size.y / 2.f), radius) + { + } + + BoxCollider2D::BoxCollider2D(const Rectf& rect, float radius) : + m_rect(rect), + m_radius(radius) + { + } + + float BoxCollider2D::ComputeInertialMatrix(float mass) const + { + return static_cast(cpMomentForBox2(mass, cpBBNew(m_rect.x, m_rect.y + m_rect.height, m_rect.x + m_rect.width, m_rect.y))); + } + + ColliderType2D BoxCollider2D::GetType() const + { + return ColliderType2D_Box; + } + + std::vector BoxCollider2D::CreateShapes(RigidBody2D* body) const + { + std::vector shapes; + shapes.push_back(cpBoxShapeNew2(body->GetHandle(), cpBBNew(m_rect.x, m_rect.y + m_rect.height, m_rect.x + m_rect.width, m_rect.y), m_radius)); + + return shapes; + } /******************************** CircleCollider2D *********************************/ @@ -21,7 +52,7 @@ namespace Nz float CircleCollider2D::ComputeInertialMatrix(float mass) const { - return cpMomentForCircle(mass, 0.f, m_radius, cpv(m_offset.x, m_offset.y)); + return static_cast(cpMomentForCircle(mass, 0.f, m_radius, cpv(m_offset.x, m_offset.y))); } ColliderType2D CircleCollider2D::GetType() const