diff -r a4c17cfaa4c9 -r abbb74b9cb62 rust/hwphysics/src/collision.rs --- a/rust/hwphysics/src/collision.rs Fri Nov 09 01:05:34 2018 +0300 +++ b/rust/hwphysics/src/collision.rs Fri Nov 09 03:36:21 2018 +0300 @@ -3,7 +3,7 @@ }; use crate::{ - common::GearId, + common::{GearId, GearData, GearDataProcessor}, physics::PhysicsData, grid::Grid }; @@ -42,18 +42,29 @@ pub bounds: CircleBounds } +impl GearData for CollisionData {} + #[derive(PartialEq, Eq, Clone, Copy, Debug)] pub struct ContactData { pub elasticity: FPNum, pub friction: FPNum } +impl GearData for ContactData {} + struct EnabledCollisionsCollection { gear_ids: Vec, collisions: Vec } impl EnabledCollisionsCollection { + fn new() -> Self { + Self { + gear_ids: Vec::new(), + collisions: Vec::new() + } + } + fn push(&mut self, gear_id: GearId, collision: CollisionData) { self.gear_ids.push(gear_id); self.collisions.push(collision); @@ -86,26 +97,32 @@ pub fn push(&mut self, contact_gear_id1: GearId, contact_gear_id2: GearId, position: &FPPoint) { self.pairs.push((contact_gear_id1, contact_gear_id2)); - self.positions.push(fppoint_round(position)); + self.positions.push(fppoint_round(&position)); } } impl CollisionProcessor { - pub fn process(&mut self, land: &Land2D, updates: &crate::physics::PositionUpdate) { + pub fn new(size: Size) -> Self { + Self { + grid: Grid::new(size), + enabled_collisions: EnabledCollisionsCollection::new(), + detected_collisions: DetectedCollisions::new(0) + } + } + + pub fn process(&mut self, land: &Land2D, updates: &crate::physics::PositionUpdates) { self.grid.check_collisions(&mut self.detected_collisions); for (gear_id, collision) in self.enabled_collisions.iter() { if collision.bounds.rows().any(|(y, r)| (&land[y][r]).iter().any(|v| *v != 0)) { - self.detected_collisions.push(0, 0, &collision.bounds.center) + self.detected_collisions.push(gear_id, 0, &collision.bounds.center) } } } +} - pub fn push(&mut self, gear_id: GearId, physics_data: PhysicsData, collision_data: CollisionData) { - if physics_data.velocity.is_zero() { - self.grid.insert_static(0, &physics_data.position, &collision_data.bounds); - } else { - self.grid.insert_dynamic(0, &physics_data.position, &collision_data.bounds); - } +impl GearDataProcessor for CollisionProcessor { + fn add(&mut self, gear_id: GearId, gear_data: CollisionData) { + self.grid.insert_static(gear_id, &gear_data.bounds); } } \ No newline at end of file