transparency first version

This commit is contained in:
zomseffen 2025-01-30 11:03:30 +01:00
parent f0fa28bdd8
commit 66902df99c
14 changed files with 225 additions and 92 deletions
src/scene

View file

@ -7,7 +7,7 @@ use crate::primitives::cube::Cube;
extern crate rand;
pub const CHUNK_SIZE_EXPONENT: u32 = 8;
pub const CHUNK_SIZE_EXPONENT: u32 = 6;
pub const CHUNK_SIZE: usize = (2 as usize).pow(CHUNK_SIZE_EXPONENT);
pub const MAX_TREE_DEPTH: usize = CHUNK_SIZE_EXPONENT as usize - 2;
pub const MIN_CHUNK_SIZE: usize = CHUNK_SIZE / (2 as usize).pow(MAX_TREE_DEPTH as u32);
@ -378,13 +378,13 @@ impl<T: Clone> OctTree<T> {
}
}
pub fn test_element(&self, x: usize, y: usize, z: usize) -> (bool, usize, (usize, usize, usize)) {
pub fn test_element(&self, x: usize, y: usize, z: usize) -> (bool, usize, (usize, usize, usize), Option<T>) {
self.test_element_internal(x, y, z, 0, 0, 0)
}
fn test_element_internal(&self, x: usize, y: usize, z: usize, node_start_x: usize, node_start_y: usize, node_start_z: usize) -> (bool, usize, (usize, usize, usize)) {
fn test_element_internal(&self, x: usize, y: usize, z: usize, node_start_x: usize, node_start_y: usize, node_start_z: usize) -> (bool, usize, (usize, usize, usize), Option<T>) {
if x >= self.size || y >= self.size || z >= self.size {
return (false, 0, (0, 0, 0))
return (false, 0, (0, 0, 0), None)
}
if self.size > MIN_CHUNK_SIZE {
@ -396,7 +396,7 @@ impl<T: Clone> OctTree<T> {
Some(child) => {
child.borrow().test_element_internal(x - mid_point, y - mid_point, z - mid_point, node_start_x + mid_point, node_start_y + mid_point, node_start_z + mid_point)
},
None => (false, mid_point, (node_start_x + mid_point, node_start_y + mid_point, node_start_z + mid_point))
None => (false, mid_point, (node_start_x + mid_point, node_start_y + mid_point, node_start_z + mid_point), None)
}
}
else {
@ -404,7 +404,7 @@ impl<T: Clone> OctTree<T> {
Some(child) => {
child.borrow().test_element_internal( x - mid_point, y - mid_point, z, node_start_x + mid_point, node_start_y + mid_point, node_start_z)
},
None => (false, mid_point, (node_start_x + mid_point, node_start_y + mid_point, node_start_z))
None => (false, mid_point, (node_start_x + mid_point, node_start_y + mid_point, node_start_z), None)
}
}
}
@ -414,7 +414,7 @@ impl<T: Clone> OctTree<T> {
Some(child) => {
child.borrow().test_element_internal(x - mid_point, y, z - mid_point, node_start_x + mid_point, node_start_y, node_start_z + mid_point)
},
None => (false, mid_point, (node_start_x + mid_point, node_start_y, node_start_z + mid_point))
None => (false, mid_point, (node_start_x + mid_point, node_start_y, node_start_z + mid_point), None)
}
}
else {
@ -422,7 +422,7 @@ impl<T: Clone> OctTree<T> {
Some(child) => {
child.borrow().test_element_internal(x - mid_point, y, z, node_start_x + mid_point, node_start_y, node_start_z)
},
None => (false, mid_point, (node_start_x + mid_point, node_start_y, node_start_z))
None => (false, mid_point, (node_start_x + mid_point, node_start_y, node_start_z), None)
}
}
}
@ -434,7 +434,7 @@ impl<T: Clone> OctTree<T> {
Some(child) => {
child.borrow().test_element_internal(x, y - mid_point, z - mid_point, node_start_x, node_start_y + mid_point, node_start_z + mid_point)
},
None => (false, mid_point, (node_start_x, node_start_y + mid_point, node_start_z + mid_point))
None => (false, mid_point, (node_start_x, node_start_y + mid_point, node_start_z + mid_point), None)
}
}
else {
@ -442,7 +442,7 @@ impl<T: Clone> OctTree<T> {
Some(child) => {
child.borrow().test_element_internal(x, y - mid_point, z, node_start_x, node_start_y + mid_point, node_start_z)
},
None => (false, mid_point, (node_start_x, node_start_y + mid_point, node_start_z))
None => (false, mid_point, (node_start_x, node_start_y + mid_point, node_start_z), None)
}
}
}
@ -452,7 +452,7 @@ impl<T: Clone> OctTree<T> {
Some(child) => {
child.borrow().test_element_internal(x, y, z - mid_point, node_start_x, node_start_y, node_start_z + mid_point)
},
None => (false, mid_point, (node_start_x, node_start_y, node_start_z + mid_point))
None => (false, mid_point, (node_start_x, node_start_y, node_start_z + mid_point), None)
}
}
else {
@ -460,18 +460,18 @@ impl<T: Clone> OctTree<T> {
Some(child) => {
child.borrow().test_element_internal(x, y, z, node_start_x, node_start_y, node_start_z)
},
None => (false, mid_point, (node_start_x , node_start_y, node_start_z))
None => (false, mid_point, (node_start_x , node_start_y, node_start_z), None)
}
}
}
}
}
else {
if let Some(_) = self.blocks[z * MIN_CHUNK_SIZE * MIN_CHUNK_SIZE + y * MIN_CHUNK_SIZE + x] {
(true, 1, (x, y, z))
if let Some(c) = &self.blocks[z * MIN_CHUNK_SIZE * MIN_CHUNK_SIZE + y * MIN_CHUNK_SIZE + x] {
(true, 1, (x, y, z), Some(c.clone()))
}
else {
(false, 1, (x, y, z))
(false, 1, (x, y, z), None)
}
}
}