rust/hwphysics/src/lib.rs
changeset 15829 d5e6c8c92d87
parent 15828 44b49f255e31
child 15935 cd3d16905e0e
equal deleted inserted replaced
15828:44b49f255e31 15829:d5e6c8c92d87
     4 mod grid;
     4 mod grid;
     5 pub mod physics;
     5 pub mod physics;
     6 
     6 
     7 use integral_geometry::PotSize;
     7 use integral_geometry::PotSize;
     8 use land2d::Land2D;
     8 use land2d::Land2D;
       
     9 use std::any::{Any, TypeId};
     9 
    10 
       
    11 use crate::collision::CollisionData;
       
    12 use crate::physics::VelocityData;
    10 use crate::{
    13 use crate::{
    11     collision::CollisionProcessor,
    14     collision::CollisionProcessor,
    12     common::{GearAllocator, GearId, Millis},
    15     common::{GearAllocator, GearId, Millis},
    13     data::{DataIterator, GearDataManager, TypeIter},
    16     data::{DataIterator, GearDataManager, TypeIter},
    14     physics::PhysicsProcessor,
    17     physics::PhysicsProcessor,
    50     pub fn step(&mut self, time_step: Millis, land: &Land2D<u32>) {
    53     pub fn step(&mut self, time_step: Millis, land: &Land2D<u32>) {
    51         let updates = self.physics.process(&mut self.data, time_step);
    54         let updates = self.physics.process(&mut self.data, time_step);
    52         let collisions = self.collision.process(land, &updates);
    55         let collisions = self.collision.process(land, &updates);
    53     }
    56     }
    54 
    57 
    55     #[inline]
       
    56     pub fn add_gear_data<T: Clone + 'static>(&mut self, gear_id: GearId, data: &T) {
    58     pub fn add_gear_data<T: Clone + 'static>(&mut self, gear_id: GearId, data: &T) {
    57         self.data.add(gear_id, data);
    59         self.data.add(gear_id, data);
       
    60         if TypeId::of::<T>() == TypeId::of::<VelocityData>() {
       
    61             self.collision.remove(gear_id);
       
    62         }
       
    63     }
       
    64 
       
    65     pub fn remove_gear_data<T: Clone + 'static>(&mut self, gear_id: GearId) {
       
    66         self.data.remove::<T>(gear_id);
       
    67         if TypeId::of::<T>() == TypeId::of::<VelocityData>() {
       
    68             if let Some(collision_data) = self.data.get::<CollisionData>(gear_id) {
       
    69                 self.collision.add(gear_id, *collision_data);
       
    70             }
       
    71         }
    58     }
    72     }
    59 
    73 
    60     #[inline]
    74     #[inline]
    61     pub fn iter_data<T: TypeIter + 'static>(&mut self) -> DataIterator<T> {
    75     pub fn iter_data<T: TypeIter + 'static>(&mut self) -> DataIterator<T> {
    62         self.data.iter()
    76         self.data.iter()
    70         common::Millis,
    84         common::Millis,
    71         physics::{PositionData, VelocityData},
    85         physics::{PositionData, VelocityData},
    72         World,
    86         World,
    73     };
    87     };
    74     use fpnum::{fp, FPNum, FPPoint};
    88     use fpnum::{fp, FPNum, FPPoint};
    75     use integral_geometry::PotSize;
    89     use integral_geometry::{PotSize, Size};
    76     use land2d::Land2D;
    90     use land2d::Land2D;
    77 
    91 
    78     #[test]
    92     #[test]
    79     fn data_flow() {
    93     fn data_flow() {
    80         let world_size = PotSize::new(2048, 2048).unwrap;
    94         let world_size = PotSize::new(2048, 2048).unwrap();
    81 
    95 
    82         let mut world = World::new(world_size);
    96         let mut world = World::new(world_size);
    83         let gear_id = world.new_gear().unwrap();
    97         let gear_id = world.new_gear().unwrap();
    84 
    98 
    85         world.add_gear_data(gear_id, &PositionData(FPPoint::zero()));
    99         world.add_gear_data(gear_id, &PositionData(FPPoint::zero()));
    93                     radius: fp!(10),
   107                     radius: fp!(10),
    94                 },
   108                 },
    95             },
   109             },
    96         );
   110         );
    97 
   111 
    98         let land = Land2D::new(Size::new(world_size.width - 2, world_size.height - 2), 0);
   112         let land = Land2D::new(
       
   113             Size::new(world_size.width() - 2, world_size.height() - 2),
       
   114             0,
       
   115         );
    99 
   116 
   100         world.step(Millis::new(1), &land);
   117         world.step(Millis::new(1), &land);
   101     }
   118     }
   102 }
   119 }