diff --git a/src/scene/empty_volume.rs b/src/scene/empty_volume.rs index db02694..50961dc 100644 --- a/src/scene/empty_volume.rs +++ b/src/scene/empty_volume.rs @@ -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 + } } \ No newline at end of file