fixed background collider generation

This commit is contained in:
2024-05-25 00:30:47 -04:00
parent bafdf016b9
commit 710eb80bf0
2 changed files with 27 additions and 21 deletions

View File

@@ -1,8 +1,9 @@
use std::mem::swap; use std::thread;
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 rayon::iter::{IntoParallelRefIterator, ParallelIterator}; use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
@@ -36,6 +37,7 @@ pub struct ChunkRebuildQueue {
pub queue: Vec<usize>, pub queue: Vec<usize>,
} }
//Todo: Re-use existing entity/collider until new collider is generated
fn chunk_rebuilder( fn chunk_rebuilder(
mut commands: Commands, mut commands: Commands,
mut queue: ResMut<ChunkRebuildQueue>, mut queue: ResMut<ChunkRebuildQueue>,
@@ -77,17 +79,10 @@ fn chunk_rebuilder(
}) })
.collect(); .collect();
let pool = TaskPool::new(); let pool = AsyncComputeTaskPool::get();
for (mesh, collider_data, pos, index) in chunk_meshes { for (mesh, collider_data, pos, index) in chunk_meshes {
let task = pool.spawn(async { let mut chunk = commands.spawn((
Collider::trimesh_with_flags(
collider_data.0,
collider_data.1,
TriMeshFlags::DELETE_DUPLICATE_TRIANGLES,
)
});
let chunk = commands.spawn((
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.add(mesh), mesh: meshes.add(mesh),
material: atlas.chunk_material_handle.clone(), material: atlas.chunk_material_handle.clone(),
@@ -100,25 +95,36 @@ fn chunk_rebuilder(
0., 0.,
(Chunk::SIZE / 2) as f32 * 1.5, (Chunk::SIZE / 2) as f32 * 1.5,
)), )),
ColliderTask { task },
)); ));
let entity = chunk.id();
let task = pool.spawn(async move {
let mut queue = CommandQueue::default();
let c = Collider::trimesh_with_flags(
collider_data.0,
collider_data.1,
TriMeshFlags::DELETE_DUPLICATE_TRIANGLES,
);
queue.push(move |world: &mut World| {
world.entity_mut(entity).insert(c).remove::<ColliderTask>();
});
return queue;
});
chunk.insert(ColliderTask { task });
chunks.chunks[index] = chunk.id(); chunks.chunks[index] = chunk.id();
} }
queue.queue.clear(); queue.queue.clear();
} }
fn collider_task_resolver(mut chunks: Query<(&mut ColliderTask, Entity), With<PhosChunk>>, mut commands: Commands) { fn collider_task_resolver(mut chunks: Query<&mut ColliderTask, With<PhosChunk>>, mut commands: Commands) {
for (mut task, entity) in &mut chunks { for mut task in &mut chunks {
match futures::check_ready(&mut task.task) { if let Some(mut c) = block_on(future::poll_once(&mut task.task)) {
Some(c) => { commands.append(&mut c);
commands.entity(entity).insert(c);
}
None => (),
} }
} }
} }
#[derive(Component)] #[derive(Component)]
struct ColliderTask { struct ColliderTask {
pub task: Task<Collider>, pub task: Task<CommandQueue>,
} }

View File

@@ -24,7 +24,7 @@ fn deform(
time: Res<Time>, time: Res<Time>,
) { ) {
let mut multi = 0.; let mut multi = 0.;
if mouse.just_pressed(MouseButton::Left) { if mouse.pressed(MouseButton::Left) {
multi = 1.; multi = 1.;
} else if mouse.pressed(MouseButton::Right) { } else if mouse.pressed(MouseButton::Right) {
multi = -1.; multi = -1.;