memory optimization of neighborhood for empty volumes

This commit is contained in:
zomseffen 2025-01-24 14:36:02 +01:00
parent 1d4b31c142
commit f0fa28bdd8

View file

@ -1,6 +1,7 @@
use cgmath::Vector3;
use std::cell::RefCell;
use std::collections::HashSet;
use std::rc::Rc;
use std::time::Instant;
@ -263,11 +264,11 @@ impl EmptyVolume {
for x in 0..x_size+1 {
for y in 0..y_size+1 {
for z in 0..z_size+1 {
neighbors.set_element(reference.clone(), reference.borrow().position.x + x, reference.borrow().position.y + y, reference.borrow().position.z + z);
//neighbors.set_element(reference.clone(), reference.borrow().position.x + x, reference.borrow().position.y + y, reference.borrow().position.z + z);
// fill only the edges
/*if x == 0 || x == x_size || y == 0 || y == y_size || z==0 || z == z_size {
if x == 0 || x == x_size || y == 0 || y == y_size || z==0 || z == z_size {
neighbors.set_element(reference.clone(), reference.borrow().position.x + x, reference.borrow().position.y + y, reference.borrow().position.z + z)
}*/
}
}
}
}
@ -459,7 +460,7 @@ impl EmptyVolume {
reference.borrow_mut().color_right= vec![];
reference.borrow_mut().roughness_right= vec![];
}
println!("new volume done");
//push to the list
volumes.push(reference);
@ -501,12 +502,14 @@ impl EmptyVolume {
// MARK: bottom face of the volume
let mut bottom_neighbors = vec![];
let mut bottom_elements_num = 0;
let mut all_same = true;
if z_min_pos != 0 {
for x in 0..reference.borrow().size_x {
for y in 0..reference.borrow().size_y {
if let Some(c) = neighbors.get_element(reference.borrow().position.x + x, reference.borrow().position.y + y, z_min_pos) {
bottom_elements_num += 1;
bottom_neighbors.push(Some(c.clone()));
all_same = all_same && (bottom_neighbors[0] == Some(c));
}
else {
bottom_neighbors.push(None);
@ -515,7 +518,12 @@ impl EmptyVolume {
}
}
if bottom_elements_num > 0 {
reference.borrow_mut().neighbor_bottom = bottom_neighbors;
if all_same {
reference.borrow_mut().neighbor_bottom = vec![bottom_neighbors[0].clone()];
}
else {
reference.borrow_mut().neighbor_bottom = bottom_neighbors;
}
}
else {
reference.borrow_mut().neighbor_bottom = vec![None];
@ -523,11 +531,13 @@ impl EmptyVolume {
// MARK: top face of the volume
let mut top_neighbors = vec![];
let mut top_elements_num = 0;
let mut all_same = true;
for x in 0..reference.borrow().size_x {
for y in 0..reference.borrow().size_y {
if let Some(c) = neighbors.get_element(reference.borrow().position.x + x, reference.borrow().position.y + y, z_max_pos) {
top_elements_num += 1;
top_neighbors.push(Some(c.clone()));
all_same = all_same && (top_neighbors[0] == Some(c));
}
else {
top_neighbors.push(None);
@ -535,7 +545,12 @@ impl EmptyVolume {
}
}
if top_elements_num > 0 {
reference.borrow_mut().neighbor_top = top_neighbors;
if all_same {
reference.borrow_mut().neighbor_top = vec![top_neighbors[0].clone()];
}
else {
reference.borrow_mut().neighbor_top = top_neighbors;
}
}
else {
reference.borrow_mut().neighbor_top = vec![None];
@ -544,11 +559,13 @@ impl EmptyVolume {
// MARK: back face of the volume
let mut back_neighbors = vec![];
let mut back_elements_num = 0;
let mut all_same = true;
for x in 0..reference.borrow().size_x {
for z in 0..reference.borrow().size_z {
if let Some(c) = neighbors.get_element(reference.borrow().position.x + x, y_max_pos, reference.borrow().position.z + z) {
back_elements_num += 1;
back_neighbors.push(Some(c.clone()));
all_same = all_same && (back_neighbors[0] == Some(c));
}
else {
back_neighbors.push(None);
@ -556,7 +573,12 @@ impl EmptyVolume {
}
}
if back_elements_num > 0 {
reference.borrow_mut().neighbor_back = back_neighbors;
if all_same {
reference.borrow_mut().neighbor_back = vec![back_neighbors[0].clone()];
}
else {
reference.borrow_mut().neighbor_back = back_neighbors;
}
}
else {
reference.borrow_mut().neighbor_back = vec![None];
@ -565,12 +587,14 @@ impl EmptyVolume {
// MARK: front face of the volume
let mut front_neighbors = vec![];
let mut front_elements_num = 0;
let mut all_same = true;
if y_min_pos != 0{
for x in 0..reference.borrow().size_x {
for z in 0..reference.borrow().size_z {
if let Some(c) = neighbors.get_element(reference.borrow().position.x + x, y_min_pos, reference.borrow().position.z + z) {
front_elements_num += 1;
front_neighbors.push(Some(c.clone()));
all_same = all_same && (front_neighbors[0] == Some(c));
}
else {
front_neighbors.push(None);
@ -579,7 +603,12 @@ impl EmptyVolume {
}
}
if front_elements_num > 0 {
reference.borrow_mut().neighbor_front = front_neighbors;
if all_same {
reference.borrow_mut().neighbor_front = vec![front_neighbors[0].clone()];
}
else {
reference.borrow_mut().neighbor_front = front_neighbors;
}
}
else {
reference.borrow_mut().neighbor_front = vec![None];
@ -588,12 +617,14 @@ impl EmptyVolume {
// MARK: left face of the volume
let mut left_neighbors = vec![];
let mut left_elements_num = 0;
let mut all_same = true;
if x_min_pos != 0 {
for y in 0..reference.borrow().size_y {
for z in 0..reference.borrow().size_z {
if let Some(c) = neighbors.get_element(x_min_pos, reference.borrow().position.y + y, reference.borrow().position.z + z) {
left_elements_num += 1;
left_neighbors.push(Some(c.clone()));
all_same = all_same && (left_neighbors[0] == Some(c));
}
else {
left_neighbors.push(None);
@ -602,7 +633,12 @@ impl EmptyVolume {
}
}
if left_elements_num > 0 {
reference.borrow_mut().neighbor_left = left_neighbors;
if all_same {
reference.borrow_mut().neighbor_left = vec![left_neighbors[0].clone()];
}
else {
reference.borrow_mut().neighbor_left = left_neighbors;
}
}
else {
reference.borrow_mut().neighbor_left = vec![None];
@ -611,11 +647,13 @@ impl EmptyVolume {
// MARK: right face of the volume
let mut right_neighbors = vec![];
let mut right_elements_num = 0;
let mut all_same = true;
for y in 0..reference.borrow().size_y {
for z in 0..reference.borrow().size_z {
if let Some(c) = neighbors.get_element(x_max_pos, reference.borrow().position.y + y, reference.borrow().position.z + z) {
right_elements_num += 1;
right_neighbors.push(Some(c.clone()));
all_same = all_same && (right_neighbors[0] == Some(c));
}
else {
right_neighbors.push(None);
@ -623,7 +661,12 @@ impl EmptyVolume {
}
}
if right_elements_num > 0 {
reference.borrow_mut().neighbor_right = right_neighbors;
if all_same {
reference.borrow_mut().neighbor_right = vec![right_neighbors[0].clone()];
}
else {
reference.borrow_mut().neighbor_right = right_neighbors;
}
}
else {
reference.borrow_mut().neighbor_right = vec![None];
@ -1151,4 +1194,13 @@ impl EmptyVolume {
}
out_index
}
}
impl PartialEq for EmptyVolume {
fn eq(&self, other: &Self) -> bool {
self.position == other.position
&& self.size_x == other.size_x
&& self.size_y == other.size_y
&& self.size_z == other.size_z
}
}