multi-threaded generation
This commit is contained in:
24
Cargo.lock
generated
24
Cargo.lock
generated
@@ -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",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
Reference in New Issue
Block a user