diff --git a/game/main/src/map_rendering/chunk_rebuild.rs b/game/main/src/map_rendering/chunk_rebuild.rs index 65adbce..ef1c7e6 100644 --- a/game/main/src/map_rendering/chunk_rebuild.rs +++ b/game/main/src/map_rendering/chunk_rebuild.rs @@ -1,7 +1,7 @@ use bevy::ecs::system::CommandQueue; use bevy::prelude::*; -use bevy::tasks::futures_lite::future; use bevy::tasks::*; +use bevy::utils::futures; use bevy_rapier3d::geometry::Collider; use bevy_rapier3d::geometry::TriMeshFlags; use world_generation::prelude::Map; @@ -19,7 +19,7 @@ impl Plugin for ChunkRebuildPlugin { app.insert_resource(ChunkRebuildQueue::default()); app.init_resource::(); app.add_systems(PreUpdate, chunk_rebuilder); - app.add_systems(PreUpdate, collider_task_resolver); + app.add_systems(PostUpdate, collider_task_resolver); } } @@ -42,22 +42,28 @@ fn chunk_rebuilder( let chunk_index = idx.index; let chunk_data = heightmap.get_chunk_mesh_data(chunk_index); let chunk_offset = heightmap.chunks[chunk_index].chunk_offset; + let task = pool.spawn(async move { #[cfg(feature = "tracing")] let _spawn_span = info_span!("Rebuild Task").entered(); let mut queue = CommandQueue::default(); let (mesh, collider_data, _, _) = prepare_chunk_mesh(&chunk_data, chunk_offset, chunk_index); + #[cfg(feature = "tracing")] + let trimesh_span = info_span!("Chunk Trimesh").entered(); let c = Collider::trimesh_with_flags( collider_data.0, collider_data.1, TriMeshFlags::DELETE_DUPLICATE_TRIANGLES, ); + #[cfg(feature = "tracing")] + drop(trimesh_span); queue.push(move |world: &mut World| { world.entity_mut(chunk_entity).insert(c).remove::(); }); return (queue, mesh); }); + commands .entity(chunk_entity) .insert(ChunkRebuildTask { task }) @@ -71,7 +77,7 @@ fn collider_task_resolver( mut meshes: ResMut>, ) { for (mut task, mesh_handle) in &mut chunks { - if let Some((mut c, mesh)) = block_on(future::poll_once(&mut task.task)) { + if let Some((mut c, mesh)) = futures::check_ready(&mut task.task) { commands.append(&mut c); meshes.insert(mesh_handle, mesh); }