This commit is contained in:
2024-05-29 21:58:23 -04:00
parent 164283e152
commit d25d0de02d

View File

@@ -1,7 +1,7 @@
use bevy::ecs::system::CommandQueue; use bevy::ecs::system::CommandQueue;
use bevy::prelude::*; use bevy::prelude::*;
use bevy::tasks::futures_lite::future;
use bevy::tasks::*; use bevy::tasks::*;
use bevy::utils::futures;
use bevy_rapier3d::geometry::Collider; use bevy_rapier3d::geometry::Collider;
use bevy_rapier3d::geometry::TriMeshFlags; use bevy_rapier3d::geometry::TriMeshFlags;
use world_generation::prelude::Map; use world_generation::prelude::Map;
@@ -19,7 +19,7 @@ impl Plugin for ChunkRebuildPlugin {
app.insert_resource(ChunkRebuildQueue::default()); app.insert_resource(ChunkRebuildQueue::default());
app.init_resource::<PhosChunkRegistry>(); app.init_resource::<PhosChunkRegistry>();
app.add_systems(PreUpdate, chunk_rebuilder); 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_index = idx.index;
let chunk_data = heightmap.get_chunk_mesh_data(chunk_index); let chunk_data = heightmap.get_chunk_mesh_data(chunk_index);
let chunk_offset = heightmap.chunks[chunk_index].chunk_offset; let chunk_offset = heightmap.chunks[chunk_index].chunk_offset;
let task = pool.spawn(async move { let task = pool.spawn(async move {
#[cfg(feature = "tracing")] #[cfg(feature = "tracing")]
let _spawn_span = info_span!("Rebuild Task").entered(); let _spawn_span = info_span!("Rebuild Task").entered();
let mut queue = CommandQueue::default(); let mut queue = CommandQueue::default();
let (mesh, collider_data, _, _) = prepare_chunk_mesh(&chunk_data, chunk_offset, chunk_index); 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( let c = Collider::trimesh_with_flags(
collider_data.0, collider_data.0,
collider_data.1, collider_data.1,
TriMeshFlags::DELETE_DUPLICATE_TRIANGLES, TriMeshFlags::DELETE_DUPLICATE_TRIANGLES,
); );
#[cfg(feature = "tracing")]
drop(trimesh_span);
queue.push(move |world: &mut World| { queue.push(move |world: &mut World| {
world.entity_mut(chunk_entity).insert(c).remove::<ChunkRebuildTask>(); world.entity_mut(chunk_entity).insert(c).remove::<ChunkRebuildTask>();
}); });
return (queue, mesh); return (queue, mesh);
}); });
commands commands
.entity(chunk_entity) .entity(chunk_entity)
.insert(ChunkRebuildTask { task }) .insert(ChunkRebuildTask { task })
@@ -71,7 +77,7 @@ fn collider_task_resolver(
mut meshes: ResMut<Assets<Mesh>>, mut meshes: ResMut<Assets<Mesh>>,
) { ) {
for (mut task, mesh_handle) in &mut chunks { 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); commands.append(&mut c);
meshes.insert(mesh_handle, mesh); meshes.insert(mesh_handle, mesh);
} }