use crate::prelude::*;
use bevy::prelude::*;
use derive_more::From;
use std::ops::{Deref, DerefMut};
#[cfg(feature = "2d")]
pub(crate) type Torque = Scalar;
#[cfg(feature = "3d")]
pub(crate) type Torque = Vector;
pub(crate) trait FloatZero {
const ZERO: Self;
}
impl FloatZero for Scalar {
const ZERO: Self = 0.0;
}
#[derive(Reflect, Clone, Copy, Component, Debug, PartialEq, From)]
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
#[reflect(Component)]
pub struct ExternalForce {
force: Vector,
pub persistent: bool,
torque: Torque,
}
impl Deref for ExternalForce {
type Target = Vector;
fn deref(&self) -> &Self::Target {
&self.force
}
}
impl DerefMut for ExternalForce {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.force
}
}
impl Default for ExternalForce {
fn default() -> Self {
Self {
force: Vector::ZERO,
persistent: true,
torque: Torque::ZERO,
}
}
}
impl ExternalForce {
pub const ZERO: Self = Self {
force: Vector::ZERO,
persistent: true,
torque: Torque::ZERO,
};
pub fn new(force: Vector) -> Self {
Self { force, ..default() }
}
pub fn set_force(&mut self, force: Vector) -> &mut Self {
**self = force;
self
}
pub fn apply_force(&mut self, force: Vector) -> &mut Self {
**self += force;
self
}
pub fn apply_force_at_point(
&mut self,
force: Vector,
point: Vector,
center_of_mass: Vector,
) -> &mut Self {
**self += force;
#[cfg(feature = "2d")]
{
self.torque += (point - center_of_mass).perp_dot(force);
}
#[cfg(feature = "3d")]
{
self.torque += (point - center_of_mass).cross(force);
}
self
}
pub fn force(&self) -> Vector {
self.force
}
pub fn torque(&self) -> Torque {
self.torque
}
#[doc(alias = "clear_automatically")]
pub fn with_persistence(mut self, is_persistent: bool) -> Self {
self.persistent = is_persistent;
self
}
pub fn clear(&mut self) {
self.force = Vector::ZERO;
self.torque = Torque::ZERO;
}
}
#[derive(Reflect, Clone, Copy, Component, Debug, PartialEq, From)]
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
#[reflect(Component)]
pub struct ExternalTorque {
torque: Torque,
pub persistent: bool,
}
impl Deref for ExternalTorque {
type Target = Torque;
fn deref(&self) -> &Self::Target {
&self.torque
}
}
impl DerefMut for ExternalTorque {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.torque
}
}
impl Default for ExternalTorque {
fn default() -> Self {
Self {
torque: Torque::ZERO,
persistent: true,
}
}
}
impl ExternalTorque {
pub const ZERO: Self = Self {
torque: Torque::ZERO,
persistent: true,
};
pub fn new(torque: Torque) -> Self {
Self {
torque,
..default()
}
}
pub fn set_torque(&mut self, torque: Torque) -> &mut Self {
**self = torque;
self
}
pub fn apply_torque(&mut self, torque: Torque) -> &mut Self {
**self += torque;
self
}
#[doc(alias = "clear_automatically")]
pub fn with_persistence(mut self, is_persistent: bool) -> Self {
self.persistent = is_persistent;
self
}
pub fn torque(&self) -> Torque {
self.torque
}
pub fn clear(&mut self) {
self.torque = Torque::ZERO;
}
}
#[derive(Reflect, Clone, Copy, Component, Debug, PartialEq, From)]
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
#[reflect(Component)]
pub struct ExternalImpulse {
impulse: Vector,
pub persistent: bool,
angular_impulse: Torque,
}
impl Deref for ExternalImpulse {
type Target = Vector;
fn deref(&self) -> &Self::Target {
&self.impulse
}
}
impl DerefMut for ExternalImpulse {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.impulse
}
}
impl Default for ExternalImpulse {
fn default() -> Self {
Self {
impulse: Vector::ZERO,
persistent: false,
angular_impulse: Torque::ZERO,
}
}
}
impl ExternalImpulse {
pub const ZERO: Self = Self {
impulse: Vector::ZERO,
persistent: false,
angular_impulse: Torque::ZERO,
};
pub fn new(impulse: Vector) -> Self {
Self {
impulse,
..default()
}
}
pub fn set_impulse(&mut self, impulse: Vector) -> &mut Self {
**self = impulse;
self
}
pub fn apply_impulse(&mut self, impulse: Vector) -> &mut Self {
**self += impulse;
self
}
pub fn apply_impulse_at_point(
&mut self,
impulse: Vector,
point: Vector,
center_of_mass: Vector,
) -> &mut Self {
**self += impulse;
#[cfg(feature = "2d")]
{
self.angular_impulse += (point - center_of_mass).perp_dot(impulse);
}
#[cfg(feature = "3d")]
{
self.angular_impulse += (point - center_of_mass).cross(impulse);
}
self
}
pub fn impulse(&self) -> Vector {
self.impulse
}
pub fn angular_impulse(&self) -> Torque {
self.angular_impulse
}
#[doc(alias = "clear_automatically")]
pub fn with_persistence(mut self, is_persistent: bool) -> Self {
self.persistent = is_persistent;
self
}
pub fn clear(&mut self) {
self.impulse = Vector::ZERO;
self.angular_impulse = Torque::ZERO;
}
}
#[derive(Reflect, Clone, Copy, Component, Debug, PartialEq, From)]
#[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))]
#[reflect(Component)]
#[doc(alias = "ExternalTorqueImpulse")]
pub struct ExternalAngularImpulse {
impulse: Torque,
pub persistent: bool,
}
impl Deref for ExternalAngularImpulse {
type Target = Torque;
fn deref(&self) -> &Self::Target {
&self.impulse
}
}
impl DerefMut for ExternalAngularImpulse {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.impulse
}
}
impl Default for ExternalAngularImpulse {
fn default() -> Self {
Self {
impulse: Torque::ZERO,
persistent: false,
}
}
}
impl ExternalAngularImpulse {
pub const ZERO: Self = Self {
impulse: Torque::ZERO,
persistent: false,
};
pub fn new(impulse: Torque) -> Self {
Self {
impulse,
..default()
}
}
pub fn set_impulse(&mut self, impulse: Torque) -> &mut Self {
**self = impulse;
self
}
pub fn apply_impulse(&mut self, impulse: Torque) -> &mut Self {
**self += impulse;
self
}
#[doc(alias = "clear_automatically")]
pub fn with_persistence(mut self, is_persistent: bool) -> Self {
self.persistent = is_persistent;
self
}
pub fn impulse(&self) -> Torque {
self.impulse
}
pub fn clear(&mut self) {
self.impulse = Torque::ZERO;
}
}