diff -r 901751d3cd80 -r febccab419b1 rust/hwphysics/src/physics.rs --- a/rust/hwphysics/src/physics.rs Tue Jun 04 23:19:18 2019 +0300 +++ b/rust/hwphysics/src/physics.rs Tue Jun 04 22:34:42 2019 +0200 @@ -1,137 +1,137 @@ -use crate::common::{GearData, GearDataProcessor, GearId}; -use fpnum::*; -use integral_geometry::{GridIndex, Point, Size}; - -#[derive(PartialEq, Eq, Clone, Copy, Debug)] -pub struct PhysicsData { - pub position: FPPoint, - pub velocity: FPPoint, -} - -impl GearData for PhysicsData {} - -impl PhysicsData { - pub fn new(position: FPPoint, velocity: FPPoint) -> Self { - Self { position, velocity } - } -} - -pub struct DynamicPhysicsCollection { - gear_ids: Vec, - positions: Vec, - velocities: Vec, -} - -impl DynamicPhysicsCollection { - fn new() -> Self { - Self { - gear_ids: Vec::new(), - positions: Vec::new(), - velocities: Vec::new(), - } - } - - 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 new() -> Self { - Self { - gear_ids: Vec::new(), - positions: Vec::new(), - } - } - - 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: PositionUpdates, -} - -pub struct PositionUpdates { - pub gear_ids: Vec, - pub positions: Vec, -} - -impl PositionUpdates { - 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 new() -> Self { - PhysicsProcessor { - dynamic_physics: DynamicPhysicsCollection::new(), - static_physics: StaticPhysicsCollection::new(), - physics_cleanup: Vec::new(), - position_updates: PositionUpdates::new(0), - } - } - - pub fn process(&mut self, time_step: FPNum) -> &PositionUpdates { - 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); - } - } -} - -impl GearDataProcessor for PhysicsProcessor { - fn add(&mut self, gear_id: GearId, gear_data: PhysicsData) { - if gear_data.velocity.is_zero() { - self.static_physics.push(gear_id, gear_data); - } else { - self.dynamic_physics.push(gear_id, gear_data); - } - } -} +use crate::common::{GearData, GearDataProcessor, GearId}; +use fpnum::*; +use integral_geometry::{GridIndex, Point, Size}; + +#[derive(PartialEq, Eq, Clone, Copy, Debug)] +pub struct PhysicsData { + pub position: FPPoint, + pub velocity: FPPoint, +} + +impl GearData for PhysicsData {} + +impl PhysicsData { + pub fn new(position: FPPoint, velocity: FPPoint) -> Self { + Self { position, velocity } + } +} + +pub struct DynamicPhysicsCollection { + gear_ids: Vec, + positions: Vec, + velocities: Vec, +} + +impl DynamicPhysicsCollection { + fn new() -> Self { + Self { + gear_ids: Vec::new(), + positions: Vec::new(), + velocities: Vec::new(), + } + } + + 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 new() -> Self { + Self { + gear_ids: Vec::new(), + positions: Vec::new(), + } + } + + 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: PositionUpdates, +} + +pub struct PositionUpdates { + pub gear_ids: Vec, + pub positions: Vec, +} + +impl PositionUpdates { + 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 new() -> Self { + PhysicsProcessor { + dynamic_physics: DynamicPhysicsCollection::new(), + static_physics: StaticPhysicsCollection::new(), + physics_cleanup: Vec::new(), + position_updates: PositionUpdates::new(0), + } + } + + pub fn process(&mut self, time_step: FPNum) -> &PositionUpdates { + 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); + } + } +} + +impl GearDataProcessor for PhysicsProcessor { + fn add(&mut self, gear_id: GearId, gear_data: PhysicsData) { + if gear_data.velocity.is_zero() { + self.static_physics.push(gear_id, gear_data); + } else { + self.dynamic_physics.push(gear_id, gear_data); + } + } +}