memory optimization of neighborhood for empty volumes
This commit is contained in:
parent
1d4b31c142
commit
f0fa28bdd8
1 changed files with 62 additions and 10 deletions
|
@ -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
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue