diff --git a/ChangeLog.md b/ChangeLog.md index ca17d7e7a..866118c41 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -140,6 +140,7 @@ Nazara Engine: - Added ConvexCollider2D::GetVertices - Added SegmentCollider2D::GetThickness - Fixed vertices generation/render queue submit when using multiples materials on a Tilemap +- It is now possible to prevent CompoundCollider2D to override individual colliders properties Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Physics2D/Collider2D.hpp b/include/Nazara/Physics2D/Collider2D.hpp index 0ef28c8f3..249110320 100644 --- a/include/Nazara/Physics2D/Collider2D.hpp +++ b/include/Nazara/Physics2D/Collider2D.hpp @@ -143,15 +143,21 @@ namespace Nz float ComputeMomentOfInertia(float mass) const override; + inline bool DoesOverrideCollisionProperties() const; + inline const std::vector& GetGeoms() const; ColliderType2D GetType() const override; + inline void OverridesCollisionProperties(bool shouldOverride); + template static CompoundCollider2DRef New(Args&&... args); private: void CreateShapes(RigidBody2D* body, std::vector& shapes) const override; + std::vector GenerateShapes(RigidBody2D* body) const override; std::vector m_geoms; + bool m_doesOverrideCollisionProperties; }; class ConvexCollider2D; diff --git a/include/Nazara/Physics2D/Collider2D.inl b/include/Nazara/Physics2D/Collider2D.inl index 1f149fb3f..71ae0603c 100644 --- a/include/Nazara/Physics2D/Collider2D.inl +++ b/include/Nazara/Physics2D/Collider2D.inl @@ -110,11 +110,21 @@ namespace Nz return object.release(); } + inline bool Nz::CompoundCollider2D::DoesOverrideCollisionProperties() const + { + return m_doesOverrideCollisionProperties; + } + inline const std::vector& CompoundCollider2D::GetGeoms() const { return m_geoms; } + inline void Nz::CompoundCollider2D::OverridesCollisionProperties(bool shouldOverride) + { + m_doesOverrideCollisionProperties = shouldOverride; + } + template CompoundCollider2DRef CompoundCollider2D::New(Args&&... args) { diff --git a/src/Nazara/Physics2D/Collider2D.cpp b/src/Nazara/Physics2D/Collider2D.cpp index 95cd633af..463ddf13b 100644 --- a/src/Nazara/Physics2D/Collider2D.cpp +++ b/src/Nazara/Physics2D/Collider2D.cpp @@ -13,11 +13,10 @@ namespace Nz std::vector Collider2D::GenerateShapes(RigidBody2D* body) const { - cpShapeFilter filter = cpShapeFilterNew(m_collisionGroup, m_categoryMask, m_collisionMask); - std::vector shapes; CreateShapes(body, shapes); + cpShapeFilter filter = cpShapeFilterNew(m_collisionGroup, m_categoryMask, m_collisionMask); for (cpShape* shape : shapes) { cpShapeSetFilter(shape, filter); @@ -82,7 +81,8 @@ namespace Nz /******************************** CompoundCollider2D *********************************/ CompoundCollider2D::CompoundCollider2D(std::vector geoms) : - m_geoms(std::move(geoms)) + m_geoms(std::move(geoms)), + m_doesOverrideCollisionProperties(true) { } @@ -109,6 +109,20 @@ namespace Nz geom->CreateShapes(body, shapes); } + std::vector CompoundCollider2D::GenerateShapes(RigidBody2D* body) const + { + // This is our parent's default behavior + if (m_doesOverrideCollisionProperties) + return Collider2D::GenerateShapes(body); + else + { + std::vector shapes; + CreateShapes(body, shapes); + + return shapes; + } + } + /******************************** ConvexCollider2D *********************************/ ConvexCollider2D::ConvexCollider2D(SparsePtr vertices, std::size_t vertexCount, float radius) :