From 9e0d54616f19c3077a299f2d19b2da19a007a9bd Mon Sep 17 00:00:00 2001 From: RaphaelIT7 Date: Mon, 2 Oct 2023 00:40:34 +0200 Subject: [PATCH 1/2] Fixed a crash [#] Fixed a crash Related issues: fixes #137 fixes #85 --- vphysics_jolt/vjolt_environment.cpp | 32 ++++++++++++++++++----------- vphysics_jolt/vjolt_environment.h | 2 +- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/vphysics_jolt/vjolt_environment.cpp b/vphysics_jolt/vjolt_environment.cpp index 34baf4b..01b41a7 100644 --- a/vphysics_jolt/vjolt_environment.cpp +++ b/vphysics_jolt/vjolt_environment.cpp @@ -771,6 +771,10 @@ void JoltPhysicsEnvironment::Simulate( float deltaTime ) // doing the simulation... m_ContactListener.PostSimulationFrame(); + // RaphaelIT7: We need to delete all dead objects after m_ContactListener.PostSimulationFrame, or else Jolt freaks out for some reason. + // This also needs to be before pController->OnPreSimulate or else we get some crashes. + DeleteDeadObjects(true); + // Run pre-simulation controllers for ( IJoltPhysicsController *pController : m_pPhysicsControllers ) pController->OnPreSimulate( deltaTime ); @@ -818,8 +822,10 @@ void JoltPhysicsEnvironment::Simulate( float deltaTime ) // If the delete queue is disabled, we only added to it during the simulation // ie. callbacks etc. So flush that now. - if ( !m_bEnableDeleteQueue ) + if ( !m_bEnableDeleteQueue ) { DeleteDeadObjects(); + DeleteDeadObjects(true); // Also delete all bodies + } #ifdef JPH_DEBUG_RENDERER JoltPhysicsDebugRenderer::GetInstance().RenderPhysicsSystem( m_PhysicsSystem ); @@ -1430,19 +1436,21 @@ void JoltPhysicsEnvironment::RemoveBodyAndDeleteObject( JoltPhysicsObject *pObje delete pObject; } -void JoltPhysicsEnvironment::DeleteDeadObjects() +void JoltPhysicsEnvironment::DeleteDeadObjects( bool delBodies ) { - for ( JoltPhysicsObject *pObject : m_pDeadObjects ) - RemoveBodyAndDeleteObject( pObject ); - m_pDeadObjects.clear(); + if (delBodies) { + for ( JoltPhysicsObject *pObject : m_pDeadObjects ) + RemoveBodyAndDeleteObject( pObject ); + m_pDeadObjects.clear(); + } else { + for ( JoltPhysicsConstraint *pConstraint : m_pDeadConstraints ) + delete pConstraint; + m_pDeadConstraints.clear(); - for ( JoltPhysicsConstraint *pConstraint : m_pDeadConstraints ) - delete pConstraint; - m_pDeadConstraints.clear(); - - for ( CPhysCollide *pCollide : m_pDeadObjectCollides ) - JoltPhysicsCollision::GetInstance().DestroyCollide( pCollide ); - m_pDeadObjectCollides.clear(); + for ( CPhysCollide *pCollide : m_pDeadObjectCollides ) + JoltPhysicsCollision::GetInstance().DestroyCollide( pCollide ); + m_pDeadObjectCollides.clear(); + } } //------------------------------------------------------------------------------------------------- diff --git a/vphysics_jolt/vjolt_environment.h b/vphysics_jolt/vjolt_environment.h index 300dcb2..cfc377a 100644 --- a/vphysics_jolt/vjolt_environment.h +++ b/vphysics_jolt/vjolt_environment.h @@ -172,7 +172,7 @@ public: private: void RemoveBodyAndDeleteObject( JoltPhysicsObject* pObject ); - void DeleteDeadObjects(); + void DeleteDeadObjects(bool delBodies = false); template void AddPhysicsSaveRestorePointer( uintp oldPtr, T* newPtr ); From 6493adbcc387dcf1fb0d53839d8bb9c5dba67abb Mon Sep 17 00:00:00 2001 From: RaphaelIT7 Date: Mon, 2 Oct 2023 22:08:19 +0200 Subject: [PATCH 2/2] Codestyle --- vphysics_jolt/vjolt_environment.cpp | 6 +++--- vphysics_jolt/vjolt_environment.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/vphysics_jolt/vjolt_environment.cpp b/vphysics_jolt/vjolt_environment.cpp index 01b41a7..6f817ce 100644 --- a/vphysics_jolt/vjolt_environment.cpp +++ b/vphysics_jolt/vjolt_environment.cpp @@ -773,7 +773,7 @@ void JoltPhysicsEnvironment::Simulate( float deltaTime ) // RaphaelIT7: We need to delete all dead objects after m_ContactListener.PostSimulationFrame, or else Jolt freaks out for some reason. // This also needs to be before pController->OnPreSimulate or else we get some crashes. - DeleteDeadObjects(true); + DeleteDeadObjects( true ); // Run pre-simulation controllers for ( IJoltPhysicsController *pController : m_pPhysicsControllers ) @@ -824,7 +824,7 @@ void JoltPhysicsEnvironment::Simulate( float deltaTime ) // ie. callbacks etc. So flush that now. if ( !m_bEnableDeleteQueue ) { DeleteDeadObjects(); - DeleteDeadObjects(true); // Also delete all bodies + DeleteDeadObjects( true ); // Also delete all bodies } #ifdef JPH_DEBUG_RENDERER @@ -1438,7 +1438,7 @@ void JoltPhysicsEnvironment::RemoveBodyAndDeleteObject( JoltPhysicsObject *pObje void JoltPhysicsEnvironment::DeleteDeadObjects( bool delBodies ) { - if (delBodies) { + if ( delBodies ) { for ( JoltPhysicsObject *pObject : m_pDeadObjects ) RemoveBodyAndDeleteObject( pObject ); m_pDeadObjects.clear(); diff --git a/vphysics_jolt/vjolt_environment.h b/vphysics_jolt/vjolt_environment.h index cfc377a..876b2d8 100644 --- a/vphysics_jolt/vjolt_environment.h +++ b/vphysics_jolt/vjolt_environment.h @@ -172,7 +172,7 @@ public: private: void RemoveBodyAndDeleteObject( JoltPhysicsObject* pObject ); - void DeleteDeadObjects(bool delBodies = false); + void DeleteDeadObjects( bool delBodies = false ); template void AddPhysicsSaveRestorePointer( uintp oldPtr, T* newPtr );