diff -r a4dd3d307115 -r a4c17cfaa4c9 rust/hwphysics/src/physics.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/hwphysics/src/physics.rs Fri Nov 09 01:05:34 2018 +0300 @@ -0,0 +1,99 @@ +use crate::{ + common::GearId +}; +use fpnum::*; +use integral_geometry::{ + Point, Size, GridIndex +}; + +#[derive(PartialEq, Eq, Clone, Copy, Debug)] +pub struct PhysicsData { + pub position: FPPoint, + pub velocity: FPPoint, +} + + +pub struct DynamicPhysicsCollection { + gear_ids: Vec, + positions: Vec, + velocities: Vec, +} + +impl DynamicPhysicsCollection { + fn len(&self) -> usize { + self.gear_ids.len() + } + + fn push(&mut self, id: GearId, physics: PhysicsData) { + self.gear_ids.push(id); + self.positions.push(physics.position); + self.velocities.push(physics.velocity); + } + + fn iter_pos_update(&mut self) -> impl Iterator { + self.gear_ids.iter().cloned() + .zip(self.positions.iter_mut() + .zip(self.velocities.iter())) + } +} + +pub struct StaticPhysicsCollection { + gear_ids: Vec, + positions: Vec +} + +impl StaticPhysicsCollection { + fn push(&mut self, gear_id: GearId, physics: PhysicsData) { + self.gear_ids.push(gear_id); + self.positions.push(physics.position); + } +} + +pub struct PhysicsProcessor { + dynamic_physics: DynamicPhysicsCollection, + static_physics: StaticPhysicsCollection, + + physics_cleanup: Vec, + position_updates: PositionUpdate +} + +pub struct PositionUpdate { + pub gear_ids: Vec, + pub positions: Vec +} + +impl PositionUpdate { + pub fn new(capacity: usize) -> Self { + Self { + gear_ids: Vec::with_capacity(capacity), + positions: Vec::with_capacity(capacity), + } + } + + pub fn push(&mut self, gear_id: GearId, position: &FPPoint) { + self.gear_ids.push(gear_id); + self.positions.push(*position); + } +} + +impl PhysicsProcessor { + pub fn process(&mut self, time_step: FPNum) -> &PositionUpdate { + for (gear_id, (pos, vel)) in self.dynamic_physics.iter_pos_update() { + *pos += *vel * time_step; + if !vel.is_zero() { + self.position_updates.push(gear_id, pos) + } else { + self.physics_cleanup.push(gear_id) + } + } + &self.position_updates + } + + pub fn push(&mut self, gear_id: GearId, physics_data: PhysicsData) { + if physics_data.velocity.is_zero() { + self.static_physics.push(gear_id, physics_data); + } else { + self.dynamic_physics.push(gear_id, physics_data); + } + } +} \ No newline at end of file