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())); |