From bafdf016b9386634b0534f08739c072260e52838 Mon Sep 17 00:00:00 2001 From: Amatsugu Date: Sat, 18 May 2024 22:46:58 -0400 Subject: [PATCH] attempt to generate collider on background thread --- .vscode/launch.json | 12 ++-- engine/world_generation/src/lib.rs | 2 +- game/main/src/camera_system/camera_plugin.rs | 2 - game/main/src/camera_system/components.rs | 5 +- game/main/src/map_rendering/chunk_rebuild.rs | 60 +++++++++++++------ game/main/src/map_rendering/map_init.rs | 31 ++-------- .../src/map_rendering/terraforming_test.rs | 2 +- game/main/src/utlis/chunk_utils.rs | 51 ++++++++++++++++ game/main/src/utlis/mod.rs | 1 + 9 files changed, 110 insertions(+), 56 deletions(-) create mode 100644 game/main/src/utlis/chunk_utils.rs diff --git a/.vscode/launch.json b/.vscode/launch.json index 2c57237..476c68c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -14,12 +14,12 @@ "args": [], "cwd": "${workspaceRoot}/target/debug", "preLaunchTask": "Build", - // "environment": [ - // { - // "name": "RUST_BACKTRACE", - // "value": "1" - // } - // ] + "environment": [ + { + "name": "RUST_BACKTRACE", + "value": "1" + } + ] } ] } \ No newline at end of file diff --git a/engine/world_generation/src/lib.rs b/engine/world_generation/src/lib.rs index 051f281..02720a6 100644 --- a/engine/world_generation/src/lib.rs +++ b/engine/world_generation/src/lib.rs @@ -8,7 +8,7 @@ pub mod tile_manager; pub mod tile_mapper; pub mod prelude { - use crate::hex_utils::{tile_to_world_distance, HexCoord, INNER_RADIUS, OUTER_RADIUS, SHORT_DIAGONAL}; + use crate::hex_utils::{HexCoord, INNER_RADIUS, OUTER_RADIUS, SHORT_DIAGONAL}; use bevy::math::{IVec2, UVec2, Vec2, Vec3}; use bevy::prelude::Resource; use bevy::prelude::*; diff --git a/game/main/src/camera_system/camera_plugin.rs b/game/main/src/camera_system/camera_plugin.rs index 7c8ecb6..a40ea55 100644 --- a/game/main/src/camera_system/camera_plugin.rs +++ b/game/main/src/camera_system/camera_plugin.rs @@ -1,9 +1,7 @@ use bevy::core_pipeline::experimental::taa::{TemporalAntiAliasBundle, TemporalAntiAliasPlugin}; use bevy::input::mouse::{MouseMotion, MouseScrollUnit, MouseWheel}; -use bevy::pbr::ScreenSpaceAmbientOcclusionBundle; use bevy::prelude::*; use bevy::window::CursorGrabMode; -use bevy_rapier3d::plugin::RapierContext; use world_generation::hex_utils::HexCoord; use world_generation::prelude::Map; diff --git a/game/main/src/camera_system/components.rs b/game/main/src/camera_system/components.rs index f1f40ff..d713ac9 100644 --- a/game/main/src/camera_system/components.rs +++ b/game/main/src/camera_system/components.rs @@ -1,8 +1,5 @@ use bevy::prelude::*; -use world_generation::{ - hex_utils::{tile_to_world_distance, SHORT_DIAGONAL}, - prelude::Chunk, -}; +use world_generation::{hex_utils::SHORT_DIAGONAL, prelude::Chunk}; #[derive(Component, Reflect)] #[reflect(Component)] diff --git a/game/main/src/map_rendering/chunk_rebuild.rs b/game/main/src/map_rendering/chunk_rebuild.rs index 13b16fd..8686a1c 100644 --- a/game/main/src/map_rendering/chunk_rebuild.rs +++ b/game/main/src/map_rendering/chunk_rebuild.rs @@ -1,11 +1,14 @@ +use std::mem::swap; + use bevy::prelude::*; -use bevy_rapier3d::geometry::{Collider, TriMeshFlags}; +use bevy::tasks::*; +use bevy::utils::futures; +use bevy_rapier3d::geometry::Collider; +use bevy_rapier3d::geometry::TriMeshFlags; use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; use world_generation::{ biome_painter::BiomePainterAsset, - chunk_colliders::generate_chunk_collider, - hex_utils::{self, offset_to_world, SHORT_DIAGONAL}, - mesh_generator::generate_chunk_mesh, + hex_utils::SHORT_DIAGONAL, prelude::{Chunk, Map}, tile_manager::TileAsset, tile_mapper::TileMapperAsset, @@ -13,7 +16,7 @@ use world_generation::{ use crate::{ prelude::{ChunkAtlas, PhosChunk, PhosChunkRegistry}, - utlis::render_distance_system::RenderDistanceVisibility, + utlis::{chunk_utils::prepare_chunk_mesh, render_distance_system::RenderDistanceVisibility}, }; use super::prelude::CurrentBiomePainter; @@ -24,6 +27,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); } } @@ -51,6 +55,7 @@ fn chunk_rebuilder( for chunk_index in &queue.queue { let chunk = chunks.chunks[*chunk_index]; + // commands.entity(chunk).remove::>(); commands.entity(chunk).despawn(); } @@ -62,21 +67,26 @@ fn chunk_rebuilder( .queue .par_iter() .map(|idx| { - let chunk = &heightmap.chunks[*idx]; - let mesh = generate_chunk_mesh(chunk, &heightmap, cur_painter, &tile_assets, &tile_mappers); - let (col_verts, col_indicies) = generate_chunk_collider(chunk, &heightmap); - let collider = - Collider::trimesh_with_flags(col_verts, col_indicies, TriMeshFlags::MERGE_DUPLICATE_VERTICES); - return ( - mesh, - collider, - offset_to_world(chunk.chunk_offset * Chunk::SIZE as i32, 0.), - hex_utils::offset_to_index(chunk.chunk_offset, heightmap.width), + return prepare_chunk_mesh( + &heightmap.chunks[*idx], + &heightmap, + cur_painter, + &tile_assets, + &tile_mappers, ); }) .collect(); - for (mesh, collider, pos, index) in chunk_meshes { + let pool = TaskPool::new(); + + for (mesh, collider_data, pos, index) in chunk_meshes { + let task = pool.spawn(async { + Collider::trimesh_with_flags( + collider_data.0, + collider_data.1, + TriMeshFlags::DELETE_DUPLICATE_TRIANGLES, + ) + }); let chunk = commands.spawn(( MaterialMeshBundle { mesh: meshes.add(mesh), @@ -90,9 +100,25 @@ fn chunk_rebuilder( 0., (Chunk::SIZE / 2) as f32 * 1.5, )), - collider, + ColliderTask { task }, )); chunks.chunks[index] = chunk.id(); } queue.queue.clear(); } + +fn collider_task_resolver(mut chunks: Query<(&mut ColliderTask, Entity), With>, mut commands: Commands) { + for (mut task, entity) in &mut chunks { + match futures::check_ready(&mut task.task) { + Some(c) => { + commands.entity(entity).insert(c); + } + None => (), + } + } +} + +#[derive(Component)] +struct ColliderTask { + pub task: Task, +} diff --git a/game/main/src/map_rendering/map_init.rs b/game/main/src/map_rendering/map_init.rs index 3994c20..31e8555 100644 --- a/game/main/src/map_rendering/map_init.rs +++ b/game/main/src/map_rendering/map_init.rs @@ -2,16 +2,9 @@ use bevy::log::*; use bevy::{asset::LoadState, pbr::ExtendedMaterial, prelude::*}; use bevy_inspector_egui::quick::ResourceInspectorPlugin; -use bevy_rapier3d::geometry::Collider; use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; use world_generation::{ - biome_painter::*, - chunk_colliders::generate_chunk_collider, - heightmap::generate_heightmap, - hex_utils::{self, offset_to_world, SHORT_DIAGONAL}, - mesh_generator::generate_chunk_mesh, - prelude::*, - tile_manager::*, + biome_painter::*, heightmap::generate_heightmap, hex_utils::SHORT_DIAGONAL, prelude::*, tile_manager::*, tile_mapper::*, }; @@ -19,7 +12,10 @@ use crate::{ camera_system::components::*, prelude::{ChunkAtlas, PhosChunk, PhosChunkRegistry, PhosMap}, shader_extensions::chunk_material::ChunkMaterial, - utlis::render_distance_system::RenderDistanceVisibility, + utlis::{ + chunk_utils::{prepare_chunk_mesh, prepare_chunk_mesh_with_collider}, + render_distance_system::RenderDistanceVisibility, + }, }; use super::{ @@ -218,22 +214,7 @@ fn spawn_map( .chunks .par_iter() .map(|chunk: &Chunk| { - #[cfg(feature = "tracing")] - let _gen_mesh = info_span!("Generate Chunk").entered(); - let mesh = generate_chunk_mesh(chunk, &heightmap, cur_painter, &tile_assets, &tile_mappers); - let (col_verts, col_indicies) = generate_chunk_collider(chunk, &heightmap); - let collider: Collider; - { - #[cfg(feature = "tracing")] - let _collider_span = info_span!("Create Collider Trimesh").entered(); - collider = Collider::trimesh(col_verts, col_indicies); - } - return ( - mesh, - collider, - offset_to_world(chunk.chunk_offset * Chunk::SIZE as i32, 0.), - hex_utils::offset_to_index(chunk.chunk_offset, heightmap.width), - ); + return prepare_chunk_mesh_with_collider(chunk, &heightmap, cur_painter, &tile_assets, &tile_mappers); }) .collect(); diff --git a/game/main/src/map_rendering/terraforming_test.rs b/game/main/src/map_rendering/terraforming_test.rs index 8bd7e9c..e6f03cc 100644 --- a/game/main/src/map_rendering/terraforming_test.rs +++ b/game/main/src/map_rendering/terraforming_test.rs @@ -24,7 +24,7 @@ fn deform( time: Res