diff --git a/src/chunk_manager.rs b/src/chunk_manager.rs index 503767c..5469eab 100644 --- a/src/chunk_manager.rs +++ b/src/chunk_manager.rs @@ -1,6 +1,9 @@ +use std::task::Poll; + use bevy::render::render_asset::{RenderAssetDependency, RenderAssets}; use bevy::render::render_resource::{Extent3d, ImageCopyTexture, ImageDataLayout, Origin3d}; use bevy::render::renderer::RenderQueue; +use bevy::render::texture::GpuImage; use bevy::render::{Extract, RenderApp, RenderSet}; use bevy::sprite::Anchor; use itertools::Itertools; @@ -204,15 +207,11 @@ pub fn manager_setup( commands .spawn(( Name::new("Chunks"), - VisibilityBundle::default(), - TransformBundle::from_transform(Transform::from_translation(vec3( - 0., - 0., - AUTOMATA_LAYER, - ))), + Visibility::Visible, + Transform::from_translation(vec3(0., 0., AUTOMATA_LAYER)), ChunksParent, )) - .push_children(&images_vec); + .insert_children(0, &images_vec); } pub fn add_colliders( @@ -224,7 +223,7 @@ pub fn add_colliders( ) { puffin::profile_function!(); - let Some(materials) = materials.0.get(materials.1 .0.clone()) else { + let Some(materials) = materials.0.get(&materials.1 .0) else { return; }; @@ -350,7 +349,7 @@ pub fn chunk_manager_update( } = &mut *dirty_rects_resource; //Get materials - let materials = &materials.0.get(materials.1 .0.clone()).unwrap(); + let materials = &materials.0.get(&materials.1 .0).unwrap(); let manager_pos = ivec2(chunk_manager.pos.x, chunk_manager.pos.y); @@ -524,17 +523,16 @@ pub fn add_chunk( //Spawn Image let entity = commands .spawn(( - SpriteBundle { - texture: texture_copy, - sprite: Sprite { - anchor: Anchor::TopLeft, - ..Default::default() - }, - transform: Transform::from_xyz(pos.x, pos.y, 0.), + Sprite { + image: texture_copy, + + anchor: Anchor::TopLeft, + ..Default::default() }, ChunkComponent(index), )) + .insert(Transform::from_xyz(pos.x, pos.y, 0.)) .id(); chunk.entity = Some(entity); @@ -569,59 +567,62 @@ pub fn update_manager_pos( let diff_y = player_pos.y - chunk_manager.pos.y - LOAD_HEIGHT / 2; let new_diff = ivec2(diff_x, diff_y); - match task_executor.poll() { - AsyncTaskStatus::Idle => { - if let Some(task) = &saving_task.0 { - if task.is_finished() { - saving_task.0 = None; - } else { - return; - } + if task_executor.is_idle() { + if let Some(task) = &saving_task.0 { + if task.is_finished() { + saving_task.0 = None; + } else { + return; } + } - if new_diff != IVec2::ZERO { - task_executor.start(async move { - let file = File::open("assets/world/world").unwrap(); - let mut buffered = BufReader::new(file); + if new_diff != IVec2::ZERO { + task_executor.start(async move { + let file = File::open("assets/world/world").unwrap(); + let mut buffered = BufReader::new(file); - let chunks: HashMap = - bincode::deserialize_from(&mut buffered).unwrap(); - (chunks, new_diff) - }); - } + let chunks: HashMap = + bincode::deserialize_from(&mut buffered).unwrap(); + (chunks, new_diff) + }); } - AsyncTaskStatus::Finished((mut file_chunks, diff)) => { - let chunk_textures = chunk_textures.single(); - for _ in 0..diff.x.abs() { - chunk_manager.move_manager( - &mut commands, - &mut images, - &chunk_textures, - &image_entities, - &mut file_chunks, - MoveDir::X(diff.x.signum()), - ); - } + } - for _ in 0..diff.y.abs() { - chunk_manager.move_manager( - &mut commands, - &mut images, - &chunk_textures, - &image_entities, - &mut file_chunks, - MoveDir::Y(diff.y.signum()), - ); - } + match task_executor.poll() { + Poll::Ready(v) => { + if let Ok((mut file_chunks, diff)) = v { + let chunk_textures = chunk_textures.single(); + for _ in 0..diff.x.abs() { + chunk_manager.move_manager( + &mut commands, + &mut images, + &chunk_textures, + &image_entities, + &mut file_chunks, + MoveDir::X(diff.x.signum()), + ); + } - let pool = AsyncComputeTaskPool::get(); - saving_task.0 = Some(pool.spawn(async move { - let file = File::create("assets/world/world").unwrap(); - let mut buffered = BufWriter::new(file); - bincode::serialize_into(&mut buffered, &file_chunks).unwrap(); - })); + for _ in 0..diff.y.abs() { + chunk_manager.move_manager( + &mut commands, + &mut images, + &chunk_textures, + &image_entities, + &mut file_chunks, + MoveDir::Y(diff.y.signum()), + ); + } + + let pool = AsyncComputeTaskPool::get(); + saving_task.0 = Some(pool.spawn(async move { + let file = File::create("assets/world/world").unwrap(); + let mut buffered = BufWriter::new(file); + bincode::serialize_into(&mut buffered, &file_chunks).unwrap(); + })); + } } - AsyncTaskStatus::Pending => {} + Poll::Pending => {} } } @@ -677,7 +678,7 @@ fn extract_chunk_texture_updates( fn prepare_chunk_gpu_textures( queue: Res, - image_render_assets: Res>, + image_render_assets: Res>, mut extracted_updates: ResMut, ) { for update in extracted_updates.drain(..) { diff --git a/src/player.rs b/src/player.rs index 5f6fa60..43904a7 100644 --- a/src/player.rs +++ b/src/player.rs @@ -67,8 +67,7 @@ pub fn player_setup( let player_handle = asset_server.load("player/player_sheet.png"); let animation_indices = AnimationIndices { first: 0, last: 1 }; - let player_atlas_layout = - TextureAtlasLayout::from_grid(UVec2::new(24, 24), 8, 5, None, None); + let player_atlas_layout = TextureAtlasLayout::from_grid(UVec2::new(24, 24), 8, 5, None, None); let atlas = TextureAtlas { index: animation_indices.first, layout: texture_atlases.add(player_atlas_layout),