Start work on brickgrids
This commit is contained in:
parent
4091686b09
commit
2555ec55b4
|
@ -1,8 +1,9 @@
|
|||
@group(0) @binding(0) var output: texture_storage_2d<rgba8unorm, write>;
|
||||
@group(0) @binding(1) var<uniform> world_state: WorldState;
|
||||
@group(0) @binding(2) var<storage, read> brickmap_cache: array<Brickmap>;
|
||||
@group(0) @binding(3) var<storage, read> shading_table: array<ShadingElement>;
|
||||
@group(0) @binding(4) var<uniform> camera: Camera;
|
||||
@group(0) @binding(2) var<storage, read> brickgrid: array<u32>;
|
||||
@group(0) @binding(3) var<storage, read> brickmap_cache: array<Brickmap>;
|
||||
@group(0) @binding(4) var<storage, read> shading_table: array<ShadingElement>;
|
||||
@group(0) @binding(5) var<uniform> camera: Camera;
|
||||
|
||||
struct ShadingElement {
|
||||
albedo: u32,
|
||||
|
@ -75,9 +76,14 @@ fn point_inside_aabb(p: vec3<i32>) -> bool {
|
|||
}
|
||||
|
||||
fn voxel_hit(p: vec3<i32>) -> bool {
|
||||
let brickmap_index = to_1d_index(p / 8, vec3<i32>(world_state.brickmap_cache_dims));
|
||||
let brickgrid_index = to_1d_index(p / 8, vec3<i32>(world_state.brickmap_cache_dims));
|
||||
let brick_ptr = brickgrid[brickgrid_index];
|
||||
if ((brick_ptr & 1u) == 0u){
|
||||
return false;
|
||||
}
|
||||
|
||||
let local_index = to_1d_index(p % 8, vec3<i32>(8));
|
||||
let bitmask_segment = brickmap_cache[brickmap_index].bitmask[local_index / 32u];
|
||||
let bitmask_segment = brickmap_cache[brick_ptr >> 8u].bitmask[local_index / 32u];
|
||||
return (bitmask_segment >> (local_index % 32u) & 1u) != 0u;
|
||||
}
|
||||
|
||||
|
|
|
@ -31,6 +31,8 @@ struct WorldState {
|
|||
pub struct BrickmapManager {
|
||||
state_uniform: WorldState,
|
||||
state_buffer: wgpu::Buffer,
|
||||
brickgrid: Vec<u32>,
|
||||
brickgrid_buffer: wgpu::Buffer,
|
||||
brickmap_cache: Vec<Brickmap>,
|
||||
brickmap_buffer: wgpu::Buffer,
|
||||
shading_table: Vec<u32>,
|
||||
|
@ -45,6 +47,9 @@ impl BrickmapManager {
|
|||
let mut brickmap_cache = Vec::<Brickmap>::with_capacity(32768);
|
||||
brickmap_cache.resize(32768, Brickmap::default());
|
||||
|
||||
let mut brickgrid = Vec::<u32>::with_capacity(32768);
|
||||
brickgrid.resize(brickgrid.capacity(), 0);
|
||||
|
||||
let device = &context.device;
|
||||
let state_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
|
||||
label: None,
|
||||
|
@ -52,6 +57,12 @@ impl BrickmapManager {
|
|||
usage: wgpu::BufferUsages::UNIFORM,
|
||||
});
|
||||
|
||||
let brickgrid_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
|
||||
label: None,
|
||||
contents: bytemuck::cast_slice(&brickgrid),
|
||||
usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST,
|
||||
});
|
||||
|
||||
let brickmap_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
|
||||
label: None,
|
||||
contents: bytemuck::cast_slice(&brickmap_cache),
|
||||
|
@ -70,6 +81,8 @@ impl BrickmapManager {
|
|||
Self {
|
||||
state_uniform,
|
||||
state_buffer,
|
||||
brickgrid,
|
||||
brickgrid_buffer,
|
||||
brickmap_cache,
|
||||
brickmap_buffer,
|
||||
shading_table,
|
||||
|
@ -83,6 +96,8 @@ impl BrickmapManager {
|
|||
.try_into()
|
||||
.unwrap();
|
||||
let shading_idx = idx * 512;
|
||||
self.brickgrid
|
||||
.splice(idx..idx + 1, [((idx as u32) << 8) + 1]);
|
||||
self.brickmap_cache[idx].bitmask = *data;
|
||||
self.brickmap_cache[idx].shading_table_offset = shading_idx as u32;
|
||||
self.shading_table.splice(
|
||||
|
@ -103,6 +118,15 @@ impl BrickmapManager {
|
|||
0,
|
||||
bytemuck::cast_slice(&self.shading_table),
|
||||
);
|
||||
queue.write_buffer(
|
||||
&self.brickgrid_buffer,
|
||||
0,
|
||||
bytemuck::cast_slice(&self.brickgrid),
|
||||
)
|
||||
}
|
||||
|
||||
pub fn get_brickgrid_buffer(&self) -> &wgpu::Buffer {
|
||||
&self.brickgrid_buffer
|
||||
}
|
||||
|
||||
pub fn get_worldstate_buffer(&self) -> &wgpu::Buffer {
|
||||
|
|
|
@ -64,6 +64,10 @@ impl VoxelRenderer {
|
|||
let sphere_center = glam::vec3(3.5, 3.5, 3.5);
|
||||
let sphere_r2 = u32::pow(4, 2) as f32;
|
||||
for chunk_idx in 0..32768 {
|
||||
if chunk_idx % 3 == 0 || chunk_idx % 5 == 0 || chunk_idx % 7 == 0 {
|
||||
continue;
|
||||
}
|
||||
|
||||
let chunk_pos = glam::uvec3(chunk_idx % 32, (chunk_idx / 32) % 32, chunk_idx / 1024);
|
||||
let mut bitmask_data = [0xFFFFFFFF as u32; 16];
|
||||
let mut albedo_data = Vec::<u32>::new();
|
||||
|
@ -131,6 +135,15 @@ impl VoxelRenderer {
|
|||
},
|
||||
None,
|
||||
)
|
||||
.with_entry(
|
||||
wgpu::ShaderStages::COMPUTE,
|
||||
wgpu::BindingType::Buffer {
|
||||
ty: wgpu::BufferBindingType::Storage { read_only: true },
|
||||
has_dynamic_offset: false,
|
||||
min_binding_size: None,
|
||||
},
|
||||
None,
|
||||
)
|
||||
.with_entry(
|
||||
wgpu::ShaderStages::COMPUTE,
|
||||
wgpu::BindingType::Buffer {
|
||||
|
@ -145,6 +158,7 @@ impl VoxelRenderer {
|
|||
.with_layout(&compute_layout)
|
||||
.with_entry(wgpu::BindingResource::TextureView(&render_texture.view))
|
||||
.with_entry(brickmap_manager.get_worldstate_buffer().as_entire_binding())
|
||||
.with_entry(brickmap_manager.get_brickgrid_buffer().as_entire_binding())
|
||||
.with_entry(brickmap_manager.get_brickmap_buffer().as_entire_binding())
|
||||
.with_entry(brickmap_manager.get_shading_buffer().as_entire_binding())
|
||||
.with_entry(camera_controller.get_buffer().as_entire_binding())
|
||||
|
|
Loading…
Reference in New Issue