multi-threaded generation

This commit is contained in:
2024-04-28 21:20:30 -04:00
parent 9de7bc53d0
commit c434b2eab0
6 changed files with 88 additions and 35 deletions

24
Cargo.lock generated
View File

@@ -2022,7 +2022,7 @@ dependencies = [
"vec_map", "vec_map",
"wasm-bindgen", "wasm-bindgen",
"web-sys", "web-sys",
"windows 0.48.0", "windows 0.54.0",
] ]
[[package]] [[package]]
@@ -3070,6 +3070,7 @@ dependencies = [
"camera_system", "camera_system",
"iyes_perf_ui", "iyes_perf_ui",
"noise 0.8.2", "noise 0.8.2",
"rayon",
"world_generation", "world_generation",
] ]
@@ -3309,6 +3310,26 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
[[package]]
name = "rayon"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
dependencies = [
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
dependencies = [
"crossbeam-deque",
"crossbeam-utils",
]
[[package]] [[package]]
name = "rectangle-pack" name = "rectangle-pack"
version = "0.4.2" version = "0.4.2"
@@ -4538,6 +4559,7 @@ dependencies = [
"asset_loader", "asset_loader",
"bevy", "bevy",
"noise 0.9.0", "noise 0.9.0",
"rayon",
"serde", "serde",
"serde_json", "serde_json",
] ]

View File

@@ -11,3 +11,4 @@ noise = "0.9.0"
serde = {version="1.0.197", features=["derive"]} serde = {version="1.0.197", features=["derive"]}
serde_json = "1.0.115" serde_json = "1.0.115"
asset_loader = {path = "../asset_loader"} asset_loader = {path = "../asset_loader"}
rayon = "1.10.0"

View File

@@ -1,16 +1,20 @@
use bevy::math::IVec2; use bevy::math::IVec2;
use bevy::prelude::{FloatExt, Vec2}; use bevy::prelude::{FloatExt, Vec2};
use noise::{NoiseFn, SuperSimplex}; use noise::{NoiseFn, SuperSimplex};
use rayon::iter::{IntoParallelIterator, ParallelIterator};
use crate::prelude::*; use crate::prelude::*;
pub fn generate_heightmap(cfg: &GenerationConfig, seed: u32) -> Map { pub fn generate_heightmap(cfg: &GenerationConfig, seed: u32) -> Map {
let mut chunks: Vec<Chunk> = Vec::with_capacity(cfg.size.length_squared() as usize); // let mut chunks: Vec<Chunk> = Vec::with_capacity(cfg.size.length_squared() as usize);
for z in 0..cfg.size.y { let chunks = (0..cfg.size.y)
for x in 0..cfg.size.x { .into_par_iter()
chunks.push(generate_chunk(x as f64, z as f64, cfg, seed)); .flat_map(|z| {
} (0..cfg.size.x)
} .into_par_iter()
.map(move |x| generate_chunk(x as f64, z as f64, cfg, seed))
})
.collect();
return Map { return Map {
chunks, chunks,
height: cfg.size.y as usize, height: cfg.size.y as usize,

View File

@@ -14,3 +14,4 @@ noise = "0.8.2"
world_generation ={path="../../engine/world_generation"} world_generation ={path="../../engine/world_generation"}
camera_system={path = "../camera_system"} camera_system={path = "../camera_system"}
bevy_rapier3d = { version = "0.25.0", features = [ "simd-stable", "debug-render-3d" ] } bevy_rapier3d = { version = "0.25.0", features = [ "simd-stable", "debug-render-3d" ] }
rayon = "1.10.0"

View File

@@ -16,8 +16,9 @@ fn main() {
primary_window: Some(Window { primary_window: Some(Window {
title: "Phos".into(), title: "Phos".into(),
name: Some("phos".into()), name: Some("phos".into()),
resolution: (1920., 1080.).into(),
present_mode: PresentMode::AutoNoVsync, present_mode: PresentMode::AutoNoVsync,
mode: bevy::window::WindowMode::BorderlessFullscreen, // mode: bevy::window::WindowMode::BorderlessFullscreen,
..default() ..default()
}), }),
..default() ..default()

View File

@@ -2,13 +2,12 @@ use crate::prelude::*;
use crate::shader_extensions::chunk_material::ChunkMaterial; use crate::shader_extensions::chunk_material::ChunkMaterial;
use bevy::asset::LoadState; use bevy::asset::LoadState;
use bevy::pbr::ExtendedMaterial; use bevy::pbr::ExtendedMaterial;
use bevy::render::view::visibility;
use bevy::{pbr::CascadeShadowConfig, prelude::*}; use bevy::{pbr::CascadeShadowConfig, prelude::*};
use bevy_rapier3d::plugin::{NoUserData, RapierPhysicsPlugin}; use bevy_rapier3d::plugin::{NoUserData, RapierPhysicsPlugin};
use bevy_rapier3d::render::RapierDebugRenderPlugin; use bevy_rapier3d::render::RapierDebugRenderPlugin;
use camera_system::prelude::PhosCamera;
use camera_system::PhosCameraPlugin; use camera_system::PhosCameraPlugin;
use iyes_perf_ui::prelude::*; use iyes_perf_ui::prelude::*;
use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
use world_generation::biome_painter::{ use world_generation::biome_painter::{
BiomePainterAsset, BiomePainterLoadState, BiomePainterPlugin, BiomePainterAsset, BiomePainterLoadState, BiomePainterPlugin,
}; };
@@ -32,8 +31,6 @@ impl Plugin for PhosGamePlugin {
app.add_systems(Startup, init_game) app.add_systems(Startup, init_game)
.add_systems(Startup, (load_textures, load_tiles, create_map).chain()); .add_systems(Startup, (load_textures, load_tiles, create_map).chain());
//Systems - PreUpdate
app.add_systems(PreUpdate, render_distance_system);
//Systems - Update //Systems - Update
app.add_systems(Update, (finalize_texture, spawn_map)); app.add_systems(Update, (finalize_texture, spawn_map));
@@ -216,15 +213,22 @@ fn spawn_map(
}, },
}); });
for chunk in &heightmap.chunks { let cur_painter = b_painter.unwrap();
let mesh = generate_chunk_mesh(
&chunk, let chunk_meshes: Vec<_> = heightmap
&heightmap, .chunks
b_painter.unwrap(), .par_iter()
&tile_assets, .map(|chunk: &Chunk| {
&tile_mappers, let mesh =
); generate_chunk_mesh(chunk, &heightmap, cur_painter, &tile_assets, &tile_mappers);
let pos = offset_to_world(chunk.chunk_offset * Chunk::SIZE as i32, 0.); return (
mesh,
offset_to_world(chunk.chunk_offset * Chunk::SIZE as i32, 0.),
);
})
.collect();
for (mesh, pos) in chunk_meshes {
commands.spawn(( commands.spawn((
MaterialMeshBundle { MaterialMeshBundle {
mesh: meshes.add(mesh), mesh: meshes.add(mesh),
@@ -235,19 +239,39 @@ fn spawn_map(
PhosChunk, PhosChunk,
)); ));
} }
// for chunk in &heightmap.chunks {
// let mesh = generate_chunk_mesh(
// &chunk,
// &heightmap,
// b_painter.unwrap(),
// &tile_assets,
// &tile_mappers,
// );
// let pos = offset_to_world(chunk.chunk_offset * Chunk::SIZE as i32, 0.);
// commands.spawn((
// MaterialMeshBundle {
// mesh: meshes.add(mesh),
// material: chunk_material.clone(),
// transform: Transform::from_translation(pos),
// ..default()
// },
// PhosChunk::from_translation(pos),
// ));
// }
} }
fn render_distance_system( // fn render_distance_system(
mut chunks: Query<(&Transform, &mut Visibility), With<PhosChunk>>, // mut chunks: Query<(&PhosChunk, &mut Visibility)>,
camera: Query<&Transform, With<PhosCamera>>, // camera: Query<&Transform, With<PhosCamera>>,
) { // ) {
let cam = camera.single(); // let cam = camera.single();
for (transform, mut visibility) in chunks.iter_mut() { // for (transform, mut visibility) in chunks.iter_mut() {
let dist = (transform.translation - cam.translation).length_squared(); // let dist = (transform.center - cam.translation).length();
if dist > 1000000. { // if dist > 500. {
*visibility = Visibility::Hidden; // *visibility = Visibility::Hidden;
} else { // } else {
*visibility = Visibility::Visible; // *visibility = Visibility::Visible;
} // }
} // }
} // }