From 95f137816a6c8e7352f57352063d5ed33b679583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Mon, 30 Apr 2018 14:55:28 +0200 Subject: [PATCH] Physics2D/PhysWorld2D: Add invStepCount argument to pre/post steps callbacks --- ChangeLog.md | 1 + include/Nazara/Physics2D/PhysWorld2D.hpp | 4 ++-- src/Nazara/Physics2D/PhysWorld2D.cpp | 10 +++++----- 3 files changed, 8 insertions(+), 7 deletions(-) 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++; } }