rust/hwphysics/src/physics.rs
author alfadur
Wed, 24 Mar 2021 00:11:49 +0300
changeset 15780 f4b563a9ac5e
parent 15393 0ef770a40e75
child 15828 44b49f255e31
permissions -rw-r--r--
add const generics to physics step
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15380
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
     1
use crate::{
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
     2
    common::{GearId, Millis},
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
     3
    data::GearDataManager,
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
     4
};
15120
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
     5
use fpnum::*;
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
     6
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
     7
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
15380
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
     8
#[repr(transparent)]
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
     9
pub struct PositionData(pub FPPoint);
15120
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    10
15380
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
    11
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
    12
#[repr(transparent)]
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
    13
pub struct VelocityData(pub FPPoint);
15120
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    14
15393
0ef770a40e75 add wind to physics processor
alfadur
parents: 15392
diff changeset
    15
pub struct AffectedByWind;
0ef770a40e75 add wind to physics processor
alfadur
parents: 15392
diff changeset
    16
15120
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    17
pub struct PositionUpdates {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    18
    pub gear_ids: Vec<GearId>,
15260
775d7efa4e5c save full shifts to position updates
alfadur
parents: 15120
diff changeset
    19
    pub shifts: Vec<(FPPoint, FPPoint)>,
15120
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    20
}
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    21
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    22
impl PositionUpdates {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    23
    pub fn new(capacity: usize) -> Self {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    24
        Self {
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    25
            gear_ids: Vec::with_capacity(capacity),
15260
775d7efa4e5c save full shifts to position updates
alfadur
parents: 15120
diff changeset
    26
            shifts: Vec::with_capacity(capacity),
15120
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    27
        }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    28
    }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    29
15260
775d7efa4e5c save full shifts to position updates
alfadur
parents: 15120
diff changeset
    30
    pub fn push(&mut self, gear_id: GearId, old_position: &FPPoint, new_position: &FPPoint) {
15120
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    31
        self.gear_ids.push(gear_id);
15260
775d7efa4e5c save full shifts to position updates
alfadur
parents: 15120
diff changeset
    32
        self.shifts.push((*old_position, *new_position));
15120
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    33
    }
15261
501dfa1c8deb update collision grid with position changes
alfadur
parents: 15260
diff changeset
    34
501dfa1c8deb update collision grid with position changes
alfadur
parents: 15260
diff changeset
    35
    pub fn iter(&self) -> impl Iterator<Item = (GearId, &FPPoint, &FPPoint)> {
501dfa1c8deb update collision grid with position changes
alfadur
parents: 15260
diff changeset
    36
        self.gear_ids
501dfa1c8deb update collision grid with position changes
alfadur
parents: 15260
diff changeset
    37
            .iter()
501dfa1c8deb update collision grid with position changes
alfadur
parents: 15260
diff changeset
    38
            .cloned()
501dfa1c8deb update collision grid with position changes
alfadur
parents: 15260
diff changeset
    39
            .zip(self.shifts.iter())
501dfa1c8deb update collision grid with position changes
alfadur
parents: 15260
diff changeset
    40
            .map(|(id, (from, to))| (id, from, to))
501dfa1c8deb update collision grid with position changes
alfadur
parents: 15260
diff changeset
    41
    }
15266
b58f98bbc120 clear intermediate result structures between iterations
alfadur
parents: 15261
diff changeset
    42
b58f98bbc120 clear intermediate result structures between iterations
alfadur
parents: 15261
diff changeset
    43
    pub fn clear(&mut self) {
b58f98bbc120 clear intermediate result structures between iterations
alfadur
parents: 15261
diff changeset
    44
        self.gear_ids.clear();
b58f98bbc120 clear intermediate result structures between iterations
alfadur
parents: 15261
diff changeset
    45
        self.shifts.clear();
b58f98bbc120 clear intermediate result structures between iterations
alfadur
parents: 15261
diff changeset
    46
    }
15120
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    47
}
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    48
15381
52844baced17 add gravity
alfadur
parents: 15380
diff changeset
    49
pub struct PhysicsProcessor {
52844baced17 add gravity
alfadur
parents: 15380
diff changeset
    50
    gravity: FPNum,
15393
0ef770a40e75 add wind to physics processor
alfadur
parents: 15392
diff changeset
    51
    wind: FPNum,
15381
52844baced17 add gravity
alfadur
parents: 15380
diff changeset
    52
    position_updates: PositionUpdates,
52844baced17 add gravity
alfadur
parents: 15380
diff changeset
    53
}
52844baced17 add gravity
alfadur
parents: 15380
diff changeset
    54
15120
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    55
impl PhysicsProcessor {
15380
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
    56
    pub fn register_components(data: &mut GearDataManager) {
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
    57
        data.register::<PositionData>();
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
    58
        data.register::<VelocityData>();
15393
0ef770a40e75 add wind to physics processor
alfadur
parents: 15392
diff changeset
    59
        data.register::<AffectedByWind>();
15380
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
    60
    }
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
    61
15120
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    62
    pub fn new() -> Self {
15270
7446258fab98 add time events
alfadur
parents: 15266
diff changeset
    63
        Self {
15383
701ad89a9f2a avoid time multiplication when not skipping ticks
alfadur
parents: 15382
diff changeset
    64
            gravity: fp!(1 / 10),
15393
0ef770a40e75 add wind to physics processor
alfadur
parents: 15392
diff changeset
    65
            wind: fp!(0),
15380
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
    66
            position_updates: PositionUpdates::new(64),
15120
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    67
        }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    68
    }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
    69
15780
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    70
    pub fn process(
15383
701ad89a9f2a avoid time multiplication when not skipping ticks
alfadur
parents: 15382
diff changeset
    71
        &mut self,
701ad89a9f2a avoid time multiplication when not skipping ticks
alfadur
parents: 15382
diff changeset
    72
        data: &mut GearDataManager,
701ad89a9f2a avoid time multiplication when not skipping ticks
alfadur
parents: 15382
diff changeset
    73
        time_step: Millis,
701ad89a9f2a avoid time multiplication when not skipping ticks
alfadur
parents: 15382
diff changeset
    74
    ) -> &PositionUpdates {
15780
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    75
        if time_step == Millis::new(1) {
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    76
            self.process_impl::<true>(data, time_step)
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    77
        } else {
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    78
            self.process_impl::<false>(data, time_step)
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    79
        }
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    80
    }
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    81
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    82
    fn process_impl<const SINGLE_TICK: bool>(
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    83
        &mut self,
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    84
        data: &mut GearDataManager,
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    85
        time_step: Millis,
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    86
    ) -> &PositionUpdates {
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    87
        let fp_step = if SINGLE_TICK {
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    88
            fp!(1)
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    89
        } else {
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    90
            time_step.to_fixed()
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
    91
        };
15393
0ef770a40e75 add wind to physics processor
alfadur
parents: 15392
diff changeset
    92
        let gravity = FPPoint::unit_y() * (self.gravity * fp_step);
0ef770a40e75 add wind to physics processor
alfadur
parents: 15392
diff changeset
    93
        let wind = FPPoint::unit_x() * (self.wind * fp_step);
0ef770a40e75 add wind to physics processor
alfadur
parents: 15392
diff changeset
    94
15266
b58f98bbc120 clear intermediate result structures between iterations
alfadur
parents: 15261
diff changeset
    95
        self.position_updates.clear();
15380
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
    96
15393
0ef770a40e75 add wind to physics processor
alfadur
parents: 15392
diff changeset
    97
        data.iter()
0ef770a40e75 add wind to physics processor
alfadur
parents: 15392
diff changeset
    98
            .with_tags::<&AffectedByWind>()
0ef770a40e75 add wind to physics processor
alfadur
parents: 15392
diff changeset
    99
            .run(|(vel,): (&mut VelocityData,)| {
0ef770a40e75 add wind to physics processor
alfadur
parents: 15392
diff changeset
   100
                vel.0 += wind;
0ef770a40e75 add wind to physics processor
alfadur
parents: 15392
diff changeset
   101
            });
0ef770a40e75 add wind to physics processor
alfadur
parents: 15392
diff changeset
   102
15392
b387a51705ac implement iteration with tags
alfadur
parents: 15383
diff changeset
   103
        data.iter().run_id(
15380
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
   104
            |gear_id, (pos, vel): (&mut PositionData, &mut VelocityData)| {
15382
6ad92b6ac43c remove velocity check
alfadur
parents: 15381
diff changeset
   105
                let old_pos = pos.0;
15393
0ef770a40e75 add wind to physics processor
alfadur
parents: 15392
diff changeset
   106
                vel.0 += gravity;
15780
f4b563a9ac5e add const generics to physics step
alfadur
parents: 15393
diff changeset
   107
                pos.0 += if SINGLE_TICK { vel.0 } else { vel.0 * fp_step };
15382
6ad92b6ac43c remove velocity check
alfadur
parents: 15381
diff changeset
   108
                self.position_updates.push(gear_id, &old_pos, &pos.0)
15380
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
   109
            },
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
   110
        );
6e3e5be8b2e2 update hwphysics motion to use the new system
alfadur
parents: 15282
diff changeset
   111
15120
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
   112
        &self.position_updates
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
   113
    }
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14716
diff changeset
   114
}