misc
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user