From 21f8f2c3eeff0e45905cbe01b8891aa6ece25666 Mon Sep 17 00:00:00 2001 From: Elias Stepanik Date: Tue, 17 Jun 2025 21:20:51 +0200 Subject: [PATCH] Some changes --- .../environment/systems/voxel_system.rs | 90 ++++++++++++------- 1 file changed, 57 insertions(+), 33 deletions(-) diff --git a/client/src/plugins/environment/systems/voxel_system.rs b/client/src/plugins/environment/systems/voxel_system.rs index 0cee037..9ad665a 100644 --- a/client/src/plugins/environment/systems/voxel_system.rs +++ b/client/src/plugins/environment/systems/voxel_system.rs @@ -2,49 +2,69 @@ use crate::plugins::big_space::big_space_plugin::RootGrid; use crate::plugins::environment::systems::voxels::structure::*; use rayon::prelude::*; use std::path::Path; - +use std::thread; use bevy::prelude::*; use bevy::render::mesh::*; use noise::{NoiseFn, Perlin}; use rand::{Rng, thread_rng}; pub fn setup(mut commands: Commands, root: Res) { - // Octree parameters - let unit_size = 1.0_f32; - let octree_base_size = 64.0 * unit_size; - let octree_depth = 10; - let path = Path::new("octree.bin"); - let mut octree = if path.exists() { - match SparseVoxelOctree::load_from_file(path) { - Ok(tree) => tree, - Err(err) => { - error!("failed to load octree: {err}"); - SparseVoxelOctree::new(octree_depth, octree_base_size, false, false, false) - } - } - } else { - let mut tree = SparseVoxelOctree::new(octree_depth, octree_base_size, false, false, false); - // How many random spheres? - /*const NUM_SPHERES: usize = 5; - let mut rng = threald_rng(); + let builder = thread::Builder::new() + .name("octree-build".into()) + .stack_size(64 * 4096 * 4096); - for _ in 0..NUM_SPHERES { - let center = Vec3::new( - rng.gen_range(-1000.0..1000.0), - rng.gen_range(-1000.0..1000.0), - rng.gen_range(-1000.0..1000.0), - ); + let handle = builder + .spawn(move || { + // Octree parameters + let unit_size = 1.0_f32; + let octree_base_size = 64.0 * unit_size; + let octree_depth = 10; - let radius = rng.gen_range(20..=150); // voxels - generate_voxel_sphere_parallel(&mut tree, center, radius); - }*/ - generate_voxel_sphere(&mut tree, 200); - tree - }; + let path = Path::new("octree.bin"); + + + let mut octree = if Path::new(path).exists() { + match SparseVoxelOctree::load_from_file(path) { + Ok(tree) => tree, + Err(err) => { + error!("failed to load octree: {err}"); + SparseVoxelOctree::new(octree_depth, octree_base_size, false, false, false) + } + } + } else { + let mut tree = SparseVoxelOctree::new(octree_depth, octree_base_size, false, false, false); + // How many random spheres? + const NUM_SPHERES: usize = 5; + let mut rng = thread_rng(); + + for _ in 0..NUM_SPHERES { + let center = Vec3::new( + rng.gen_range(-1000.0..1000.0), + rng.gen_range(-1000.0..1000.0), + rng.gen_range(-1000.0..1000.0), + ); + + let radius = rng.gen_range(20..=150); // voxels + + generate_voxel_sphere_parallel(&mut tree, center, radius); + } + + /*generate_voxel_sphere(&mut tree, 200);*/ + tree + }; + + + octree + }) + .expect("failed to spawn octree build thread") + .join(); + + let octree = handle.expect("Failed to join octree build thread"); + // Attach octree to the scene graph commands.entity(root.0).with_children(|parent| { @@ -52,6 +72,9 @@ pub fn setup(mut commands: Commands, root: Res) { }); } + + + pub fn generate_voxel_sphere_parallel(octree: &mut SparseVoxelOctree, center: Vec3, radius: i32) { let step = octree.get_spacing_at_depth(octree.max_depth); let radius_sq = radius * radius; @@ -90,7 +113,7 @@ pub fn generate_voxel_sphere_parallel(octree: &mut SparseVoxelOctree, center: Ve } } -fn generate_voxel_sphere(octree: &mut SparseVoxelOctree, planet_radius: i32) { +fn generate_voxel_sphere(octree: &mut SparseVoxelOctree, center: Vec3, planet_radius: i32) { // For simplicity, we center the sphere around (0,0,0). // We'll loop over a cubic region [-planet_radius, +planet_radius] in x, y, z let min = -planet_radius; @@ -112,7 +135,7 @@ fn generate_voxel_sphere(octree: &mut SparseVoxelOctree, planet_radius: i32) { let wx = x as f32 * step; let wy = y as f32 * step; let wz = z as f32 * step; - let position = Vec3::new(wx, wy, wz); + let position = center + Vec3::new(wx, wy, wz); // Insert the voxel let voxel = Voxel::random_sides(); @@ -123,6 +146,7 @@ fn generate_voxel_sphere(octree: &mut SparseVoxelOctree, planet_radius: i32) { } } + /// Inserts a 16x256x16 "column" of voxels into the octree at (0,0,0) corner. /// If you want it offset or centered differently, just adjust the for-loop ranges or offsets. fn generate_voxel_rect(octree: &mut SparseVoxelOctree) {