rust/hwphysics/src/lib.rs
author alfadur
Wed, 28 Aug 2019 01:27:34 +0300
changeset 15372 7a3ed957cee9
parent 15353 35c331f9308e
child 15380 6e3e5be8b2e2
permissions -rw-r--r--
fix block addition
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
}