Some changes

This commit is contained in:
Elias Stepanik 2025-06-17 21:20:51 +02:00
parent b85f18e7f3
commit 21f8f2c3ee

View File

@ -2,21 +2,32 @@ 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<RootGrid>) {
let builder = thread::Builder::new()
.name("octree-build".into())
.stack_size(64 * 4096 * 4096);
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 path = Path::new("octree.bin");
let mut octree = if path.exists() {
let mut octree = if Path::new(path).exists() {
match SparseVoxelOctree::load_from_file(path) {
Ok(tree) => tree,
Err(err) => {
@ -27,8 +38,8 @@ pub fn setup(mut commands: Commands, root: Res<RootGrid>) {
} 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();
const NUM_SPHERES: usize = 5;
let mut rng = thread_rng();
for _ in 0..NUM_SPHERES {
let center = Vec3::new(
@ -40,18 +51,30 @@ pub fn setup(mut commands: Commands, root: Res<RootGrid>) {
let radius = rng.gen_range(20..=150); // voxels
generate_voxel_sphere_parallel(&mut tree, center, radius);
}*/
}
generate_voxel_sphere(&mut tree, 200);
/*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| {
parent.spawn((Transform::default(), octree));
});
}
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) {