Cull interior voxels from gpu brickmap upload
This commit is contained in:
parent
12cde87246
commit
a4179fa307
|
@ -186,29 +186,68 @@ impl BrickmapManager {
|
||||||
if chunk_idx % 3 == 0 || chunk_idx % 5 == 0 || chunk_idx % 7 == 0 {
|
if chunk_idx % 3 == 0 || chunk_idx % 5 == 0 || chunk_idx % 7 == 0 {
|
||||||
self.update_brickgrid_element(context, chunk_idx, 0)
|
self.update_brickgrid_element(context, chunk_idx, 0)
|
||||||
} else {
|
} else {
|
||||||
// Build the voxel data
|
// Generate full data
|
||||||
let mut bitmask_data = [0xFFFFFFFF as u32; 16];
|
let mut chunk = [(false, 0u32); 512];
|
||||||
let mut albedo_data = Vec::<u32>::new();
|
|
||||||
for z in 0..8 {
|
for z in 0..8 {
|
||||||
let mut entry = 0u64;
|
|
||||||
for y in 0..8 {
|
for y in 0..8 {
|
||||||
for x in 0..8 {
|
for x in 0..8 {
|
||||||
let idx = x + y * 8;
|
let idx = (x + y * 8 + z * 8 * 8) as usize;
|
||||||
|
|
||||||
|
// Just checks if the point is in the sphere
|
||||||
let pos = glam::vec3(x as f32, y as f32, z as f32);
|
let pos = glam::vec3(x as f32, y as f32, z as f32);
|
||||||
if (pos - sphere_center).length_squared() <= sphere_r2 {
|
if (pos - sphere_center).length_squared() <= sphere_r2 {
|
||||||
entry += 1 << idx;
|
// Pack the local position as a colour
|
||||||
let mut albedo = 0u32;
|
let mut albedo = 0u32;
|
||||||
albedo += ((x + 1) * 32 - 1) << 24;
|
albedo += ((x + 1) * 32 - 1) << 24;
|
||||||
albedo += ((y + 1) * 32 - 1) << 16;
|
albedo += ((y + 1) * 32 - 1) << 16;
|
||||||
albedo += ((z + 1) * 32 - 1) << 8;
|
albedo += ((z + 1) * 32 - 1) << 8;
|
||||||
albedo += 255;
|
albedo += 255;
|
||||||
albedo_data.push(albedo);
|
chunk[idx] = (true, albedo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bitmask_data[2 * z as usize] = (entry & 0xFFFFFFFF).try_into().unwrap();
|
}
|
||||||
bitmask_data[2 * z as usize + 1] =
|
|
||||||
((entry >> 32) & 0xFFFFFFFF).try_into().unwrap();
|
// Cull interior voxels
|
||||||
|
let mut bitmask_data = [0xFFFFFFFF as u32; 16];
|
||||||
|
let mut albedo_data = Vec::<u32>::new();
|
||||||
|
for z in 0..8 {
|
||||||
|
// Each z level contains two bitmask segments of voxels
|
||||||
|
let mut entry = 0u64;
|
||||||
|
for y in 0..8 {
|
||||||
|
for x in 0..8 {
|
||||||
|
// Ignore non-solids
|
||||||
|
let idx = x + y * 8 + z * 8 * 8;
|
||||||
|
if !chunk[idx].0 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A voxel is on the surface if at least one of it's
|
||||||
|
// cardinal neighbours is non-solid. Also for simplicity if
|
||||||
|
// it's on the edge of the chunk
|
||||||
|
let surface_voxel: bool;
|
||||||
|
if x == 0 || x == 7 || y == 0 || y == 7 || z == 0 || z == 7 {
|
||||||
|
surface_voxel = true;
|
||||||
|
} else {
|
||||||
|
surface_voxel = !(chunk[idx + 1].0
|
||||||
|
&& chunk[idx - 1].0
|
||||||
|
&& chunk[idx + 8].0
|
||||||
|
&& chunk[idx - 8].0
|
||||||
|
&& chunk[idx + 64].0
|
||||||
|
&& chunk[idx - 64].0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the appropriate bit in the z entry and add the shading
|
||||||
|
// data
|
||||||
|
if surface_voxel {
|
||||||
|
entry += 1 << (x + y * 8);
|
||||||
|
albedo_data.push(chunk[idx].1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let offset = 2 * z as usize;
|
||||||
|
bitmask_data[offset] = (entry & 0xFFFFFFFF).try_into().unwrap();
|
||||||
|
bitmask_data[offset + 1] = ((entry >> 32) & 0xFFFFFFFF).try_into().unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the brickgrid index
|
// Update the brickgrid index
|
||||||
|
|
Loading…
Reference in New Issue