diff --git a/fyrox-impl/src/scene/dim2/physics/mod.rs b/fyrox-impl/src/scene/dim2/physics/mod.rs index bd7fa7d20..5cc32de0b 100644 --- a/fyrox-impl/src/scene/dim2/physics/mod.rs +++ b/fyrox-impl/src/scene/dim2/physics/mod.rs @@ -60,6 +60,7 @@ use crate::{ tilemap::TileMap, }, }; +use fyrox_core::err; pub use rapier2d::geometry; use rapier2d::math::{Pose2, Vec2}; use rapier2d::parry::query::DefaultQueryDispatcher; @@ -78,6 +79,7 @@ use rapier2d::{ parry::query::ShapeCastOptions, pipeline::{DebugRenderPipeline, EventHandler, PhysicsPipeline}, }; +use std::panic::AssertUnwindSafe; use std::{ cmp::Ordering, fmt::{Debug, Formatter}, @@ -740,20 +742,28 @@ impl PhysicsWorld { max_ccd_substeps: self.integration_parameters.max_ccd_substeps as usize, }; - self.pipeline.step( - (*self.gravity).into(), - &integration_parameters, - &mut self.islands, - &mut self.broad_phase, - &mut self.narrow_phase, - &mut self.bodies, - &mut self.colliders, - &mut self.joints.set, - &mut self.multibody_joints.set, - &mut self.ccd_solver, - &(), - &*self.event_handler, - ); + if let Err(message) = std::panic::catch_unwind(AssertUnwindSafe(|| { + self.pipeline.step( + (*self.gravity).into(), + &integration_parameters, + &mut self.islands, + &mut self.broad_phase, + &mut self.narrow_phase, + &mut self.bodies, + &mut self.colliders, + &mut self.joints.set, + &mut self.multibody_joints.set, + &mut self.ccd_solver, + &(), + &*self.event_handler, + ); + })) { + if let Some(message) = message.downcast_ref::<&str>() { + err!("A critical error occurred during physics step. Reason: {message}"); + } else { + err!("A critical error occurred during physics step. The reason is unknown."); + } + } } self.performance_statistics.step_time += instant::Instant::now() - time; diff --git a/fyrox-impl/src/scene/graph/physics/mod.rs b/fyrox-impl/src/scene/graph/physics/mod.rs index 1805bfdcb..9ab0aefb0 100644 --- a/fyrox-impl/src/scene/graph/physics/mod.rs +++ b/fyrox-impl/src/scene/graph/physics/mod.rs @@ -55,6 +55,7 @@ use crate::{ }, utils::raw_mesh::{RawMeshBuilder, RawVertex}, }; +use fyrox_core::err; use fyrox_graph::{NodeWrapper, SceneGraph}; pub use rapier3d::geometry; use rapier3d::{ @@ -72,6 +73,7 @@ use rapier3d::{ pipeline::{DebugRenderPipeline, EventHandler, PhysicsPipeline, QueryPipeline}, prelude::{FrictionModel, HeightFieldCellStatus, JointAxis, MassProperties}, }; +use std::panic::AssertUnwindSafe; use std::{ cell::Cell, cmp::Ordering, @@ -1183,20 +1185,28 @@ impl PhysicsWorld { friction_model: FrictionModel::default(), }; - self.pipeline.step( - (*self.gravity).into(), - &integration_parameters, - &mut self.islands, - &mut self.broad_phase, - &mut self.narrow_phase, - &mut self.bodies, - &mut self.colliders, - &mut self.joints.set, - &mut self.multibody_joints.set, - &mut self.ccd_solver, - &(), - &*self.event_handler, - ); + if let Err(message) = std::panic::catch_unwind(AssertUnwindSafe(|| { + self.pipeline.step( + (*self.gravity).into(), + &integration_parameters, + &mut self.islands, + &mut self.broad_phase, + &mut self.narrow_phase, + &mut self.bodies, + &mut self.colliders, + &mut self.joints.set, + &mut self.multibody_joints.set, + &mut self.ccd_solver, + &(), + &*self.event_handler, + ); + })) { + if let Some(message) = message.downcast_ref::<&str>() { + err!("A critical error occurred during physics step. Reason: {message}"); + } else { + err!("A critical error occurred during physics step. The reason is unknown."); + } + } } self.performance_statistics.step_time += instant::Instant::now() - time;