--- a/rust/hwphysics/src/common.rs Thu Aug 29 00:08:03 2019 +0300
+++ b/rust/hwphysics/src/common.rs Thu Aug 29 00:20:41 2019 +0300
@@ -20,7 +20,7 @@
#[inline]
pub fn to_fixed(self) -> FPNum {
- FPNum::new(self.0 as i32, 1000)
+ FPNum::new(self.0 as i32, 1)
}
}
--- a/rust/hwphysics/src/lib.rs Thu Aug 29 00:08:03 2019 +0300
+++ b/rust/hwphysics/src/lib.rs Thu Aug 29 00:20:41 2019 +0300
@@ -53,7 +53,12 @@
}
pub fn step(&mut self, time_step: Millis, land: &Land2D<u32>) {
- let updates = self.physics.process(&mut self.data, time_step);
+ let updates = if time_step == Millis::new(1) {
+ self.physics.process_single_tick(&mut self.data)
+ } else {
+ self.physics
+ .process_multiple_ticks(&mut self.data, time_step)
+ };
let collisions = self.collision.process(land, &updates);
let events = self.time.process(time_step);
}
--- a/rust/hwphysics/src/physics.rs Thu Aug 29 00:08:03 2019 +0300
+++ b/rust/hwphysics/src/physics.rs Thu Aug 29 00:20:41 2019 +0300
@@ -57,12 +57,31 @@
pub fn new() -> Self {
Self {
- gravity: fp!(100),
+ gravity: fp!(1 / 10),
position_updates: PositionUpdates::new(64),
}
}
- pub fn process(&mut self, data: &mut GearDataManager, time_step: Millis) -> &PositionUpdates {
+ pub fn process_single_tick(&mut self, data: &mut GearDataManager) -> &PositionUpdates {
+ self.position_updates.clear();
+
+ data.iter_id(
+ |gear_id, (pos, vel): (&mut PositionData, &mut VelocityData)| {
+ let old_pos = pos.0;
+ vel.0 -= self.gravity;
+ pos.0 += vel.0;
+ self.position_updates.push(gear_id, &old_pos, &pos.0)
+ },
+ );
+
+ &self.position_updates
+ }
+
+ pub fn process_multiple_ticks(
+ &mut self,
+ data: &mut GearDataManager,
+ time_step: Millis,
+ ) -> &PositionUpdates {
let fp_step = time_step.to_fixed();
self.position_updates.clear();