fixed background collider generation
This commit is contained in:
@@ -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>,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.;
|
||||||
|
|||||||
Reference in New Issue
Block a user