# HG changeset patch # User alfadur # Date 1610028812 -10800 # Node ID 95402fa4e1913375f8fdb22e8e11eb6686607f4c # Parent 9588bd852202eb04eb588c262ce4983831b11b2d move time out of physics diff -r 9588bd852202 -r 95402fa4e191 rust/hwphysics/src/lib.rs --- a/rust/hwphysics/src/lib.rs Sun Dec 13 22:26:39 2020 +0100 +++ b/rust/hwphysics/src/lib.rs Thu Jan 07 17:13:32 2021 +0300 @@ -3,7 +3,6 @@ mod data; mod grid; pub mod physics; -pub mod time; use integral_geometry::Size; use land2d::Land2D; @@ -13,7 +12,6 @@ common::{GearAllocator, GearId, Millis}, data::{DataIterator, GearDataManager, TypeIter}, physics::PhysicsProcessor, - time::TimeProcessor, }; pub struct World { @@ -21,7 +19,6 @@ data: GearDataManager, physics: PhysicsProcessor, collision: CollisionProcessor, - time: TimeProcessor, } impl World { @@ -35,7 +32,6 @@ allocator: GearAllocator::new(), physics: PhysicsProcessor::new(), collision: CollisionProcessor::new(world_size), - time: TimeProcessor::new(), } } @@ -48,7 +44,6 @@ pub fn delete_gear(&mut self, gear_id: GearId) { self.data.remove_all(gear_id); self.collision.remove(gear_id); - self.time.cancel_all(gear_id); self.allocator.free(gear_id) } @@ -60,7 +55,6 @@ .process_multiple_ticks(&mut self.data, time_step) }; let collisions = self.collision.process(land, &updates); - let events = self.time.process(time_step); } #[inline] diff -r 9588bd852202 -r 95402fa4e191 rust/hwphysics/src/time.rs --- a/rust/hwphysics/src/time.rs Sun Dec 13 22:26:39 2020 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,113 +0,0 @@ -use crate::common::{GearId, Millis}; -use std::{ - cmp::{Eq, Ord, Ordering, PartialEq, PartialOrd}, - collections::BinaryHeap, -}; - -pub type EventId = u16; - -struct TimeEvent { - time: Millis, - gear_id: GearId, - event_id: EventId, -} - -impl PartialOrd for TimeEvent { - #[inline] - fn partial_cmp(&self, other: &Self) -> Option { - self.time.partial_cmp(&other.time) - } -} - -impl PartialEq for TimeEvent { - #[inline] - fn eq(&self, other: &Self) -> bool { - self.time.eq(&other.time) - } -} - -impl Ord for TimeEvent { - #[inline] - fn cmp(&self, other: &Self) -> Ordering { - self.time.cmp(&other.time) - } -} - -impl Eq for TimeEvent {} - -pub struct OccurredEvents { - events: Vec<(GearId, EventId)>, -} - -impl OccurredEvents { - fn new() -> Self { - Self { events: vec![] } - } - - fn clear(&mut self) { - self.events.clear() - } -} - -pub struct TimeProcessor { - current_event_id: EventId, - current_time: Millis, - events: BinaryHeap, - timeouts: OccurredEvents, -} - -impl TimeProcessor { - pub fn new() -> Self { - Self { - current_event_id: 0, - current_time: Millis::new(0), - events: BinaryHeap::with_capacity(1024), - timeouts: OccurredEvents::new(), - } - } - - pub fn register(&mut self, gear_id: GearId, timeout: Millis) -> EventId { - let event_id = self.current_event_id; - self.current_event_id = self.current_event_id.wrapping_add(1); - let event = TimeEvent { - time: self.current_time + timeout, - gear_id, - event_id, - }; - self.events.push(event); - event_id - } - - fn remove_events

(&mut self, predicate: P) - where - P: Fn(&TimeEvent) -> bool, - { - let events = self.events.drain().filter(predicate).collect::>(); - self.events.extend(events); - } - - pub fn cancel(&mut self, event_id: EventId) { - //self.events.retain(|event| event.event_id != event_id) - self.remove_events(|event| event.event_id != event_id) - } - - pub fn cancel_all(&mut self, gear_id: GearId) { - //self.events.retain(|event| event.gear_id != gear_id) - self.remove_events(|event| event.gear_id != gear_id) - } - - pub fn process(&mut self, time_step: Millis) -> &OccurredEvents { - self.timeouts.clear(); - self.current_time = self.current_time + time_step; - while self - .events - .peek() - .filter(|e| e.time <= self.current_time) - .is_some() - { - let event = self.events.pop().unwrap(); - self.timeouts.events.push((event.gear_id, event.event_id)) - } - &self.timeouts - } -} diff -r 9588bd852202 -r 95402fa4e191 rust/lib-hedgewars-engine/src/lib.rs --- a/rust/lib-hedgewars-engine/src/lib.rs Sun Dec 13 22:26:39 2020 +0100 +++ b/rust/lib-hedgewars-engine/src/lib.rs Thu Jan 07 17:13:32 2021 +0300 @@ -1,6 +1,7 @@ pub mod instance; pub mod ipc; mod render; +mod time; mod world; use std::{ diff -r 9588bd852202 -r 95402fa4e191 rust/lib-hedgewars-engine/src/time.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/lib-hedgewars-engine/src/time.rs Thu Jan 07 17:13:32 2021 +0300 @@ -0,0 +1,113 @@ +use std::{ + cmp::{Eq, Ord, Ordering, PartialEq, PartialOrd}, + collections::BinaryHeap, +}; +use hwphysics::common::{GearId, Millis}; + +pub type EventId = u16; + +struct TimeEvent { + time: Millis, + gear_id: GearId, + event_id: EventId, +} + +impl PartialOrd for TimeEvent { + #[inline] + fn partial_cmp(&self, other: &Self) -> Option { + self.time.partial_cmp(&other.time) + } +} + +impl PartialEq for TimeEvent { + #[inline] + fn eq(&self, other: &Self) -> bool { + self.time.eq(&other.time) + } +} + +impl Ord for TimeEvent { + #[inline] + fn cmp(&self, other: &Self) -> Ordering { + self.time.cmp(&other.time) + } +} + +impl Eq for TimeEvent {} + +pub struct OccurredEvents { + events: Vec<(GearId, EventId)>, +} + +impl OccurredEvents { + fn new() -> Self { + Self { events: vec![] } + } + + fn clear(&mut self) { + self.events.clear() + } +} + +pub struct TimeProcessor { + current_event_id: EventId, + current_time: Millis, + events: BinaryHeap, + timeouts: OccurredEvents, +} + +impl TimeProcessor { + pub fn new() -> Self { + Self { + current_event_id: 0, + current_time: Millis::new(0), + events: BinaryHeap::with_capacity(1024), + timeouts: OccurredEvents::new(), + } + } + + pub fn register(&mut self, gear_id: GearId, timeout: Millis) -> EventId { + let event_id = self.current_event_id; + self.current_event_id = self.current_event_id.wrapping_add(1); + let event = TimeEvent { + time: self.current_time + timeout, + gear_id, + event_id, + }; + self.events.push(event); + event_id + } + + fn retain_events

(&mut self, predicate: P) + where + P: Fn(&TimeEvent) -> bool, + { + let events = self.events.drain().filter(predicate).collect::>(); + self.events.extend(events); + } + + pub fn cancel(&mut self, event_id: EventId) { + //self.events.retain(|event| event.event_id != event_id) + self.retain_events(|event| event.event_id != event_id) + } + + pub fn cancel_all(&mut self, gear_id: GearId) { + //self.events.retain(|event| event.gear_id != gear_id) + self.retain_events(|event| event.gear_id != gear_id) + } + + pub fn process(&mut self, time_step: Millis) -> &OccurredEvents { + self.timeouts.clear(); + self.current_time = self.current_time + time_step; + while self + .events + .peek() + .filter(|e| e.time <= self.current_time) + .is_some() + { + let event = self.events.pop().unwrap(); + self.timeouts.events.push((event.gear_id, event.event_id)) + } + &self.timeouts + } +}