rust/hwphysics/src/common.rs
author alfadur
Thu, 29 Aug 2019 00:20:41 +0300
changeset 15388 701ad89a9f2a
parent 15386 52844baced17
permissions -rw-r--r--
avoid time multiplication when not skipping ticks
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15287
478d5372eb4a implement empty gear lookup entries
alfadur
parents: 15286
diff changeset
     1
use fpnum::FPNum;
15386
52844baced17 add gravity
alfadur
parents: 15385
diff changeset
     2
use std::{collections::BinaryHeap, num::NonZeroU16, ops::Add};
15279
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
     3
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
     4
pub type GearId = NonZeroU16;
15125
febccab419b1 Apply dos2unix to rust sources
unc0rr
parents: 14184
diff changeset
     5
15280
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
     6
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug)]
15286
8095853811a6 add gear lookup to the physics processor
alfadur
parents: 15280
diff changeset
     7
#[repr(transparent)]
15280
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
     8
pub struct Millis(u32);
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
     9
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    10
impl Millis {
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    11
    #[inline]
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    12
    pub fn new(value: u32) -> Self {
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    13
        Self(value)
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    14
    }
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    15
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    16
    #[inline]
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    17
    pub fn get(self) -> u32 {
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    18
        self.0
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    19
    }
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    20
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    21
    #[inline]
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    22
    pub fn to_fixed(self) -> FPNum {
15388
701ad89a9f2a avoid time multiplication when not skipping ticks
alfadur
parents: 15386
diff changeset
    23
        FPNum::new(self.0 as i32, 1)
15280
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    24
    }
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    25
}
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    26
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    27
impl Add for Millis {
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    28
    type Output = Self;
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    29
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    30
    fn add(self, rhs: Self) -> Self::Output {
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    31
        Self(self.0 + rhs.0)
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    32
    }
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    33
}
66c987015f2d replace time with milliseconds
alfadur
parents: 15279
diff changeset
    34
15279
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    35
pub struct GearAllocator {
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    36
    max_id: u16,
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    37
    free_ids: BinaryHeap<GearId>,
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    38
}
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    39
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    40
impl GearAllocator {
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    41
    pub fn new() -> Self {
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    42
        Self {
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    43
            max_id: 0,
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    44
            free_ids: BinaryHeap::with_capacity(1024),
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    45
        }
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    46
    }
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    47
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    48
    pub fn alloc(&mut self) -> Option<GearId> {
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    49
        self.free_ids.pop().or_else(|| {
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    50
            self.max_id.checked_add(1).and_then(|new_max_id| {
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    51
                self.max_id = new_max_id;
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    52
                NonZeroU16::new(new_max_id)
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    53
            })
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    54
        })
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    55
    }
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    56
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    57
    pub fn free(&mut self, gear_id: GearId) {
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    58
        self.free_ids.push(gear_id)
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    59
    }
42b710b0f883 add gear allocator
alfadur
parents: 15268
diff changeset
    60
}