use crate::step::SimulationStepResult;
use slang_hal::backend::WebGpu;
use slosh::pipeline::{MpmData, MpmPipeline};
use slosh::rapier::prelude::{
CCDSolver, ColliderSet, DefaultBroadPhase, ImpulseJointSet, IntegrationParameters,
IslandManager, MultibodyJointSet, NarrowPhase, PhysicsPipeline, RigidBodySet,
};
use slosh::solver::{GpuParticleModel, GpuParticleModelData, Particle};
use std::any::Any;
pub struct AppState<GpuModel: GpuParticleModelData = GpuParticleModel> {
pub run_state: RunState,
pub pipeline: MpmPipeline<WebGpu, GpuModel>,
pub min_num_substeps: u32,
pub max_num_substeps: u32,
pub num_substeps: u32,
pub gravity_factor: f32,
pub restarting: bool,
pub show_rigid_particles: bool,
}
#[derive(Default)]
pub struct RapierData {
pub bodies: RigidBodySet,
pub colliders: ColliderSet,
pub impulse_joints: ImpulseJointSet,
pub multibody_joints: MultibodyJointSet,
pub params: IntegrationParameters,
pub physics_pipeline: PhysicsPipeline,
pub narrow_phase: NarrowPhase,
pub broad_phase: DefaultBroadPhase,
pub ccd_solver: CCDSolver,
pub islands: IslandManager,
}
pub trait PhysicsCallback<GpuModel: GpuParticleModelData> {
fn update(&mut self, state: &mut PhysicsState<'_, GpuModel>);
}
impl<GpuModel: GpuParticleModelData, F: FnMut(&mut PhysicsState<GpuModel>)>
PhysicsCallback<GpuModel> for F
{
fn update(&mut self, state: &mut PhysicsState<'_, GpuModel>) {
(*self)(state);
}
}
pub struct PhysicsState<'a, GpuModel: GpuParticleModelData = GpuParticleModel> {
pub backend: &'a WebGpu,
pub data: &'a mut MpmData<WebGpu, GpuModel>,
pub results: &'a SimulationStepResult,
pub(crate) step_id: usize,
}
impl<'a, GpuModel: GpuParticleModelData> PhysicsState<'a, GpuModel> {
pub fn step_id(&self) -> usize {
self.step_id
}
pub fn add_particles(&mut self, particles: &[Particle<GpuModel::Model>]) {
self.data
.particles
.append(self.backend, particles)
.expect("Failed to add particles.");
}
}
pub struct PhysicsContext<GpuModel: GpuParticleModelData = GpuParticleModel> {
pub data: MpmData<WebGpu, GpuModel>,
pub rapier_data: RapierData,
pub callbacks: Vec<Box<dyn PhysicsCallback<GpuModel>>>,
pub hooks_state: Option<Box<dyn Any>>,
}
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum RunState {
Running,
Paused,
Step,
}