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