use crate::prelude::*;
use bevy::prelude::*;
#[cfg_attr(feature = "2d", doc = "use avian2d::prelude::*;")]
#[cfg_attr(feature = "3d", doc = "use avian3d::prelude::*;")]
#[cfg_attr(feature = "2d", doc = "use avian2d::prelude::*;")]
#[cfg_attr(feature = "3d", doc = "use avian3d::prelude::*;")]
#[cfg_attr(feature = "2d", doc = "use avian2d::prelude::*;")]
#[cfg_attr(feature = "3d", doc = "use avian3d::prelude::*;")]
#[derive(Reflect, Clone, Copy, Debug, PartialEq)]
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serialize", reflect(Serialize, Deserialize))]
#[reflect(Debug, PartialEq)]
pub struct Physics {
paused: bool,
relative_speed: f64,
}
impl Default for Physics {
fn default() -> Self {
Self {
paused: false,
relative_speed: 1.0,
}
}
}
pub trait PhysicsTime {
fn relative_speed(&self) -> f32;
fn relative_speed_f64(&self) -> f64;
fn with_relative_speed(self, ratio: f32) -> Self;
fn with_relative_speed_f64(self, ratio: f64) -> Self;
fn set_relative_speed(&mut self, ratio: f32);
fn set_relative_speed_f64(&mut self, ratio: f64);
fn is_paused(&self) -> bool;
fn pause(&mut self);
#[doc(alias = "resume")]
fn unpause(&mut self);
}
impl PhysicsTime for Time<Physics> {
fn with_relative_speed(self, ratio: f32) -> Self {
self.with_relative_speed_f64(ratio as f64)
}
fn with_relative_speed_f64(mut self, ratio: f64) -> Self {
assert!(ratio.is_finite(), "tried to go infinitely fast");
assert!(ratio >= 0.0, "tried to go back in time");
self.context_mut().relative_speed = ratio;
self
}
fn relative_speed(&self) -> f32 {
self.relative_speed_f64() as f32
}
fn relative_speed_f64(&self) -> f64 {
self.context().relative_speed
}
fn set_relative_speed(&mut self, ratio: f32) {
self.set_relative_speed_f64(ratio as f64);
}
fn set_relative_speed_f64(&mut self, ratio: f64) {
assert!(ratio.is_finite(), "tried to go infinitely fast");
assert!(ratio >= 0.0, "tried to go back in time");
self.context_mut().relative_speed = ratio;
}
fn pause(&mut self) {
self.context_mut().paused = true;
}
fn unpause(&mut self) {
self.context_mut().paused = false;
}
fn is_paused(&self) -> bool {
self.context().paused
}
}
#[derive(Reflect, Clone, Copy, Debug, Default, PartialEq)]
pub struct Substeps;
pub(crate) trait TimePrecisionAdjusted {
fn delta_seconds_adjusted(&self) -> Scalar;
}
impl TimePrecisionAdjusted for Time {
fn delta_seconds_adjusted(&self) -> Scalar {
#[cfg(feature = "f32")]
{
self.delta_secs()
}
#[cfg(feature = "f64")]
{
self.delta_secs_f64()
}
}
}