author | unc0rr |
Tue, 13 Dec 2022 21:21:55 +0100 | |
changeset 15899 | 73cdc306888f |
parent 15829 | d5e6c8c92d87 |
child 15935 | cd3d16905e0e |
permissions | -rw-r--r-- |
14716 | 1 |
pub mod collision; |
2 |
pub mod common; |
|
15305 | 3 |
mod data; |
14178 | 4 |
mod grid; |
14716 | 5 |
pub mod physics; |
14144 | 6 |
|
15828 | 7 |
use integral_geometry::PotSize; |
14144 | 8 |
use land2d::Land2D; |
15829 | 9 |
use std::any::{Any, TypeId}; |
14059
c6745a1c827a
start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff
changeset
|
10 |
|
15829 | 11 |
use crate::collision::CollisionData; |
12 |
use crate::physics::VelocityData; |
|
14178 | 13 |
use crate::{ |
15381 | 14 |
collision::CollisionProcessor, |
15380 | 15 |
common::{GearAllocator, GearId, Millis}, |
15762 | 16 |
data::{DataIterator, GearDataManager, TypeIter}, |
15380 | 17 |
physics::PhysicsProcessor, |
14178 | 18 |
}; |
14059
c6745a1c827a
start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff
changeset
|
19 |
|
c6745a1c827a
start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff
changeset
|
20 |
pub struct World { |
15274 | 21 |
allocator: GearAllocator, |
15380 | 22 |
data: GearDataManager, |
14178 | 23 |
physics: PhysicsProcessor, |
24 |
collision: CollisionProcessor, |
|
14059
c6745a1c827a
start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff
changeset
|
25 |
} |
c6745a1c827a
start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff
changeset
|
26 |
|
c6745a1c827a
start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff
changeset
|
27 |
impl World { |
15828 | 28 |
pub fn new(world_size: PotSize) -> Self { |
15380 | 29 |
let mut data = GearDataManager::new(); |
30 |
PhysicsProcessor::register_components(&mut data); |
|
31 |
CollisionProcessor::register_components(&mut data); |
|
32 |
||
14179 | 33 |
Self { |
15380 | 34 |
data, |
15274 | 35 |
allocator: GearAllocator::new(), |
14179 | 36 |
physics: PhysicsProcessor::new(), |
14716 | 37 |
collision: CollisionProcessor::new(world_size), |
14179 | 38 |
} |
39 |
} |
|
40 |
||
15274 | 41 |
#[inline] |
42 |
pub fn new_gear(&mut self) -> Option<GearId> { |
|
43 |
self.allocator.alloc() |
|
44 |
} |
|
45 |
||
46 |
#[inline] |
|
47 |
pub fn delete_gear(&mut self, gear_id: GearId) { |
|
15380 | 48 |
self.data.remove_all(gear_id); |
15274 | 49 |
self.collision.remove(gear_id); |
50 |
self.allocator.free(gear_id) |
|
51 |
} |
|
52 |
||
15275 | 53 |
pub fn step(&mut self, time_step: Millis, land: &Land2D<u32>) { |
15780 | 54 |
let updates = self.physics.process(&mut self.data, time_step); |
15380 | 55 |
let collisions = self.collision.process(land, &updates); |
14144 | 56 |
} |
57 |
||
15380 | 58 |
pub fn add_gear_data<T: Clone + 'static>(&mut self, gear_id: GearId, data: &T) { |
59 |
self.data.add(gear_id, data); |
|
15829 | 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 |
} |
|
14059
c6745a1c827a
start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff
changeset
|
72 |
} |
15762 | 73 |
|
74 |
#[inline] |
|
75 |
pub fn iter_data<T: TypeIter + 'static>(&mut self) -> DataIterator<T> { |
|
76 |
self.data.iter() |
|
77 |
} |
|
14059
c6745a1c827a
start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff
changeset
|
78 |
} |
c6745a1c827a
start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff
changeset
|
79 |
|
c6745a1c827a
start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff
changeset
|
80 |
#[cfg(test)] |
c6745a1c827a
start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff
changeset
|
81 |
mod tests { |
14179 | 82 |
use crate::{ |
14716 | 83 |
collision::{CircleBounds, CollisionData}, |
15353 | 84 |
common::Millis, |
15380 | 85 |
physics::{PositionData, VelocityData}, |
14716 | 86 |
World, |
14179 | 87 |
}; |
14716 | 88 |
use fpnum::{fp, FPNum, FPPoint}; |
15829 | 89 |
use integral_geometry::{PotSize, Size}; |
14179 | 90 |
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
|
91 |
|
14179 | 92 |
#[test] |
93 |
fn data_flow() { |
|
15829 | 94 |
let world_size = PotSize::new(2048, 2048).unwrap(); |
14179 | 95 |
|
96 |
let mut world = World::new(world_size); |
|
15380 | 97 |
let gear_id = world.new_gear().unwrap(); |
98 |
||
99 |
world.add_gear_data(gear_id, &PositionData(FPPoint::zero())); |
|
100 |
world.add_gear_data(gear_id, &VelocityData(FPPoint::unit_y())); |
|
14179 | 101 |
|
14716 | 102 |
world.add_gear_data( |
103 |
gear_id, |
|
15380 | 104 |
&CollisionData { |
14716 | 105 |
bounds: CircleBounds { |
106 |
center: FPPoint::zero(), |
|
107 |
radius: fp!(10), |
|
108 |
}, |
|
109 |
}, |
|
110 |
); |
|
14179 | 111 |
|
15829 | 112 |
let land = Land2D::new( |
113 |
Size::new(world_size.width() - 2, world_size.height() - 2), |
|
114 |
0, |
|
115 |
); |
|
14179 | 116 |
|
15353 | 117 |
world.step(Millis::new(1), &land); |
14179 | 118 |
} |
14059
c6745a1c827a
start a physics engine to try out this data oriented thing everyone seems to be talking about
alfadur
parents:
diff
changeset
|
119 |
} |