From 366381286a0fa3b6065cdd38dcd2cef7486da4d7 Mon Sep 17 00:00:00 2001 From: Elias Stepanik Date: Sun, 8 Jun 2025 18:27:36 +0200 Subject: [PATCH] Refactor --- client/Cargo.toml | 3 +- .../environment/systems/voxel_system.rs | 78 +++++++++++++------ 2 files changed, 57 insertions(+), 24 deletions(-) diff --git a/client/Cargo.toml b/client/Cargo.toml index 125b5fc..456e265 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -18,4 +18,5 @@ noise = "0.9.0" itertools = "0.13.0" bitvec = "1.0.1" smallvec = "1.14.0" -once_cell = "1.21.3" \ No newline at end of file +once_cell = "1.21.3" +rayon = "1.10.0" \ No newline at end of file diff --git a/client/src/plugins/environment/systems/voxel_system.rs b/client/src/plugins/environment/systems/voxel_system.rs index fa3e706..1bacfdd 100644 --- a/client/src/plugins/environment/systems/voxel_system.rs +++ b/client/src/plugins/environment/systems/voxel_system.rs @@ -1,42 +1,33 @@ -use bevy::asset::RenderAssetUsages; -use bevy::pbr::wireframe::{Wireframe, WireframeColor}; +use crate::plugins::big_space::big_space_plugin::RootGrid; +use crate::plugins::environment::systems::voxels::structure::*; + use bevy::prelude::*; use bevy::render::mesh::*; -use big_space::floating_origins::FloatingOrigin; -use big_space::prelude::GridCell; -use noise::{Fbm, NoiseFn, Perlin}; -use crate::plugins::big_space::big_space_plugin::RootGrid; -use crate::plugins::environment::systems::camera_system::CameraController; -use crate::plugins::environment::systems::planet_system::PlanetMaker; -use crate::plugins::environment::systems::voxels::structure::*; +use noise::{NoiseFn, Perlin}; pub fn setup( mut commands: Commands, root: Res, ) { - let unit_size = 1.0; - - let octree_base_size = 64.0 * unit_size; // Octree's total size in your world space + let unit_size = 1.0_f32; + let octree_base_size = 64.0 * unit_size; let octree_depth = 10; + // 1. Create octree and wrap in Arc> for thread-safe generation + let mut octree = SparseVoxelOctree::new(octree_depth, octree_base_size, false, false, false); - let mut octree = SparseVoxelOctree::new(octree_depth, octree_base_size as f32, false, false, false); - - + // 2. Generate sphere in parallel, dropping the cloned Arc inside the function let color = Color::rgb(0.2, 0.8, 0.2); - /*generate_voxel_rect(&mut octree,color);*/ + generate_voxel_sphere(&mut octree, 100, color); + // 4. Spawn entity with both Transform and the real octree component commands.entity(root.0).with_children(|parent| { - parent.spawn( - ( - Transform::default(), - octree - ) - ); + parent.spawn((Transform::default(), octree)); }); } + fn generate_voxel_sphere( octree: &mut SparseVoxelOctree, planet_radius: i32, @@ -77,7 +68,6 @@ fn generate_voxel_sphere( } - /// 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( @@ -151,3 +141,45 @@ fn generate_large_plane( } } + +pub fn generate_solid_plane_with_noise( + octree: &mut SparseVoxelOctree, + width: usize, + depth: usize, + color: Color, + noise: &Perlin, + frequency: f32, + amplitude: f32, +) { + // Size of one voxel at the deepest level + let step = octree.get_spacing_at_depth(octree.max_depth); + + for ix in 0..width { + let x = ix as f32; + for iz in 0..depth { + let z = iz as f32; + + // Sample Perlin noise at scaled coordinates + let sample_x = x * frequency; + let sample_z = z * frequency; + let noise_val = noise.get([sample_x as f64, sample_z as f64]) as f32; + + // Height in world units + let height_world = noise_val * amplitude; + // Convert height to number of voxel layers + let max_layer = (height_world / step).ceil() as usize; + + // Fill from layer 0 up to max_layer + for iy in 0..=max_layer { + let position = Vec3::new( + x * step, + iy as f32 * step, + z * step, + ); + + let voxel = Voxel { color }; + octree.insert(position, voxel); + } + } + } +}