From e62afabd7100943ccd9da27b03583f094871e133 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 29 Aug 2018 20:54:57 +0200 Subject: [PATCH 1/2] Physics2D/Collider2D: Fix CompoundCollider2D filters --- include/Nazara/Physics2D/Collider2D.hpp | 18 ++++----- src/Nazara/Physics2D/Collider2D.cpp | 53 +++++++++++++++---------- src/Nazara/Physics2D/RigidBody2D.cpp | 2 +- 3 files changed, 42 insertions(+), 31 deletions(-) diff --git a/include/Nazara/Physics2D/Collider2D.hpp b/include/Nazara/Physics2D/Collider2D.hpp index 249110320..36443e66a 100644 --- a/include/Nazara/Physics2D/Collider2D.hpp +++ b/include/Nazara/Physics2D/Collider2D.hpp @@ -65,7 +65,7 @@ namespace Nz NazaraSignal(OnColliderRelease, const Collider2D* /*collider*/); protected: - virtual void CreateShapes(RigidBody2D* body, std::vector& shapes) const = 0; + virtual std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const = 0; bool m_trigger; UInt32 m_categoryMask; @@ -74,7 +74,7 @@ namespace Nz UInt32 m_collisionMask; private: - virtual std::vector GenerateShapes(RigidBody2D* body) const; + virtual std::size_t GenerateShapes(RigidBody2D* body, std::vector* shapes) const; static Collider2DLibrary::LibraryMap s_library; }; @@ -100,7 +100,7 @@ namespace Nz template static BoxCollider2DRef New(Args&&... args); private: - void CreateShapes(RigidBody2D* body, std::vector& shapes) const override; + std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const override; Rectf m_rect; float m_radius; @@ -125,7 +125,7 @@ namespace Nz template static CircleCollider2DRef New(Args&&... args); private: - void CreateShapes(RigidBody2D* body, std::vector& shapes) const override; + std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const override; Vector2f m_offset; float m_radius; @@ -153,8 +153,8 @@ namespace Nz template static CompoundCollider2DRef New(Args&&... args); private: - void CreateShapes(RigidBody2D* body, std::vector& shapes) const override; - std::vector GenerateShapes(RigidBody2D* body) const override; + std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const override; + std::size_t GenerateShapes(RigidBody2D* body, std::vector* shapes) const override; std::vector m_geoms; bool m_doesOverrideCollisionProperties; @@ -178,7 +178,7 @@ namespace Nz template static ConvexCollider2DRef New(Args&&... args); private: - void CreateShapes(RigidBody2D* body, std::vector& shapes) const override; + std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const override; std::vector m_vertices; float m_radius; @@ -201,7 +201,7 @@ namespace Nz template static NullCollider2DRef New(Args&&... args); private: - void CreateShapes(RigidBody2D* body, std::vector& shapes) const override; + std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const override; }; class SegmentCollider2D; @@ -225,7 +225,7 @@ namespace Nz template static SegmentCollider2DRef New(Args&&... args); private: - void CreateShapes(RigidBody2D* body, std::vector& shapes) const override; + std::size_t CreateShapes(RigidBody2D* body, std::vector* shapes) const override; Vector2f m_first; Vector2f m_second; diff --git a/src/Nazara/Physics2D/Collider2D.cpp b/src/Nazara/Physics2D/Collider2D.cpp index 463ddf13b..5f0e9bcfe 100644 --- a/src/Nazara/Physics2D/Collider2D.cpp +++ b/src/Nazara/Physics2D/Collider2D.cpp @@ -11,20 +11,21 @@ namespace Nz { Collider2D::~Collider2D() = default; - std::vector Collider2D::GenerateShapes(RigidBody2D* body) const + std::size_t Collider2D::GenerateShapes(RigidBody2D* body, std::vector* shapes) const { - std::vector shapes; - CreateShapes(body, shapes); + std::size_t shapeCount = CreateShapes(body, shapes); cpShapeFilter filter = cpShapeFilterNew(m_collisionGroup, m_categoryMask, m_collisionMask); - for (cpShape* shape : shapes) + for (std::size_t i = shapes->size() - shapeCount; i < shapes->size(); ++i) { + cpShape* shape = (*shapes)[i]; + cpShapeSetFilter(shape, filter); cpShapeSetCollisionType(shape, m_collisionId); cpShapeSetSensor(shape, (m_trigger) ? cpTrue : cpFalse); } - return shapes; + return shapeCount; } /******************************** BoxCollider2D *********************************/ @@ -50,9 +51,10 @@ namespace Nz return ColliderType2D_Box; } - void BoxCollider2D::CreateShapes(RigidBody2D* body, std::vector& shapes) const + std::size_t BoxCollider2D::CreateShapes(RigidBody2D* body, std::vector* shapes) const { - shapes.push_back(cpBoxShapeNew2(body->GetHandle(), cpBBNew(m_rect.x, m_rect.y, m_rect.x + m_rect.width, m_rect.y + m_rect.height), m_radius)); + shapes->push_back(cpBoxShapeNew2(body->GetHandle(), cpBBNew(m_rect.x, m_rect.y, m_rect.x + m_rect.width, m_rect.y + m_rect.height), m_radius)); + return 1; } /******************************** CircleCollider2D *********************************/ @@ -73,9 +75,10 @@ namespace Nz return ColliderType2D_Circle; } - void CircleCollider2D::CreateShapes(RigidBody2D* body, std::vector& shapes) const + std::size_t CircleCollider2D::CreateShapes(RigidBody2D* body, std::vector* shapes) const { - shapes.push_back(cpCircleShapeNew(body->GetHandle(), m_radius, cpv(m_offset.x, m_offset.y))); + shapes->push_back(cpCircleShapeNew(body->GetHandle(), m_radius, cpv(m_offset.x, m_offset.y))); + return 1; } /******************************** CompoundCollider2D *********************************/ @@ -102,24 +105,29 @@ namespace Nz return ColliderType2D_Compound; } - void CompoundCollider2D::CreateShapes(RigidBody2D* body, std::vector& shapes) const + std::size_t CompoundCollider2D::CreateShapes(RigidBody2D* body, std::vector* shapes) const { // Since C++ does not allow protected call from other objects, we have to be a friend of Collider2D, yay + + std::size_t shapeCount = 0; for (const auto& geom : m_geoms) - geom->CreateShapes(body, shapes); + shapeCount += geom->CreateShapes(body, shapes); + + return shapeCount; } - std::vector CompoundCollider2D::GenerateShapes(RigidBody2D* body) const + std::size_t CompoundCollider2D::GenerateShapes(RigidBody2D* body, std::vector* shapes) const { // This is our parent's default behavior if (m_doesOverrideCollisionProperties) - return Collider2D::GenerateShapes(body); + return Collider2D::GenerateShapes(body, shapes); else { - std::vector shapes; - CreateShapes(body, shapes); + std::size_t shapeCount = 0; + for (const auto& geom : m_geoms) + shapeCount += geom->GenerateShapes(body, shapes); - return shapes; + return shapeCount; } } @@ -145,9 +153,10 @@ namespace Nz return ColliderType2D_Convex; } - void ConvexCollider2D::CreateShapes(RigidBody2D* body, std::vector& shapes) const + std::size_t ConvexCollider2D::CreateShapes(RigidBody2D* body, std::vector* shapes) const { - shapes.push_back(cpPolyShapeNew(body->GetHandle(), int(m_vertices.size()), reinterpret_cast(m_vertices.data()), cpTransformIdentity, m_radius)); + shapes->push_back(cpPolyShapeNew(body->GetHandle(), int(m_vertices.size()), reinterpret_cast(m_vertices.data()), cpTransformIdentity, m_radius)); + return 1; } /********************************* NullCollider2D **********************************/ @@ -162,8 +171,9 @@ namespace Nz return (mass > 0.f) ? 1.f : 0.f; //< Null inertia is only possible for static/kinematic objects } - void NullCollider2D::CreateShapes(RigidBody2D* /*body*/, std::vector& /*shapes*/) const + std::size_t NullCollider2D::CreateShapes(RigidBody2D* /*body*/, std::vector* /*shapes*/) const { + return 0; } /******************************** SegmentCollider2D *********************************/ @@ -178,8 +188,9 @@ namespace Nz return ColliderType2D_Segment; } - void SegmentCollider2D::CreateShapes(RigidBody2D* body, std::vector& shapes) const + std::size_t SegmentCollider2D::CreateShapes(RigidBody2D* body, std::vector* shapes) const { - shapes.push_back(cpSegmentShapeNew(body->GetHandle(), cpv(m_first.x, m_first.y), cpv(m_second.x, m_second.y), m_thickness)); + shapes->push_back(cpSegmentShapeNew(body->GetHandle(), cpv(m_first.x, m_first.y), cpv(m_second.x, m_second.y), m_thickness)); + return 1; } } diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index 76844db3b..cb3f60ccf 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -311,7 +311,7 @@ namespace Nz else m_geom = NullCollider2D::New(); - m_shapes = m_geom->GenerateShapes(this); + m_geom->GenerateShapes(this, &m_shapes); cpSpace* space = m_world->GetHandle(); for (cpShape* shape : m_shapes) From b8e25502f56b31573d67b4d5bbe9dc92d76baf29 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 29 Aug 2018 20:55:19 +0200 Subject: [PATCH 2/2] Physics2D/RigidBody2D: Fix useless copy --- src/Nazara/Physics2D/RigidBody2D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index cb3f60ccf..b12bc7e2e 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -30,7 +30,7 @@ namespace Nz NazaraAssert(m_world, "Invalid world"); m_handle = Create(mass); - SetGeom(geom); + SetGeom(std::move(geom)); } RigidBody2D::RigidBody2D(const RigidBody2D& object) :