use crate::math::Real;
use bevy::reflect::reflect_remote;
use rapier::{dynamics::IntegrationParameters, prelude::SpringCoefficients};
#[cfg(feature = "dim3")]
use rapier::dynamics::FrictionModel;
#[cfg(feature = "dim3")]
#[reflect_remote(FrictionModel)]
#[derive(Default, Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
pub enum FrictionModelWrapper {
#[default]
Simplified,
Coulomb,
}
#[reflect_remote(SpringCoefficients<Real>)]
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct SpringCoefficientsWrapper {
pub natural_frequency: Real,
pub damping_ratio: Real,
}
#[cfg(not(feature = "dim3"))]
#[reflect_remote(IntegrationParameters)]
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct IntegrationParametersWrapper {
pub dt: Real,
pub min_ccd_dt: Real,
#[reflect(remote = SpringCoefficientsWrapper)]
pub contact_softness: SpringCoefficients<Real>,
pub warmstart_coefficient: Real,
pub length_unit: Real,
pub normalized_allowed_linear_error: Real,
pub normalized_max_corrective_velocity: Real,
pub normalized_prediction_distance: Real,
pub num_solver_iterations: usize,
pub num_internal_pgs_iterations: usize,
pub num_internal_stabilization_iterations: usize,
pub min_island_size: usize,
pub max_ccd_substeps: usize,
}
#[cfg(feature = "dim3")]
#[reflect_remote(IntegrationParameters)]
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct IntegrationParametersWrapper {
pub dt: Real,
pub min_ccd_dt: Real,
#[reflect(remote = SpringCoefficientsWrapper)]
pub contact_softness: SpringCoefficients<Real>,
pub warmstart_coefficient: Real,
pub length_unit: Real,
pub normalized_allowed_linear_error: Real,
pub normalized_max_corrective_velocity: Real,
pub normalized_prediction_distance: Real,
pub num_solver_iterations: usize,
pub num_internal_pgs_iterations: usize,
pub num_internal_stabilization_iterations: usize,
pub min_island_size: usize,
pub max_ccd_substeps: usize,
#[reflect(remote = FrictionModelWrapper)]
pub friction_model: FrictionModel,
}