mirror of
https://github.com/eliasstepanik/voxel-simulation.git
synced 2026-01-10 21:38:29 +00:00
Some changes
This commit is contained in:
parent
b85f18e7f3
commit
21f8f2c3ee
@ -2,49 +2,69 @@ use crate::plugins::big_space::big_space_plugin::RootGrid;
|
|||||||
use crate::plugins::environment::systems::voxels::structure::*;
|
use crate::plugins::environment::systems::voxels::structure::*;
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
use std::thread;
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use bevy::render::mesh::*;
|
use bevy::render::mesh::*;
|
||||||
use noise::{NoiseFn, Perlin};
|
use noise::{NoiseFn, Perlin};
|
||||||
use rand::{Rng, thread_rng};
|
use rand::{Rng, thread_rng};
|
||||||
|
|
||||||
pub fn setup(mut commands: Commands, root: Res<RootGrid>) {
|
pub fn setup(mut commands: Commands, root: Res<RootGrid>) {
|
||||||
// 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 builder = thread::Builder::new()
|
||||||
match SparseVoxelOctree::load_from_file(path) {
|
.name("octree-build".into())
|
||||||
Ok(tree) => tree,
|
.stack_size(64 * 4096 * 4096);
|
||||||
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();
|
|
||||||
|
|
||||||
for _ in 0..NUM_SPHERES {
|
let handle = builder
|
||||||
let center = Vec3::new(
|
.spawn(move || {
|
||||||
rng.gen_range(-1000.0..1000.0),
|
// Octree parameters
|
||||||
rng.gen_range(-1000.0..1000.0),
|
let unit_size = 1.0_f32;
|
||||||
rng.gen_range(-1000.0..1000.0),
|
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);
|
let path = Path::new("octree.bin");
|
||||||
tree
|
|
||||||
};
|
|
||||||
|
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
|
// Attach octree to the scene graph
|
||||||
commands.entity(root.0).with_children(|parent| {
|
commands.entity(root.0).with_children(|parent| {
|
||||||
@ -52,6 +72,9 @@ pub fn setup(mut commands: Commands, root: Res<RootGrid>) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pub fn generate_voxel_sphere_parallel(octree: &mut SparseVoxelOctree, center: Vec3, radius: i32) {
|
pub fn generate_voxel_sphere_parallel(octree: &mut SparseVoxelOctree, center: Vec3, radius: i32) {
|
||||||
let step = octree.get_spacing_at_depth(octree.max_depth);
|
let step = octree.get_spacing_at_depth(octree.max_depth);
|
||||||
let radius_sq = radius * radius;
|
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).
|
// 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
|
// We'll loop over a cubic region [-planet_radius, +planet_radius] in x, y, z
|
||||||
let min = -planet_radius;
|
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 wx = x as f32 * step;
|
||||||
let wy = y as f32 * step;
|
let wy = y as f32 * step;
|
||||||
let wz = z 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
|
// Insert the voxel
|
||||||
let voxel = Voxel::random_sides();
|
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.
|
/// 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.
|
/// If you want it offset or centered differently, just adjust the for-loop ranges or offsets.
|
||||||
fn generate_voxel_rect(octree: &mut SparseVoxelOctree) {
|
fn generate_voxel_rect(octree: &mut SparseVoxelOctree) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user