1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
use glam::IVec2;
use crate::sim::{cell::materials::MaterialId, sim_manager::SimManager};
pub fn write_entity_to_world(
sim: &mut SimManager,
entity_id: u32,
// make sure these cells will be simulated
seqno: u64,
// (entity_x, entity_y, cell_x, cell_y)
) -> Vec<(u8, u8, i32, i32)> {
let mut cells_written: Vec<(u8, u8, i32, i32)> = Vec::new();
if let Some(entity) = sim.entities.get(&entity_id)
&& let Some(cells) = &entity.cells
&& let Some((pos, (cos, sin))) = entity.transform(sim)
{
let (half_size_x, half_size_y) = (cells.size.x as f32 / 2.0, cells.size.y as f32 / 2.0);
// half-extent of the rotated grid's axis-aligned bounding box, plus a cell of margin
let (radius_x, radius_y) = (
half_size_x * (cos.abs() + sin.abs()) + 1.0,
half_size_y * (cos.abs() + sin.abs()) + 1.0,
);
let world_xl = (pos.x - radius_x).floor() as i32;
let world_xu = (pos.x + radius_x).ceil() as i32;
let world_yl = (pos.y - radius_y).floor() as i32;
let world_yu = (pos.y + radius_y).ceil() as i32;
for world_x in world_xl..=world_xu {
for world_y in world_yl..=world_yu {
if let Some(cur_world_cell) = sim
.cell_manager
.get_cell_from_game_position(world_x, world_y)
&& cur_world_cell.material == MaterialId::Void
{
// same as shader
let d = (world_x as f32 + 0.5 - pos.x, world_y as f32 + 0.5 - pos.y);
let q = (d.0.floor() + 0.5, d.1.floor() + 0.5);
let (lx, ly) = (
(q.0 * cos + q.1 * sin + half_size_x).floor() as i32,
(-q.0 * sin + q.1 * cos + half_size_y).floor() as i32,
);
if lx < 0 || ly < 0 || lx >= cells.size.x || ly >= cells.size.y {
continue;
}
let mut cell = cells.get_cell_at_local_position(IVec2::new(lx, ly));
if cell.material == MaterialId::Void {
continue;
}
cell.match_parity(seqno);
// TODO: OPTIMIZE!!
sim.cell_manager
.set_cell_from_game_position(world_x, world_y, cell, false);
cells_written.push((lx as u8, ly as u8, world_x, world_y));
}
}
}
}
cells_written
}
|