Physics2D/Collider2D: Allow to prevent individual colliders properties override

This commit is contained in:
Lynix 2018-08-24 16:30:03 +02:00
parent b9e36f36e2
commit 933cb64488
4 changed files with 34 additions and 3 deletions

View File

@ -140,6 +140,7 @@ Nazara Engine:
- Added ConvexCollider2D::GetVertices - Added ConvexCollider2D::GetVertices
- Added SegmentCollider2D::GetThickness - Added SegmentCollider2D::GetThickness
- Fixed vertices generation/render queue submit when using multiples materials on a Tilemap - 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: Nazara Development Kit:
- Added ImageWidget (#139) - Added ImageWidget (#139)

View File

@ -143,15 +143,21 @@ namespace Nz
float ComputeMomentOfInertia(float mass) const override; float ComputeMomentOfInertia(float mass) const override;
inline bool DoesOverrideCollisionProperties() const;
inline const std::vector<Collider2DRef>& GetGeoms() const; inline const std::vector<Collider2DRef>& GetGeoms() const;
ColliderType2D GetType() const override; ColliderType2D GetType() const override;
inline void OverridesCollisionProperties(bool shouldOverride);
template<typename... Args> static CompoundCollider2DRef New(Args&&... args); template<typename... Args> static CompoundCollider2DRef New(Args&&... args);
private: private:
void CreateShapes(RigidBody2D* body, std::vector<cpShape*>& shapes) const override; void CreateShapes(RigidBody2D* body, std::vector<cpShape*>& shapes) const override;
std::vector<cpShape*> GenerateShapes(RigidBody2D* body) const override;
std::vector<Collider2DRef> m_geoms; std::vector<Collider2DRef> m_geoms;
bool m_doesOverrideCollisionProperties;
}; };
class ConvexCollider2D; class ConvexCollider2D;

View File

@ -110,11 +110,21 @@ namespace Nz
return object.release(); return object.release();
} }
inline bool Nz::CompoundCollider2D::DoesOverrideCollisionProperties() const
{
return m_doesOverrideCollisionProperties;
}
inline const std::vector<Collider2DRef>& CompoundCollider2D::GetGeoms() const inline const std::vector<Collider2DRef>& CompoundCollider2D::GetGeoms() const
{ {
return m_geoms; return m_geoms;
} }
inline void Nz::CompoundCollider2D::OverridesCollisionProperties(bool shouldOverride)
{
m_doesOverrideCollisionProperties = shouldOverride;
}
template<typename... Args> template<typename... Args>
CompoundCollider2DRef CompoundCollider2D::New(Args&&... args) CompoundCollider2DRef CompoundCollider2D::New(Args&&... args)
{ {

View File

@ -13,11 +13,10 @@ namespace Nz
std::vector<cpShape*> Collider2D::GenerateShapes(RigidBody2D* body) const std::vector<cpShape*> Collider2D::GenerateShapes(RigidBody2D* body) const
{ {
cpShapeFilter filter = cpShapeFilterNew(m_collisionGroup, m_categoryMask, m_collisionMask);
std::vector<cpShape*> shapes; std::vector<cpShape*> shapes;
CreateShapes(body, shapes); CreateShapes(body, shapes);
cpShapeFilter filter = cpShapeFilterNew(m_collisionGroup, m_categoryMask, m_collisionMask);
for (cpShape* shape : shapes) for (cpShape* shape : shapes)
{ {
cpShapeSetFilter(shape, filter); cpShapeSetFilter(shape, filter);
@ -82,7 +81,8 @@ namespace Nz
/******************************** CompoundCollider2D *********************************/ /******************************** CompoundCollider2D *********************************/
CompoundCollider2D::CompoundCollider2D(std::vector<Collider2DRef> geoms) : CompoundCollider2D::CompoundCollider2D(std::vector<Collider2DRef> geoms) :
m_geoms(std::move(geoms)) m_geoms(std::move(geoms)),
m_doesOverrideCollisionProperties(true)
{ {
} }
@ -109,6 +109,20 @@ namespace Nz
geom->CreateShapes(body, shapes); geom->CreateShapes(body, shapes);
} }
std::vector<cpShape*> CompoundCollider2D::GenerateShapes(RigidBody2D* body) const
{
// This is our parent's default behavior
if (m_doesOverrideCollisionProperties)
return Collider2D::GenerateShapes(body);
else
{
std::vector<cpShape*> shapes;
CreateShapes(body, shapes);
return shapes;
}
}
/******************************** ConvexCollider2D *********************************/ /******************************** ConvexCollider2D *********************************/
ConvexCollider2D::ConvexCollider2D(SparsePtr<const Vector2f> vertices, std::size_t vertexCount, float radius) : ConvexCollider2D::ConvexCollider2D(SparsePtr<const Vector2f> vertices, std::size_t vertexCount, float radius) :