/* Generic tree structures for storage of spatial data. Copyright (C) 2023 Alexander Pyattaev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /*use spatialtree::*; use rayon::prelude::*; struct Chunk { // data to store in the chunk, for EG storing voxel or heighmap data // if you don't use editing, storing this data isn't needed, and only storing the mesh would be enough data: [f32; 4096], // this amount of data actually makes it slower. To see the true octree speed, replace this with [f32; 0] } impl Chunk { // this does a cheap init so it can safely be put inside the vec fn new(_position: OctVec) -> Self { Self { data: [0.0; 4096] } } // pretend this inits the data with some expensive procedural generation fn expensive_init(&mut self, _position: OctVec) { self.data = [1.0; 4096]; // emulate a 1ms time to do things // we can't use sleep because thats 15ms on windows min let start = std::time::Instant::now(); while start.elapsed() < std::time::Duration::from_millis(1) {} } // and pretend this makes chunks visible/invisible fn set_visible(&mut self, _visibility: bool) {} // and pretend this drops anything for when a chunk is permanently deleted fn cleanup(&mut self) {} } fn main() { // create an octree let mut tree = OctTree::::with_capacity(512, 512); // the game loop that runs for 42 iterations for _ in 0..42 { let start_time = std::time::Instant::now(); // get the pending updates if tree.prepare_update( &[OctVec::new(4096, 4096, 4096, 32)], // target position in the tree 2, // the amount of detail &mut |position_in_tree| Chunk::new(position_in_tree), // and how we should make a new tree inside the function here. This should be done quickly ) { let duration = start_time.elapsed().as_micros(); println!( "Took {} microseconds to get the tree update ready", duration ); //TODO: rewrite this to use chunks_add callback which modifies captured Vec and pushes chunk references // in there for thread pool to consume later. // if there was an update, we need to first generate new chunks with expensive_init tree.get_chunks_to_add_slice_mut().par_iter_mut().for_each( |ToAddContainer { position, chunk, .. }| { // and run expensive init chunk.expensive_init(*position); }, ); let start_time = std::time::Instant::now(); // and don't forget to actually run the update tree.do_update(); // now we probably want to truly clean up the chunks that are going to be deleted from memory for chunk in tree.iter_chunks_to_delete_mut() { chunk.cleanup(); } // and actually clean them up tree.complete_update(); let duration = start_time.elapsed().as_micros(); println!("Took {} microseconds to execute the update", duration); } let duration = start_time.elapsed().as_micros(); println!("Took {} microseconds to do the entire update", duration); // and print some data about the run println!("Num chunks in the tree: {}", tree.get_num_chunks()); } } */ fn main() {}