rust/hwphysics/src/lib.rs
author alfadur
Fri, 09 Nov 2018 03:36:21 +0300
changeset 14200 abbb74b9cb62
parent 14199 a4c17cfaa4c9
child 14737 8e74d4eb89f5
permissions -rw-r--r--
generalize adding data to World
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14199
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
     1
mod common;
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
     2
mod physics;
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
     3
mod grid;
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
     4
mod collision;
14165
165e43c3ed59 pull land into collision detector
alfadur
parents: 14080
diff changeset
     5
14199
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
     6
use fpnum::FPNum;
14200
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
     7
use integral_geometry::Size;
14165
165e43c3ed59 pull land into collision detector
alfadur
parents: 14080
diff changeset
     8
use land2d::Land2D;
14080
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
     9
14199
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
    10
use crate::{
14200
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    11
    common::{
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    12
        GearId,
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    13
        GearData,
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    14
        GearDataAggregator,
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    15
        GearDataProcessor
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    16
    },
14199
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
    17
    physics::{
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
    18
        PhysicsProcessor,
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
    19
        PhysicsData
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
    20
    },
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
    21
    collision::{
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
    22
        CollisionProcessor,
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
    23
        CollisionData,
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
    24
        ContactData
14080
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    25
    }
14199
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
    26
};
14080
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    27
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    28
pub struct JoinedData {
14199
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
    29
    gear_id: GearId,
14080
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    30
    physics: PhysicsData,
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    31
    collision: CollisionData,
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    32
    contact: ContactData
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    33
}
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    34
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    35
pub struct World {
14199
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
    36
    physics: PhysicsProcessor,
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
    37
    collision: CollisionProcessor,
14080
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    38
}
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    39
14200
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    40
macro_rules! processor_map {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    41
    ( $data_type: ident => $field: ident ) => {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    42
        impl GearDataAggregator<$data_type> for World {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    43
            fn find_processor(&mut self) -> &mut GearDataProcessor<$data_type> {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    44
                &mut self.$field
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    45
            }
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    46
        }
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    47
    }
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    48
}
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    49
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    50
processor_map!(PhysicsData => physics);
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    51
processor_map!(CollisionData => collision);
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    52
14080
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    53
impl World {
14200
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    54
    pub fn new(world_size: Size) -> Self {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    55
        Self {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    56
            physics: PhysicsProcessor::new(),
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    57
            collision: CollisionProcessor::new(world_size)
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    58
        }
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    59
    }
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    60
14165
165e43c3ed59 pull land into collision detector
alfadur
parents: 14080
diff changeset
    61
    pub fn step(&mut self, time_step: FPNum, land: &Land2D<u32>) {
14199
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
    62
        let updates = self.physics.process(time_step);
a4c17cfaa4c9 split hwphysics into modules
alfadur
parents: 14165
diff changeset
    63
        self.collision.process(land, &updates);
14165
165e43c3ed59 pull land into collision detector
alfadur
parents: 14080
diff changeset
    64
    }
165e43c3ed59 pull land into collision detector
alfadur
parents: 14080
diff changeset
    65
14200
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    66
    pub fn add_gear_data<T>(&mut self, gear_id: GearId, data: T)
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    67
        where T: GearData,
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    68
              Self: GearDataAggregator<T>
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    69
    {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    70
        self.find_processor().add(gear_id, data);
14080
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    71
    }
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    72
}
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    73
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    74
#[cfg(test)]
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    75
mod tests {
14200
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    76
    use crate::{
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    77
        World,
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    78
        physics::PhysicsData,
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    79
        collision::{CollisionData, CircleBounds}
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    80
    };
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    81
    use fpnum::{FPNum, FPPoint, fp};
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    82
    use integral_geometry::Size;
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    83
    use land2d::Land2D;
14080
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
    84
14200
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    85
    #[test]
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    86
    fn data_flow() {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    87
        let world_size = Size::new(2048, 2048);
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    88
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    89
        let mut world = World::new(world_size);
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    90
        let gear_id = 46631;
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    91
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    92
        world.add_gear_data(gear_id, PhysicsData {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    93
            position: FPPoint::zero(),
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    94
            velocity: FPPoint::unit_y()
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    95
        });
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    96
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    97
        world.add_gear_data(gear_id, CollisionData {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    98
            bounds: CircleBounds {
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
    99
                center: FPPoint::zero(),
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
   100
                radius: fp!(10)
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
   101
            }
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
   102
        });
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
   103
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
   104
        let land = Land2D::new(Size::new(world_size.width - 2, world_size.height - 2), 0);
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
   105
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
   106
        world.step(fp!(1), &land);
abbb74b9cb62 generalize adding data to World
alfadur
parents: 14199
diff changeset
   107
    }
14080
c6745a1c827a start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff changeset
   108
}