use enumflags2;
use derive_more::From;
#[cfg(feature = "derive_serdes")]
use serde::{Deserialize, Serialize};
use strum::Display;
use crate::{collision, component, force, math, object};
#[derive(Debug, PartialEq, Display, From)]
pub enum Input {
Step,
CreateObject (object::Variant, Option <object::Key>),
ModifyObject (ObjectModify),
DestroyObject (object::Id),
SetGravity (force::Gravity),
ClearGravity
}
#[derive(Debug, PartialEq, From)]
pub enum ObjectModify {
Dynamic (object::Key, ObjectModifyDynamic),
Static (object::Key, ObjectModifyStatic)
}
#[derive(Debug, PartialEq)]
pub enum ObjectModifyDynamic {
ApplyImpulse (math::Vector3 <f64>),
SetForceFlags (enumflags2::BitFlags <force::Flag>),
SetDrag (f64),
SetPosition (component::Position)
}
#[derive(Debug, PartialEq)]
pub enum ObjectModifyStatic {
Move (math::Vector3 <f64>)
}
#[derive(Debug, PartialEq, Display, From)]
pub enum Output {
CollisionResolve (CollisionResolve),
CreateObjectResult (CreateObjectResult),
Contact (Contact),
Overlap (Overlap)
}
#[cfg_attr(feature = "derive_serdes", derive(Deserialize, Serialize))]
#[derive(Clone, Debug, PartialEq)]
pub struct CollisionResolve {
pub toi : math::Normalized <f64>,
pub object_id_a : object::Id,
pub object_id_b : object::Id,
pub contact : collision::contact::Colliding,
pub impulse_normal_a : math::Vector3 <f64>,
pub impulse_normal_b : math::Vector3 <f64>,
pub impulse_tangent_a : math::Vector3 <f64>,
pub impulse_tangent_b : math::Vector3 <f64>,
pub pseudo_impulse_a : math::Vector3 <f64>,
pub pseudo_impulse_b : math::Vector3 <f64>
}
#[cfg_attr(feature = "derive_serdes", derive(Deserialize, Serialize))]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Overlap {
pub object_id_a : object::Id,
pub object_id_b : object::Id
}
#[cfg_attr(feature = "derive_serdes", derive(Deserialize, Serialize))]
#[derive(Clone, Debug, PartialEq)]
pub struct Contact {
pub object_id_a : object::Id,
pub object_id_b : object::Id,
pub contact : collision::Contact
}
#[derive(Debug, PartialEq)]
pub enum CreateObjectResult {
Created (object::Id),
Intersection (Vec <(object::Id, collision::Intersection)>)
}