rust/hwphysics/src/lib.rs
author Wuzzy <Wuzzy2@mail.ru>
Tue, 27 Aug 2019 23:16:42 +0200
changeset 15370 5a934f83d5eb
parent 15353 35c331f9308e
child 15380 6e3e5be8b2e2
permissions -rw-r--r--
Tempoary (!!!) workaround for incorrect key combination description in frontend This workaround fixes the incorrect string while preserving translations and the 1.0.0 string freeze. Remember to revert this commit and fix the string in binds.cpp after the 1.0.0 release!
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
     1
pub mod collision;
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
     2
pub mod common;
15305
0076bf602969 start gear data group implementation
alfadur
parents: 15281
diff changeset
     3
mod data;
14178
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14144
diff changeset
     4
mod grid;
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
     5
pub mod physics;
15270
7446258fab98 add time events
alfadur
parents: 15266
diff changeset
     6
pub mod time;
14144
165e43c3ed59 pull land into collision detector
alfadur
parents: 14059
diff changeset
     7
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
     8
use integral_geometry::Size;
14144
165e43c3ed59 pull land into collision detector
alfadur
parents: 14059
diff changeset
     9
use land2d::Land2D;
14059
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    10
14178
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14144
diff changeset
    11
use crate::{
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
    12
    collision::{CollisionData, CollisionProcessor, ContactData},
15275
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    13
    common::{GearAllocator, GearData, GearDataAggregator, GearDataProcessor, GearId, Millis},
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
    14
    physics::{PhysicsData, PhysicsProcessor},
15270
7446258fab98 add time events
alfadur
parents: 15266
diff changeset
    15
    time::TimeProcessor,
14178
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14144
diff changeset
    16
};
14059
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    17
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    18
pub struct JoinedData {
14178
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14144
diff changeset
    19
    gear_id: GearId,
14059
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    20
    physics: PhysicsData,
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    21
    collision: CollisionData,
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
    22
    contact: ContactData,
14059
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    23
}
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    24
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    25
pub struct World {
15274
42b710b0f883 add gear allocator
alfadur
parents: 15270
diff changeset
    26
    allocator: GearAllocator,
14178
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14144
diff changeset
    27
    physics: PhysicsProcessor,
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14144
diff changeset
    28
    collision: CollisionProcessor,
15270
7446258fab98 add time events
alfadur
parents: 15266
diff changeset
    29
    time: TimeProcessor,
14059
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    30
}
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    31
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    32
macro_rules! processor_map {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    33
    ( $data_type: ident => $field: ident ) => {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    34
        impl GearDataAggregator<$data_type> for World {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    35
            fn find_processor(&mut self) -> &mut GearDataProcessor<$data_type> {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    36
                &mut self.$field
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    37
            }
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    38
        }
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
    39
    };
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    40
}
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    41
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    42
processor_map!(PhysicsData => physics);
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    43
processor_map!(CollisionData => collision);
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    44
14059
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    45
impl World {
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    46
    pub fn new(world_size: Size) -> Self {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    47
        Self {
15274
42b710b0f883 add gear allocator
alfadur
parents: 15270
diff changeset
    48
            allocator: GearAllocator::new(),
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    49
            physics: PhysicsProcessor::new(),
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
    50
            collision: CollisionProcessor::new(world_size),
15270
7446258fab98 add time events
alfadur
parents: 15266
diff changeset
    51
            time: TimeProcessor::new(),
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    52
        }
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    53
    }
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    54
15274
42b710b0f883 add gear allocator
alfadur
parents: 15270
diff changeset
    55
    #[inline]
42b710b0f883 add gear allocator
alfadur
parents: 15270
diff changeset
    56
    pub fn new_gear(&mut self) -> Option<GearId> {
42b710b0f883 add gear allocator
alfadur
parents: 15270
diff changeset
    57
        self.allocator.alloc()
42b710b0f883 add gear allocator
alfadur
parents: 15270
diff changeset
    58
    }
42b710b0f883 add gear allocator
alfadur
parents: 15270
diff changeset
    59
42b710b0f883 add gear allocator
alfadur
parents: 15270
diff changeset
    60
    #[inline]
42b710b0f883 add gear allocator
alfadur
parents: 15270
diff changeset
    61
    pub fn delete_gear(&mut self, gear_id: GearId) {
42b710b0f883 add gear allocator
alfadur
parents: 15270
diff changeset
    62
        self.physics.remove(gear_id);
42b710b0f883 add gear allocator
alfadur
parents: 15270
diff changeset
    63
        self.collision.remove(gear_id);
42b710b0f883 add gear allocator
alfadur
parents: 15270
diff changeset
    64
        self.time.cancel(gear_id);
42b710b0f883 add gear allocator
alfadur
parents: 15270
diff changeset
    65
        self.allocator.free(gear_id)
42b710b0f883 add gear allocator
alfadur
parents: 15270
diff changeset
    66
    }
42b710b0f883 add gear allocator
alfadur
parents: 15270
diff changeset
    67
15275
66c987015f2d replace time with milliseconds
alfadur
parents: 15274
diff changeset
    68
    pub fn step(&mut self, time_step: Millis, land: &Land2D<u32>) {
14178
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14144
diff changeset
    69
        let updates = self.physics.process(time_step);
15266
b58f98bbc120 clear intermediate result structures between iterations
alfadur
parents: 14716
diff changeset
    70
        let collision = self.collision.process(land, &updates);
15270
7446258fab98 add time events
alfadur
parents: 15266
diff changeset
    71
        let events = self.time.process(time_step);
14144
165e43c3ed59 pull land into collision detector
alfadur
parents: 14059
diff changeset
    72
    }
165e43c3ed59 pull land into collision detector
alfadur
parents: 14059
diff changeset
    73
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    74
    pub fn add_gear_data<T>(&mut self, gear_id: GearId, data: T)
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
    75
    where
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
    76
        T: GearData,
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
    77
        Self: GearDataAggregator<T>,
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    78
    {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    79
        self.find_processor().add(gear_id, data);
14059
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    80
    }
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    81
}
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    82
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    83
#[cfg(test)]
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    84
mod tests {
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    85
    use crate::{
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
    86
        collision::{CircleBounds, CollisionData},
15353
35c331f9308e fix world test
alfadur
parents: 15305
diff changeset
    87
        common::Millis,
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    88
        physics::PhysicsData,
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
    89
        World,
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    90
    };
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
    91
    use fpnum::{fp, FPNum, FPPoint};
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    92
    use integral_geometry::Size;
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    93
    use land2d::Land2D;
14059
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    94
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    95
    #[test]
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    96
    fn data_flow() {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    97
        let world_size = Size::new(2048, 2048);
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    98
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
    99
        let mut world = World::new(world_size);
15353
35c331f9308e fix world test
alfadur
parents: 15305
diff changeset
   100
        let gear_id = std::num::NonZeroU16::new(46631).unwrap();
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
   101
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
   102
        world.add_gear_data(
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
   103
            gear_id,
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
   104
            PhysicsData {
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
   105
                position: FPPoint::zero(),
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
   106
                velocity: FPPoint::unit_y(),
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
   107
            },
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
   108
        );
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
   109
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
   110
        world.add_gear_data(
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
   111
            gear_id,
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
   112
            CollisionData {
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
   113
                bounds: CircleBounds {
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
   114
                    center: FPPoint::zero(),
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
   115
                    radius: fp!(10),
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
   116
                },
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
   117
            },
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14179
diff changeset
   118
        );
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
   119
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
   120
        let land = Land2D::new(Size::new(world_size.width - 2, world_size.height - 2), 0);
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
   121
15353
35c331f9308e fix world test
alfadur
parents: 15305
diff changeset
   122
        world.step(Millis::new(1), &land);
14179
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14178
diff changeset
   123
    }
14059
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
   124
}