Skip to content

Commit 1fdba68

Browse files
Feature/refactor colliders (#16)
1 parent 5b3aafa commit 1fdba68

File tree

6 files changed

+38
-35
lines changed

6 files changed

+38
-35
lines changed

src/client/collider/components.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::prelude::*;
22

33
#[derive(Component)]
4-
pub struct MyCollider {
5-
pub key: u32,
4+
pub struct BlockCollider {
5+
pub relative_position: Vec3,
66
}

src/client/collider/events.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ use crate::prelude::*;
22

33
#[derive(Event)]
44
pub struct ColliderUpdateEvent {
5-
pub position: [f32; 3],
5+
pub grid_center_position: [f32; 3],
66
}

src/client/collider/systems.rs

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,45 @@
11
use crate::prelude::*;
22

33
static COLLIDER_GRID_SIZE: u32 = 3;
4-
static COLLIDER_RESTING_POSITION: Vec3 = Vec3::new(0.0, 0.0, 0.0);
4+
static COLLIDER_RESTING_POSITION: Vec3 = Vec3::ZERO;
55

66
pub fn setup_coliders_system(mut commands: Commands) {
77
let collider_range = 0..COLLIDER_GRID_SIZE;
88

99
for x in collider_range.clone() {
1010
for y in collider_range.clone() {
1111
for z in collider_range.clone() {
12-
let key = x * COLLIDER_GRID_SIZE * COLLIDER_GRID_SIZE + y * COLLIDER_GRID_SIZE + z;
1312
commands
1413
.spawn(Collider::cuboid(0.5, 0.5, 0.5))
1514
.insert(TransformBundle::from(Transform::from_xyz(
1615
x as f32, y as f32, z as f32,
1716
)))
18-
.insert(collider_components::MyCollider { key });
17+
.insert(collider_components::BlockCollider {
18+
relative_position: Vec3 {
19+
x: x as f32,
20+
y: y as f32,
21+
z: z as f32,
22+
},
23+
});
1924
}
2025
}
2126
}
2227
}
2328

2429
pub fn handle_collider_update_events_system(
2530
mut collider_grid_events: EventReader<collider_events::ColliderUpdateEvent>,
26-
mut query: Query<(&mut Transform, &collider_components::MyCollider)>,
31+
mut query: Query<(&mut Transform, &collider_components::BlockCollider)>,
2732
mut chunk_manager: ResMut<terrain_resources::ChunkManager>,
2833
) {
2934
for event in collider_grid_events.read() {
30-
let event_position =
31-
Vec3::new(event.position[0], event.position[1], event.position[2]).floor();
35+
let event_position = Vec3::new(
36+
event.grid_center_position[0],
37+
event.grid_center_position[1],
38+
event.grid_center_position[2],
39+
)
40+
.floor();
3241
for (mut transform, collider) in query.iter_mut() {
33-
let relative_position = relative_colider_position(collider.key);
42+
let relative_position = collider.relative_position;
3443
let collider_position = (event_position + relative_position).floor();
3544
let block = chunk_manager.get_block(collider_position);
3645

@@ -50,18 +59,6 @@ pub fn handle_collider_update_events_system(
5059
}
5160
}
5261

53-
fn relative_colider_position(key: u32) -> Vec3 {
54-
let x = key / (COLLIDER_GRID_SIZE * COLLIDER_GRID_SIZE);
55-
let y = (key % (COLLIDER_GRID_SIZE * COLLIDER_GRID_SIZE)) / COLLIDER_GRID_SIZE;
56-
let z = key % COLLIDER_GRID_SIZE;
57-
58-
Vec3 {
59-
x: x as f32 - (COLLIDER_GRID_SIZE / 2) as f32,
60-
y: y as f32 - (COLLIDER_GRID_SIZE / 2) as f32,
61-
z: z as f32 - (COLLIDER_GRID_SIZE / 2) as f32,
62-
}
63-
}
64-
6562
#[cfg(test)]
6663
mod tests {
6764
use collider_events::ColliderUpdateEvent;
@@ -80,7 +77,7 @@ mod tests {
8077

8178
app.update();
8279

83-
let mut colliders_query = app.world.query::<&collider_components::MyCollider>();
80+
let mut colliders_query = app.world.query::<&collider_components::BlockCollider>();
8481
let colliders_count = colliders_query.iter(&app.world).count();
8582

8683
assert_eq!(colliders_count, 3 * 3 * 3);
@@ -103,7 +100,13 @@ mod tests {
103100
},
104101
..Default::default()
105102
},
106-
collider_components::MyCollider { key: 0 },
103+
collider_components::BlockCollider {
104+
relative_position: Vec3 {
105+
x: 1.0,
106+
y: 2.0,
107+
z: 3.0,
108+
},
109+
},
107110
));
108111

109112
let block = BlockId::Dirt;
@@ -122,28 +125,28 @@ mod tests {
122125
resource.insert_chunks(chunks);
123126
resource.set_block(
124127
Vec3 {
125-
x: 9.0,
126-
y: 9.0,
127-
z: 9.0,
128+
x: 6.0,
129+
y: 7.0,
130+
z: 8.0,
128131
},
129132
block,
130133
);
131134

132135
app.world.send_event(ColliderUpdateEvent {
133-
position: [10.0, 10.0, 10.0],
136+
grid_center_position: [5.0, 5.0, 5.0],
134137
});
135138

136139
app.update();
137140

138141
let mut collider_query = app
139142
.world
140-
.query::<(&Transform, &collider_components::MyCollider)>();
143+
.query::<(&Transform, &collider_components::BlockCollider)>();
141144
let (collider_transform, _) = collider_query.single(&app.world);
142145
assert_eq!(
143146
Vec3 {
144-
x: 9.5,
145-
y: 9.5,
146-
z: 9.5
147+
x: 6.5,
148+
y: 7.5,
149+
z: 8.5
147150
},
148151
collider_transform.translation
149152
);

src/client/player/systems/controller.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ pub fn handle_controller_movement_system(
6868
let controller_position = transform.translation;
6969
if last_position.0.floor() != controller_position.floor() {
7070
collider_events.send(collider_events::ColliderUpdateEvent {
71-
position: controller_position.into(),
71+
grid_center_position: controller_position.into(),
7272
});
7373
}
7474
last_position.0 = controller_position;

src/client/player/systems/keyboard.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ pub fn handle_keyboard_events_system(
1010
let controller_transform = camera_query.single();
1111
println!("Handling event: {:?}", controller_transform.translation);
1212
collider_events.send(collider_events::ColliderUpdateEvent {
13-
position: controller_transform.translation.into(),
13+
grid_center_position: controller_transform.translation.into(),
1414
});
1515
}
1616
}

src/client/player/systems/terrain.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ pub fn handle_player_collider_events_system(
4343
let player_position = transform.translation.floor();
4444

4545
collider_events.send(collider_events::ColliderUpdateEvent {
46-
position: player_position.into(),
46+
grid_center_position: player_position.into(),
4747
});
4848
}
4949
}

0 commit comments

Comments
 (0)