diff --git a/ChangeLog.md b/ChangeLog.md index d85eb5164..cb5e4d833 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -94,6 +94,7 @@ Nazara Engine: - ⚠️ Stream::ReadLine will now returns empty lines if present in the file - Fixed cubemaps seams with OpenGL - HandledObject movement constructor/assignement operator are now marked noexcept +- ⚠️ PhysWorld2D callbacks OnPhysWorld2DPreStep and OnPhysWorld2DPostStep now takes a invStepCount depending on the number of step taken this update, fixing force application and other Nazara Development Kit: - Added ImageWidget (#139) diff --git a/include/Nazara/Physics2D/PhysWorld2D.hpp b/include/Nazara/Physics2D/PhysWorld2D.hpp index e2ec3b042..301e73563 100644 --- a/include/Nazara/Physics2D/PhysWorld2D.hpp +++ b/include/Nazara/Physics2D/PhysWorld2D.hpp @@ -123,8 +123,8 @@ namespace Nz float fraction; }; - NazaraSignal(OnPhysWorld2DPreStep, const PhysWorld2D* /*physWorld*/); - NazaraSignal(OnPhysWorld2DPostStep, const PhysWorld2D* /*physWorld*/); + NazaraSignal(OnPhysWorld2DPreStep, const PhysWorld2D* /*physWorld*/, float /*invStepCount*/); + NazaraSignal(OnPhysWorld2DPostStep, const PhysWorld2D* /*physWorld*/, float /*invStepCount*/); private: void InitCallbacks(cpCollisionHandler* handler, const Callback& callbacks); diff --git a/src/Nazara/Physics2D/PhysWorld2D.cpp b/src/Nazara/Physics2D/PhysWorld2D.cpp index 807c0e7cc..ea648b197 100644 --- a/src/Nazara/Physics2D/PhysWorld2D.cpp +++ b/src/Nazara/Physics2D/PhysWorld2D.cpp @@ -311,14 +311,15 @@ namespace Nz { m_timestepAccumulator += timestep; - std::size_t stepCount = 0; - while (m_timestepAccumulator >= m_stepSize && stepCount < m_maxStepCount) + std::size_t stepCount = std::min(static_cast(m_timestepAccumulator / m_stepSize), m_maxStepCount); + float invStepCount = 1.f / stepCount; + for (std::size_t i = 0; i < stepCount; ++i) { - OnPhysWorld2DPreStep(this); + OnPhysWorld2DPreStep(this, invStepCount); cpSpaceStep(m_handle, m_stepSize); - OnPhysWorld2DPostStep(this); + OnPhysWorld2DPostStep(this, invStepCount); if (!m_rigidPostSteps.empty()) { for (const auto& pair : m_rigidPostSteps) @@ -331,7 +332,6 @@ namespace Nz } m_timestepAccumulator -= m_stepSize; - stepCount++; } }