1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//! Simulation force entities

use {cgmath};

use {object};

/// Force interface trait
pub trait Force {
  fn impulse <O : object::Inertial> (&self,
    object : &O, step : u64, duration : f64) -> cgmath::Vector3 <f64>;
}

/// Bitflags for specifying certain forces
#[derive(EnumFlags, Copy, Clone, Debug)]
#[repr(u8)]
pub enum Flag {
  Gravity = 0b_0000_0001
}

/// A gravitational field.
///
/// This is intended to imitate a gravitational field such as that found on the
/// surface of the earth where objects are small enough that their relative mass
/// is negligable, resulting in a constant acceleration for all objects.
#[cfg_attr(feature = "derive_serdes", derive(Serialize, Deserialize))]
#[derive(Clone,Debug, PartialEq)]
pub struct Gravity {
  pub acceleration : cgmath::Vector3 <f64>
}

impl Force for Gravity {
  fn impulse <O : object::Inertial> (&self,
    object : &O, _step : u64, duration : f64) -> cgmath::Vector3 <f64>
  {
    duration * object.mass().mass() * self.acceleration
  }
}