From 78faacf03fa6f704e24c36566dc6d291d05dd1f3 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 28 Aug 2018 22:05:15 +0200 Subject: [PATCH] PhysicsSystem2D: Fix RegisterCallbacks for good Allowing move instead of forcing copy Fixing RegisterCallbacks overload --- SDK/include/NDK/Systems/PhysicsSystem2D.hpp | 4 +-- SDK/src/NDK/Systems/PhysicsSystem2D.cpp | 31 +++++++++++---------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp index 1683fc7fb..09dd5c19d 100644 --- a/SDK/include/NDK/Systems/PhysicsSystem2D.hpp +++ b/SDK/include/NDK/Systems/PhysicsSystem2D.hpp @@ -57,8 +57,8 @@ namespace Ndk void RegionQuery(const Nz::Rectf& boundingBox, Nz::UInt32 collisionGroup, Nz::UInt32 categoryMask, Nz::UInt32 collisionMask, std::vector* bodies); - void RegisterCallbacks(unsigned int collisionId, const Callback& callbacks); - void RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, const Callback& callbacks); + void RegisterCallbacks(unsigned int collisionId, Callback callbacks); + void RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, Callback callbacks); inline void SetDamping(float dampingValue); inline void SetGravity(const Nz::Vector2f& gravity); diff --git a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp index c4ea461f0..a5bed6d28 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem2D.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem2D.cpp @@ -224,36 +224,39 @@ namespace Ndk } } - void PhysicsSystem2D::RegisterCallbacks(unsigned int collisionId, const Callback& callbacks) + void PhysicsSystem2D::RegisterCallbacks(unsigned int collisionId, Callback callbacks) { Nz::PhysWorld2D::Callback worldCallbacks; if (callbacks.endCallback) { - worldCallbacks.endCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.endCallback = [this, cb = std::move(callbacks.endCallback)](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { - callbacks.endCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; } + if (callbacks.preSolveCallback) { - worldCallbacks.preSolveCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.preSolveCallback = [this, cb = std::move(callbacks.preSolveCallback)](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { - return callbacks.preSolveCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + return cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; } + if (callbacks.postSolveCallback) { - worldCallbacks.postSolveCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.postSolveCallback = [this, cb = std::move(callbacks.postSolveCallback)](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { - callbacks.postSolveCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; } + if (callbacks.startCallback) { - worldCallbacks.startCallback = [&callbacks, this](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.startCallback = [this, cb = std::move(callbacks.startCallback)](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { - return callbacks.startCallback(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); + return cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; } @@ -262,13 +265,13 @@ namespace Ndk m_physWorld->RegisterCallbacks(collisionId, worldCallbacks); } - void PhysicsSystem2D::RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, const Callback& callbacks) + void PhysicsSystem2D::RegisterCallbacks(unsigned int collisionIdA, unsigned int collisionIdB, Callback callbacks) { Nz::PhysWorld2D::Callback worldCallbacks{}; if (callbacks.endCallback) { - worldCallbacks.endCallback = [this, cb = callbacks.endCallback](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.endCallback = [this, cb = std::move(callbacks.endCallback)](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; @@ -276,7 +279,7 @@ namespace Ndk if (callbacks.preSolveCallback) { - worldCallbacks.preSolveCallback = [this, cb = callbacks.preSolveCallback](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.preSolveCallback = [this, cb = std::move(callbacks.preSolveCallback)](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { return cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; @@ -284,7 +287,7 @@ namespace Ndk if (callbacks.postSolveCallback) { - worldCallbacks.postSolveCallback = [this, cb = callbacks.postSolveCallback](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.postSolveCallback = [this, cb = std::move(callbacks.postSolveCallback)](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); }; @@ -292,7 +295,7 @@ namespace Ndk if (callbacks.startCallback) { - worldCallbacks.startCallback = [this, cb = callbacks.startCallback](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) + worldCallbacks.startCallback = [this, cb = std::move(callbacks.startCallback)](Nz::PhysWorld2D& world, Nz::Arbiter2D& arbiter, Nz::RigidBody2D& bodyA, Nz::RigidBody2D& bodyB, void* userdata) { return cb(*this, arbiter, GetEntityFromBody(bodyA), GetEntityFromBody(bodyB), userdata); };