diff --git a/Cargo.lock b/Cargo.lock index b715be9..ae76f9b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -240,8 +240,7 @@ dependencies = [ name = "astratomic" version = "0.0.1" dependencies = [ - "async-channel 2.1.0", - "atomicell", + "async-channel 2.1.1", "bevy", "bevy-inspector-egui", "bevy_dylib", @@ -275,12 +274,12 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d37875bd9915b7d67c2f117ea2c30a0989874d0b2cb694fe25403c85763c0c9e" +checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" dependencies = [ "concurrent-queue", - "event-listener 3.1.0", + "event-listener 4.0.1", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -333,12 +332,6 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "atomicell" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf53d6c43ea3fa42a5d18d6060081bcfddeca7c63faa64e65a59c4372bbe173b" - [[package]] name = "autocfg" version = "1.1.0" @@ -1581,9 +1574,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" dependencies = [ "cfg-if", ] @@ -1776,9 +1769,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "3.1.0" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +checksum = "84f2cdcf274580f2d63697192d744727b3198894b1bf02923643bf59e2c26712" dependencies = [ "concurrent-queue", "parking", @@ -1787,11 +1780,11 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96b852f1345da36d551b9473fa1e2b1eb5c5195585c6c018118bc92a8d91160" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" dependencies = [ - "event-listener 3.1.0", + "event-listener 4.0.1", "pin-project-lite", ] diff --git a/Cargo.toml b/Cargo.toml index 421a3bf..b11212e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,6 @@ bevy = "0.12" bevy-inspector-egui = "0.22" rand = { version = "0.8.5", features = ["small_rng"] } fastrand = "2.0.1" -atomicell = "0.2.0" async-channel = "2.1.0" smallvec = "1.11.2" itertools = "0.12.0" diff --git a/src/actors.rs b/src/actors.rs index 6367931..6ec365f 100644 --- a/src/actors.rs +++ b/src/actors.rs @@ -214,6 +214,6 @@ pub fn move_y(chunk_manager: &mut ChunkManager, actor: &mut Actor, dir: i32) -> pub struct ActorsPlugin; impl Plugin for ActorsPlugin { fn build(&self, app: &mut App) { - app.add_systems(Update, update_actors.after(chunk_manager_update)); + app.add_systems(Update, update_actors.after(update_player)); } } diff --git a/src/chunk_manager.rs b/src/chunk_manager.rs index 5469994..ba903c7 100644 --- a/src/chunk_manager.rs +++ b/src/chunk_manager.rs @@ -280,6 +280,7 @@ pub fn chunk_manager_update( &mut chunk_manager.chunks, &mut mutable_references, (x_toff, y_toff), + dirty_rects, ); //Iterate through the center chunks diff --git a/src/manager_api.rs b/src/manager_api.rs index 6f39d2b..619c42e 100644 --- a/src/manager_api.rs +++ b/src/manager_api.rs @@ -323,56 +323,81 @@ pub fn updown_to_leftright( //Some chunks are not chopped others are chopped up/down, left/right, and also in four corners. //We do this because each center chunk needs half of the adjacent chunks //So it needs up/down/left/right halves, and also four corners -//TODO Remove HashMap iter; Decrease individual atoms iterations to get a &mut Atom; +//TODO Decrease individual atoms iterations to get a &mut Atom; pub fn get_mutable_references<'a>( chunks: &'a mut HashMap, mutable_references: &mut HashMap>, - thread_off: (usize, usize), + (x_toff, y_toff): (usize, usize), + dirty_rects: &HashMap, ) { - chunks.iter_mut().for_each(|(chunk_pos, chunk)| { - let same_x = (chunk_pos.x as usize + thread_off.0) % 2 == 0; - let same_y = (chunk_pos.y as usize + thread_off.1) % 2 == 0; - - match (same_x, same_y) { - (true, true) => { - mutable_references.insert(*chunk_pos, ChunkReference::Center(&mut chunk.atoms)); - } - (true, false) => { - let (up, down) = chunk.atoms.split_at_mut(CHUNK_LEN / 2); - - mutable_references.insert( - *chunk_pos, - ChunkReference::Side([ - Some(up.iter_mut().collect::>().try_into().unwrap()), - Some(down.iter_mut().collect::>().try_into().unwrap()), - ]), - ); - } - (false, true) => { - let (left, right) = split_left_right(&mut chunk.atoms); - - mutable_references - .insert(*chunk_pos, ChunkReference::Side([Some(left), Some(right)])); + chunks + .iter_mut() + .filter(|(chunk_pos, _)| { + let same_x = chunk_pos.x % 2 == x_toff as i32; + let same_y = chunk_pos.y % 2 == y_toff as i32; + let step_as_center = same_x && same_y; + if step_as_center && dirty_rects.contains_key(*chunk_pos) { + return true; + } else if !step_as_center { + let to_check = match (same_x, same_y) { + (false, false) => vec![ivec2(-1, -1), ivec2(-1, 1), ivec2(1, -1), ivec2(1, 1)], + (true, false) => vec![ivec2(0, -1), ivec2(0, 1)], + (false, true) => vec![ivec2(-1, 0), ivec2(1, 0)], + _ => unreachable!(), + }; + for vec in to_check { + if dirty_rects.contains_key(&(**chunk_pos + vec)) { + return true; + } + } } - (false, false) => { - let (up, down) = chunk.atoms.split_at_mut(CHUNK_LEN / 2); - - let (up_left, up_right) = updown_to_leftright(up); - let (down_left, down_right) = updown_to_leftright(down); - - mutable_references.insert( - *chunk_pos, - ChunkReference::Corner([ - Some(up_left), - Some(up_right), - Some(down_left), - Some(down_right), - ]), - ); + false + }) + .for_each(|(chunk_pos, chunk)| { + let same_x = (chunk_pos.x as usize + x_toff) % 2 == 0; + let same_y = (chunk_pos.y as usize + y_toff) % 2 == 0; + + match (same_x, same_y) { + (true, true) => { + mutable_references.insert(*chunk_pos, ChunkReference::Center(&mut chunk.atoms)); + } + (true, false) => { + let (up, down) = chunk.atoms.split_at_mut(CHUNK_LEN / 2); + + mutable_references.insert( + *chunk_pos, + ChunkReference::Side([ + Some(up.iter_mut().collect::>().try_into().unwrap()), + Some(down.iter_mut().collect::>().try_into().unwrap()), + ]), + ); + } + (false, true) => { + let (left, right) = split_left_right(&mut chunk.atoms); + + mutable_references + .insert(*chunk_pos, ChunkReference::Side([Some(left), Some(right)])); + } + + (false, false) => { + let (up, down) = chunk.atoms.split_at_mut(CHUNK_LEN / 2); + + let (up_left, up_right) = updown_to_leftright(up); + let (down_left, down_right) = updown_to_leftright(down); + + mutable_references.insert( + *chunk_pos, + ChunkReference::Corner([ + Some(up_left), + Some(up_right), + Some(down_left), + Some(down_right), + ]), + ); + } } - } - }); + }); } pub fn update_dirty_rects(dirty_rects: &mut HashMap, pos: ChunkPos) { diff --git a/src/player.rs b/src/player.rs index f63a596..c5d10f1 100644 --- a/src/player.rs +++ b/src/player.rs @@ -258,7 +258,7 @@ impl Plugin for PlayerPlugin { app.add_systems( Update, ( - update_player.before(update_actors), + update_player.before(chunk_manager_update), update_player_sprite.after(update_actors), ), )