From 124e724499cbe12ab1081f20bbe0ab6dfbf0f1f9 Mon Sep 17 00:00:00 2001 From: qhdwight Date: Sun, 30 Apr 2023 03:03:13 -0400 Subject: [PATCH 1/3] Use shared memory (workgroup) to speed up? --- Cargo.lock | 29 +++- Cargo.toml | 4 +- assets/shaders/voxels.wgsl | 285 ++++++++++++++++++++----------------- src/main.rs | 7 +- src/qgame/input.rs | 4 +- src/qgame/inventory.rs | 2 +- src/qgame/lookup.rs | 37 +---- src/qgame/voxel.rs | 33 ++--- 8 files changed, 205 insertions(+), 196 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3967650..ebd7d90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2840,6 +2840,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4" +dependencies = [ + "serde", +] + [[package]] name = "sharded-slab" version = "0.1.4" @@ -3034,11 +3043,14 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "toml" -version = "0.5.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21" dependencies = [ "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", ] [[package]] @@ -3046,14 +3058,19 @@ name = "toml_datetime" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" -version = "0.19.5" +version = "0.19.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7082a95d48029677a28f181e5f6422d0c8339ad8396a39d3f33d62a90c1f6c30" +checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" dependencies = [ "indexmap", + "serde", + "serde_spanned", "toml_datetime", "winnow", ] @@ -3623,9 +3640,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.3.5" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee7b2c67f962bf5042bfd8b6a916178df33a26eec343ae064cb8e069f638fa6f" +checksum = "5617da7e1f97bf363947d767b91aaf3c2bbc19db7fda9c65af1278713d58e0a2" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index 583ff11..79acac1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,14 +10,14 @@ bevy = { version = "0.10.0", features = ["serialize"] } bevy_rapier3d = { version = "0.21.0", features = ["enhanced-determinism", "debug-render"] } bytemuck = "1.7" ron = "0.8.0" -toml = "0.5.9" +toml = "0.7.3" flagset = "0.4.3" serde = "1.0.149" smartstring = { version = "1.0.1", features = ["serde"] } wgpu = "0.15.0" [profile.dev] -opt-level = 1 +opt-level = 0 [profile.dev.package."*"] opt-level = 3 diff --git a/assets/shaders/voxels.wgsl b/assets/shaders/voxels.wgsl index 374e544..1f8edc5 100644 --- a/assets/shaders/voxels.wgsl +++ b/assets/shaders/voxels.wgsl @@ -37,29 +37,25 @@ struct TriangleTable { }; @group(0) @binding(0) -var uniform_edge_table: EdgeTable; - +var triangle_table: TriangleTable; @group(0) @binding(1) -var uniform_tri_table: TriangleTable; - -@group(0) @binding(2) var in_voxels: VoxelBuffer; - +@group(0) @binding(2) +var out_atomics: Atomics; @group(0) @binding(3) -var global_atomics: Atomics; - -@group(0) @binding(4) var out_vertices: VertexBuffer; - -@group(0) @binding(5) +@group(0) @binding(4) var out_normals: NormalBuffer; - -@group(0) @binding(6) +@group(0) @binding(5) var out_indices: IndexBuffer; - -@group(0) @binding(7) +@group(0) @binding(6) var out_uvs: UvBuffer; +var workgroup_atomics: Atomics; +var workgroup_vertices: array, 2048>; +var workgroup_normals: array, 2048>; +var workgroup_indices: array; +var workgroup_uvs: array, 2048>; const chunk_sz = 32; @@ -82,106 +78,101 @@ fn interp_vertex(p1: vec3, p2: vec3, v1: f32, v2: f32) -> vec3 { return p1 + mu * (p2 - p1); } -@compute @workgroup_size(8, 8, 8) -fn main(@builtin(global_invocation_id) invocation_id: vec3) { +@workgroup_size(8, 8, 8) +@compute fn main(@builtin(global_invocation_id) invocation_index: vec3, + @builtin(local_invocation_index) workgroup_index: u32) { + + if (workgroup_index == 0u) { + atomicStore(&workgroup_atomics.vertices_head, 0u); + atomicStore(&workgroup_atomics.indices_head, 0u); + } + + workgroupBarrier(); - let pos = vec3(invocation_id); + let pos = vec3(invocation_index); let voxel = in_voxels.data[get_flat_index(pos)]; if (voxel.flags == 0u) { - let smooth_adj_offsets = array, 8>( - vec3(0, 0, 1), - vec3(1, 0, 1), - vec3(1, 0, 0), - vec3(0, 0, 0), - vec3(0, 1, 1), - vec3(1, 1, 1), - vec3(1, 1, 0), - vec3(0, 1, 0) - ); - - var cube_idx: u32 = 0u; - var orient: u32 = 0u; + var cube_index: u32 = 0u; let positions = array, 8>( - vec3(pos + smooth_adj_offsets[0u]), - vec3(pos + smooth_adj_offsets[1u]), - vec3(pos + smooth_adj_offsets[2u]), - vec3(pos + smooth_adj_offsets[3u]), - vec3(pos + smooth_adj_offsets[4u]), - vec3(pos + smooth_adj_offsets[5u]), - vec3(pos + smooth_adj_offsets[6u]), - vec3(pos + smooth_adj_offsets[7u]), + vec3(pos + vec3(0, 0, 1)), + vec3(pos + vec3(1, 0, 1)), + vec3(pos + vec3(1, 0, 0)), + vec3(pos + vec3(0, 0, 0)), + vec3(pos + vec3(0, 1, 1)), + vec3(pos + vec3(1, 1, 1)), + vec3(pos + vec3(1, 1, 0)), + vec3(pos + vec3(0, 1, 0)), ); let densities = array( - get_voxel_density(pos + smooth_adj_offsets[0u]), - get_voxel_density(pos + smooth_adj_offsets[1u]), - get_voxel_density(pos + smooth_adj_offsets[2u]), - get_voxel_density(pos + smooth_adj_offsets[3u]), - get_voxel_density(pos + smooth_adj_offsets[4u]), - get_voxel_density(pos + smooth_adj_offsets[5u]), - get_voxel_density(pos + smooth_adj_offsets[6u]), - get_voxel_density(pos + smooth_adj_offsets[7u]), - ); - cube_idx = cube_idx | u32(densities[0u] < 0.5) * (1u << 0u); - cube_idx = cube_idx | u32(densities[1u] < 0.5) * (1u << 1u); - cube_idx = cube_idx | u32(densities[2u] < 0.5) * (1u << 2u); - cube_idx = cube_idx | u32(densities[3u] < 0.5) * (1u << 3u); - cube_idx = cube_idx | u32(densities[4u] < 0.5) * (1u << 4u); - cube_idx = cube_idx | u32(densities[5u] < 0.5) * (1u << 5u); - cube_idx = cube_idx | u32(densities[6u] < 0.5) * (1u << 6u); - cube_idx = cube_idx | u32(densities[7u] < 0.5) * (1u << 7u); - - if (cube_idx == 0x00u || cube_idx == 0xffu) { - return; - } - - var vertices = array, 12>( - f32((uniform_edge_table.data[cube_idx] & (1u << 0u)) != 0u) * interp_vertex(positions[0u], positions[1u], densities[0u], densities[1u]), - f32((uniform_edge_table.data[cube_idx] & (1u << 1u)) != 0u) * interp_vertex(positions[1u], positions[2u], densities[1u], densities[2u]), - f32((uniform_edge_table.data[cube_idx] & (1u << 2u)) != 0u) * interp_vertex(positions[2u], positions[3u], densities[2u], densities[3u]), - f32((uniform_edge_table.data[cube_idx] & (1u << 3u)) != 0u) * interp_vertex(positions[3u], positions[0u], densities[3u], densities[0u]), - f32((uniform_edge_table.data[cube_idx] & (1u << 4u)) != 0u) * interp_vertex(positions[4u], positions[5u], densities[4u], densities[5u]), - f32((uniform_edge_table.data[cube_idx] & (1u << 5u)) != 0u) * interp_vertex(positions[5u], positions[6u], densities[5u], densities[6u]), - f32((uniform_edge_table.data[cube_idx] & (1u << 6u)) != 0u) * interp_vertex(positions[6u], positions[7u], densities[6u], densities[7u]), - f32((uniform_edge_table.data[cube_idx] & (1u << 7u)) != 0u) * interp_vertex(positions[7u], positions[4u], densities[7u], densities[4u]), - f32((uniform_edge_table.data[cube_idx] & (1u << 8u)) != 0u) * interp_vertex(positions[0u], positions[4u], densities[0u], densities[4u]), - f32((uniform_edge_table.data[cube_idx] & (1u << 9u)) != 0u) * interp_vertex(positions[1u], positions[5u], densities[1u], densities[5u]), - f32((uniform_edge_table.data[cube_idx] & (1u << 10u)) != 0u) * interp_vertex(positions[2u], positions[6u], densities[2u], densities[6u]), - f32((uniform_edge_table.data[cube_idx] & (1u << 11u)) != 0u) * interp_vertex(positions[3u], positions[7u], densities[3u], densities[7u]), + get_voxel_density(pos + vec3(0, 0, 1)), + get_voxel_density(pos + vec3(1, 0, 1)), + get_voxel_density(pos + vec3(1, 0, 0)), + get_voxel_density(pos + vec3(0, 0, 0)), + get_voxel_density(pos + vec3(0, 1, 1)), + get_voxel_density(pos + vec3(1, 1, 1)), + get_voxel_density(pos + vec3(1, 1, 0)), + get_voxel_density(pos + vec3(0, 1, 0)), ); - - var tri_idx: u32 = 0u; - loop { - var start_vert_idx = atomicAdd(&global_atomics.vertices_head, 3u); - var start_indices_idx = atomicAdd(&global_atomics.indices_head, 3u); - - let v0 = vertices[ uniform_tri_table.data[cube_idx][tri_idx + 0u] ]; - let v1 = vertices[ uniform_tri_table.data[cube_idx][tri_idx + 1u] ]; - let v2 = vertices[ uniform_tri_table.data[cube_idx][tri_idx + 2u] ]; - - out_vertices.data[start_vert_idx + 0u] = v0; - out_vertices.data[start_vert_idx + 1u] = v1; - out_vertices.data[start_vert_idx + 2u] = v2; - - out_indices.data[start_indices_idx + 0u] = start_vert_idx + 0u; - out_indices.data[start_indices_idx + 1u] = start_vert_idx + 1u; - out_indices.data[start_indices_idx + 2u] = start_vert_idx + 2u; - - let normal = cross(v0 - v1, v0 - v2); - out_normals.data[start_vert_idx + 0u] = normal; - out_normals.data[start_vert_idx + 1u] = normal; - out_normals.data[start_vert_idx + 2u] = normal; - - out_uvs.data[start_vert_idx + 0u] = vec2(0.0, 0.0); - out_uvs.data[start_vert_idx + 1u] = vec2(1.0, 0.0); - out_uvs.data[start_vert_idx + 2u] = vec2(0.0, 1.0); - - tri_idx = tri_idx + 3u; - if (uniform_tri_table.data[cube_idx][tri_idx] == -1) { - break; + cube_index |= u32(densities[0u] < 0.5) * (1u << 0u); + cube_index |= u32(densities[1u] < 0.5) * (1u << 1u); + cube_index |= u32(densities[2u] < 0.5) * (1u << 2u); + cube_index |= u32(densities[3u] < 0.5) * (1u << 3u); + cube_index |= u32(densities[4u] < 0.5) * (1u << 4u); + cube_index |= u32(densities[5u] < 0.5) * (1u << 5u); + cube_index |= u32(densities[6u] < 0.5) * (1u << 6u); + cube_index |= u32(densities[7u] < 0.5) * (1u << 7u); + + if (cube_index > 0x00u && cube_index < 0xffu) { + var vertices = array, 12>( + interp_vertex(positions[0u], positions[1u], densities[0u], densities[1u]), + interp_vertex(positions[1u], positions[2u], densities[1u], densities[2u]), + interp_vertex(positions[2u], positions[3u], densities[2u], densities[3u]), + interp_vertex(positions[3u], positions[0u], densities[3u], densities[0u]), + interp_vertex(positions[4u], positions[5u], densities[4u], densities[5u]), + interp_vertex(positions[5u], positions[6u], densities[5u], densities[6u]), + interp_vertex(positions[6u], positions[7u], densities[6u], densities[7u]), + interp_vertex(positions[7u], positions[4u], densities[7u], densities[4u]), + interp_vertex(positions[0u], positions[4u], densities[0u], densities[4u]), + interp_vertex(positions[1u], positions[5u], densities[1u], densities[5u]), + interp_vertex(positions[2u], positions[6u], densities[2u], densities[6u]), + interp_vertex(positions[3u], positions[7u], densities[3u], densities[7u]), + ); + + var triangle_index: u32 = 0u; + loop { + let start_vertex_index = atomicAdd(&workgroup_atomics.vertices_head, 3u); + let start_indices_index = atomicAdd(&workgroup_atomics.indices_head, 3u); + + let v0 = vertices[triangle_table.data[cube_index][triangle_index + 0u]]; + let v1 = vertices[triangle_table.data[cube_index][triangle_index + 1u]]; + let v2 = vertices[triangle_table.data[cube_index][triangle_index + 2u]]; + + workgroup_vertices[start_vertex_index + 0u] = v0; + workgroup_vertices[start_vertex_index + 1u] = v1; + workgroup_vertices[start_vertex_index + 2u] = v2; + + workgroup_indices[start_indices_index + 0u] = start_vertex_index + 0u; + workgroup_indices[start_indices_index + 1u] = start_vertex_index + 1u; + workgroup_indices[start_indices_index + 2u] = start_vertex_index + 2u; + + let normal = normalize(cross(v1 - v0, v2 - v0)); + workgroup_normals[start_vertex_index + 0u] = normal; + workgroup_normals[start_vertex_index + 1u] = normal; + workgroup_normals[start_vertex_index + 2u] = normal; + + workgroup_uvs[start_vertex_index + 0u] = vec2(0.0, 0.0); + workgroup_uvs[start_vertex_index + 1u] = vec2(1.0, 0.0); + workgroup_uvs[start_vertex_index + 2u] = vec2(0.0, 1.0); + + triangle_index += 3u; + if (triangle_table.data[cube_index][triangle_index] == -1) { + break; + } } } + } else { var block_faces = array, 4>, 6>( @@ -237,44 +228,82 @@ fn main(@builtin(global_invocation_id) invocation_id: vec3) { let adj_density = get_voxel_density(pos); if (adj_density < 0.5) { - var pos = vec3(invocation_id); + var pos = vec3(invocation_index); - let start_vert_idx = atomicAdd(&global_atomics.vertices_head, 4u); - let start_indices_idx = atomicAdd(&global_atomics.indices_head, 6u); + let start_vertex_index = atomicAdd(&out_atomics.vertices_head, 4u); + let start_indices_index = atomicAdd(&out_atomics.indices_head, 6u); let v0 = block_faces[dir][0u]; let v1 = block_faces[dir][1u]; let v2 = block_faces[dir][2u]; let v3 = block_faces[dir][3u]; - out_vertices.data[start_vert_idx + 0u] = pos + v0; - out_vertices.data[start_vert_idx + 1u] = pos + v1; - out_vertices.data[start_vert_idx + 2u] = pos + v2; - out_vertices.data[start_vert_idx + 3u] = pos + v3; + out_vertices.data[start_vertex_index + 0u] = pos + v0; + out_vertices.data[start_vertex_index + 1u] = pos + v1; + out_vertices.data[start_vertex_index + 2u] = pos + v2; + out_vertices.data[start_vertex_index + 3u] = pos + v3; let normal = cross(v0 - v1, v0 - v2); - out_normals.data[start_vert_idx + 0u] = normal; - out_normals.data[start_vert_idx + 1u] = normal; - out_normals.data[start_vert_idx + 2u] = normal; - out_normals.data[start_vert_idx + 3u] = normal; - - out_uvs.data[start_vert_idx + 0u] = vec2(0.0, 0.0); - out_uvs.data[start_vert_idx + 1u] = vec2(1.0, 0.0); - out_uvs.data[start_vert_idx + 2u] = vec2(1.0, 1.0); - out_uvs.data[start_vert_idx + 3u] = vec2(0.0, 1.0); - - out_indices.data[start_indices_idx + 0u] = start_vert_idx + 0u; - out_indices.data[start_indices_idx + 1u] = start_vert_idx + 1u; - out_indices.data[start_indices_idx + 2u] = start_vert_idx + 2u; - out_indices.data[start_indices_idx + 3u] = start_vert_idx + 0u; - out_indices.data[start_indices_idx + 4u] = start_vert_idx + 2u; - out_indices.data[start_indices_idx + 5u] = start_vert_idx + 3u; + out_normals.data[start_vertex_index + 0u] = normal; + out_normals.data[start_vertex_index + 1u] = normal; + out_normals.data[start_vertex_index + 2u] = normal; + out_normals.data[start_vertex_index + 3u] = normal; + + out_uvs.data[start_vertex_index + 0u] = vec2(0.0, 0.0); + out_uvs.data[start_vertex_index + 1u] = vec2(1.0, 0.0); + out_uvs.data[start_vertex_index + 2u] = vec2(1.0, 1.0); + out_uvs.data[start_vertex_index + 3u] = vec2(0.0, 1.0); + + out_indices.data[start_indices_index + 0u] = start_vertex_index + 0u; + out_indices.data[start_indices_index + 1u] = start_vertex_index + 1u; + out_indices.data[start_indices_index + 2u] = start_vertex_index + 2u; + out_indices.data[start_indices_index + 3u] = start_vertex_index + 0u; + out_indices.data[start_indices_index + 4u] = start_vertex_index + 2u; + out_indices.data[start_indices_index + 5u] = start_vertex_index + 3u; } - dir = dir + 1u; + dir += 1u; if (dir >= 6u) { break; } } } + + workgroupBarrier(); + + if (workgroup_index == 0u) { + let start_vertex_index = atomicAdd(&out_atomics.vertices_head, workgroup_atomics.vertices_head); + var vertex_index: u32 = 0u; + loop { + let out_index = start_vertex_index + vertex_index; + out_vertices.data[out_index + 0u] = workgroup_vertices[vertex_index + 0u]; + out_vertices.data[out_index + 1u] = workgroup_vertices[vertex_index + 1u]; + out_vertices.data[out_index + 2u] = workgroup_vertices[vertex_index + 2u]; + out_normals.data[out_index + 0u] = workgroup_normals[vertex_index + 0u]; + out_normals.data[out_index + 1u] = workgroup_normals[vertex_index + 1u]; + out_normals.data[out_index + 2u] = workgroup_normals[vertex_index + 2u]; + out_uvs.data[out_index + 0u] = workgroup_uvs[vertex_index + 0u]; + out_uvs.data[out_index + 1u] = workgroup_uvs[vertex_index + 1u]; + out_uvs.data[out_index + 2u] = workgroup_uvs[vertex_index + 2u]; + + vertex_index += 3u; + if (vertex_index >= workgroup_atomics.vertices_head) { + break; + } + } + + let start_indices_index = atomicAdd(&out_atomics.indices_head, workgroup_atomics.indices_head); + var index_index: u32 = 0u; + loop { + let out_index = start_indices_index + index_index; + out_indices.data[out_index + 0u] = start_vertex_index + workgroup_indices[index_index + 0u]; + out_indices.data[out_index + 1u] = start_vertex_index + workgroup_indices[index_index + 1u]; + out_indices.data[out_index + 2u] = start_vertex_index + workgroup_indices[index_index + 2u]; + + index_index += 3u; + if (index_index >= workgroup_atomics.indices_head) { + break; + } + } + } } diff --git a/src/main.rs b/src/main.rs index ce3d946..dfbab65 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,6 +14,7 @@ use bevy::{ render_resource::*, }, }; +use bevy::render::view::NoFrustumCulling; use bevy_rapier3d::prelude::*; use qgame::*; @@ -52,7 +53,7 @@ fn main() { ..default() }) .add_plugin(RapierPhysicsPlugin::::default()) - .add_plugin(RapierDebugRenderPlugin::default()) + // .add_plugin(RapierDebugRenderPlugin::default()) .add_plugin(VoxelsPlugin) .add_plugin(FrameTimeDiagnosticsPlugin::default()) .add_plugin(InventoryPlugin) @@ -213,6 +214,7 @@ fn spawn_voxel_sys( commands.spawn(Map::default()); commands.spawn(( Chunk::new(IVec3::ZERO), + NoFrustumCulling, PbrBundle { mesh: mesh_handle.clone(), material: ground_mat_handle.clone(), @@ -254,8 +256,7 @@ fn spawn_player_sys(mut commands: Commands) { pub struct Buffers { // Place edge table and triangle table in uniform buffer // They are too large to have inline in the shader - edge_table: Buffer, - tri_table: Buffer, + triangle_table: Buffer, points: BufVec, heights: BufVec, voxels: Buffer, diff --git a/src/qgame/input.rs b/src/qgame/input.rs index 4e8baf9..9da9aac 100644 --- a/src/qgame/input.rs +++ b/src/qgame/input.rs @@ -6,8 +6,8 @@ use bevy::{ prelude::*, reflect::TypeUuid, utils::BoxedFuture, + window::CursorGrabMode, }; -use bevy::window::CursorGrabMode; use flagset::{flags, FlagSet}; use serde::{Deserialize, Serialize}; @@ -154,7 +154,7 @@ impl AssetLoader for ConfigAssetLoader { load_context: &'a mut LoadContext, ) -> BoxedFuture<'a, Result<(), anyhow::Error>> { Box::pin(async move { - let asset: Config = toml::from_slice(bytes)?; + let asset: Config = toml::from_str(std::str::from_utf8(bytes)?)?; load_context.set_default_asset(LoadedAsset::new(asset)); Ok(()) }) diff --git a/src/qgame/inventory.rs b/src/qgame/inventory.rs index 7ec2d15..5e5251b 100644 --- a/src/qgame/inventory.rs +++ b/src/qgame/inventory.rs @@ -114,7 +114,7 @@ impl AssetLoader for ConfigAssetLoader { load_context: &'a mut LoadContext, ) -> BoxedFuture<'a, Result<(), anyhow::Error>> { Box::pin(async move { - let asset: GunProps = toml::from_slice(bytes)?; + let asset: GunProps = toml::from_str(std::str::from_utf8(bytes)?)?; load_context.set_default_asset(LoadedAsset::new(asset)); Ok(()) }) diff --git a/src/qgame/lookup.rs b/src/qgame/lookup.rs index d041a4c..91d80ed 100644 --- a/src/qgame/lookup.rs +++ b/src/qgame/lookup.rs @@ -1,38 +1,3 @@ -pub(crate) const EDGE_TABLE: &'static [u32; 256] = &[ - 0x000, 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c, - 0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00, - 0x190, 0x099, 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c, - 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90, - 0x230, 0x339, 0x033, 0x13a, 0x636, 0x73f, 0x435, 0x53c, - 0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30, - 0x3a0, 0x2a9, 0x1a3, 0x0aa, 0x7a6, 0x6af, 0x5a5, 0x4ac, - 0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0, - 0x460, 0x569, 0x663, 0x76a, 0x066, 0x16f, 0x265, 0x36c, - 0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60, - 0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0x0ff, 0x3f5, 0x2fc, - 0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0, - 0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x055, 0x15c, - 0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950, - 0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0x0cc, - 0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0, - 0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc, - 0x0cc, 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0, - 0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c, - 0x15c, 0x055, 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650, - 0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc, - 0x2fc, 0x3f5, 0x0ff, 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0, - 0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c, - 0x36c, 0x265, 0x16f, 0x066, 0x76a, 0x663, 0x569, 0x460, - 0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac, - 0x4ac, 0x5a5, 0x6af, 0x7a6, 0x0aa, 0x1a3, 0x2a9, 0x3a0, - 0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c, - 0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x033, 0x339, 0x230, - 0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c, - 0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x099, 0x190, - 0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c, - 0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x000 -]; - pub(crate) const TRI_TABLE: &'static [[i32; 16]; 256] = &[ [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], [0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], @@ -291,3 +256,5 @@ pub(crate) const TRI_TABLE: &'static [[i32; 16]; 256] = &[ [0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1] ]; + +// pub (crate) const diff --git a/src/qgame/voxel.rs b/src/qgame/voxel.rs index b3c97d2..56fe8fa 100644 --- a/src/qgame/voxel.rs +++ b/src/qgame/voxel.rs @@ -22,6 +22,7 @@ use crate::*; const CHUNK_SZ: usize = 32; const CHUNK_SZ_2: usize = CHUNK_SZ * CHUNK_SZ; const CHUNK_SZ_3: usize = CHUNK_SZ * CHUNK_SZ * CHUNK_SZ; +const COMPUTE_TILE_SZ: usize = 8; #[derive(Component)] pub struct Chunk { @@ -85,11 +86,6 @@ impl FromWorld for VoxelsPipeline { let render_device = world.get_resource::().unwrap(); let _asset_server = world.get_resource::().unwrap(); - let edge_table = render_device.create_buffer_with_data(&BufferInitDescriptor { - label: Some("edge table buffer"), - contents: cast_slice(EDGE_TABLE), - usage: BufferUsages::STORAGE, - }); let tri_table = render_device.create_buffer_with_data(&BufferInitDescriptor { label: Some("tri table buffer"), contents: cast_slice(TRI_TABLE), @@ -109,10 +105,10 @@ impl FromWorld for VoxelsPipeline { usage: BufferUsages::COPY_DST | BufferUsages::COPY_SRC, mapped_at_creation: false, }); - let vertices: BufVec = BufVec::with_capacity(true, CHUNK_SZ_3 * 4 * 6, render_device); - let uvs: BufVec = BufVec::with_capacity(true, CHUNK_SZ_3 * 4 * 6, render_device); - let normals: BufVec = BufVec::with_capacity(true, CHUNK_SZ_3 * 4 * 6, render_device); - let indices: BufVec = BufVec::with_capacity(true, CHUNK_SZ_3 * 6 * 6, render_device); + let vertices: BufVec = BufVec::with_capacity(true, CHUNK_SZ_3 * 12, render_device); + let uvs: BufVec = BufVec::with_capacity(true, CHUNK_SZ_3 * 12, render_device); + let normals: BufVec = BufVec::with_capacity(true, CHUNK_SZ_3 * 12, render_device); + let indices: BufVec = BufVec::with_capacity(true, CHUNK_SZ_3 * 12, render_device); let atomics: BufVec = BufVec::with_capacity(true, 2, render_device); let atomics_staging = render_device.create_buffer_with_data(&BufferInitDescriptor { label: Some("atomics staging buffer"), @@ -147,7 +143,7 @@ impl FromWorld for VoxelsPipeline { entry_point: "main", }); - world.insert_resource(Buffers { edge_table, tri_table, points, heights, voxels, voxels_staging, vertices, normals, uvs, indices, atomics, atomics_staging }); + world.insert_resource(Buffers { triangle_table: tri_table, points, heights, voxels, voxels_staging, vertices, normals, uvs, indices, atomics, atomics_staging }); VoxelsPipeline { simplex_pipeline, @@ -205,14 +201,13 @@ pub fn voxel_polygonize_system( label: Some("voxels binding"), layout: &pipeline.voxels_pipeline.get_bind_group_layout(0), entries: &[ - BindGroupEntry { binding: 0, resource: buffers.edge_table.as_entire_binding() }, - BindGroupEntry { binding: 1, resource: buffers.tri_table.as_entire_binding() }, - BindGroupEntry { binding: 2, resource: buffers.voxels.as_entire_binding() }, - BindGroupEntry { binding: 3, resource: buffers.atomics.buffer().as_entire_binding() }, - BindGroupEntry { binding: 4, resource: buffers.vertices.buffer().as_entire_binding() }, - BindGroupEntry { binding: 5, resource: buffers.normals.buffer().as_entire_binding() }, - BindGroupEntry { binding: 6, resource: buffers.indices.buffer().as_entire_binding() }, - BindGroupEntry { binding: 7, resource: buffers.uvs.buffer().as_entire_binding() }, + BindGroupEntry { binding: 0, resource: buffers.triangle_table.as_entire_binding() }, + BindGroupEntry { binding: 1, resource: buffers.voxels.as_entire_binding() }, + BindGroupEntry { binding: 2, resource: buffers.atomics.buffer().as_entire_binding() }, + BindGroupEntry { binding: 3, resource: buffers.vertices.buffer().as_entire_binding() }, + BindGroupEntry { binding: 4, resource: buffers.normals.buffer().as_entire_binding() }, + BindGroupEntry { binding: 5, resource: buffers.indices.buffer().as_entire_binding() }, + BindGroupEntry { binding: 6, resource: buffers.uvs.buffer().as_entire_binding() }, ], }), }; @@ -265,7 +260,7 @@ pub fn voxel_polygonize_system( let mut pass = command_encoder.begin_compute_pass(&ComputePassDescriptor::default()); pass.set_pipeline(&pipeline.voxels_pipeline); pass.set_bind_group(0, &binding_groups.voxels, &[]); - let dispatch_size = (CHUNK_SZ / 8) as u32; + let dispatch_size = (CHUNK_SZ / COMPUTE_TILE_SZ) as u32; pass.dispatch_workgroups(dispatch_size, dispatch_size, dispatch_size); } buffers.atomics.encode_read(2, &mut command_encoder); From c77ddc0465ec761676c213010f28d3116b1bcd7b Mon Sep 17 00:00:00 2001 From: qhdwight Date: Sun, 30 Apr 2023 14:07:45 -0400 Subject: [PATCH 2/3] Put block face table as storage buffer --- assets/shaders/voxels.wgsl | 182 ++++++++++++------------------------- src/main.rs | 1 + src/qgame/lookup.rs | 11 ++- src/qgame/voxel.rs | 24 +++-- 4 files changed, 84 insertions(+), 134 deletions(-) diff --git a/assets/shaders/voxels.wgsl b/assets/shaders/voxels.wgsl index 1f8edc5..68922d9 100644 --- a/assets/shaders/voxels.wgsl +++ b/assets/shaders/voxels.wgsl @@ -3,53 +3,27 @@ struct Voxel { density: f32, }; -struct VoxelBuffer { - data: array, -}; - -struct VertexBuffer { - data: array>, -}; - -struct NormalBuffer { - data: array>, -}; - -struct IndexBuffer { - data: array, -}; - -struct UvBuffer { - data: array>, -}; - struct Atomics { vertices_head: atomic, indices_head: atomic, }; -struct EdgeTable { - data: array, -}; - -struct TriangleTable { - data: array, 256>, -}; - @group(0) @binding(0) -var triangle_table: TriangleTable; +var triangle_table: array, 256>; @group(0) @binding(1) -var in_voxels: VoxelBuffer; +var block_faces_table: array, 4>, 6>; @group(0) @binding(2) -var out_atomics: Atomics; +var in_voxels: array; @group(0) @binding(3) -var out_vertices: VertexBuffer; +var out_atomics: Atomics; @group(0) @binding(4) -var out_normals: NormalBuffer; +var out_vertices: array>; @group(0) @binding(5) -var out_indices: IndexBuffer; +var out_normals: array>; @group(0) @binding(6) -var out_uvs: UvBuffer; +var out_indices: array; +@group(0) @binding(7) +var out_uvs: array>; var workgroup_atomics: Atomics; var workgroup_vertices: array, 2048>; @@ -68,7 +42,7 @@ fn get_voxel_density(pos: vec3) -> f32 { if (pos.x >= 0 && pos.x < chunk_sz && pos.y >= 0 && pos.y < chunk_sz && pos.z >= 0 && pos.z < chunk_sz) { - density = in_voxels.data[get_flat_index(pos)].density; + density = in_voxels[get_flat_index(pos)].density; } return density; } @@ -90,7 +64,7 @@ fn interp_vertex(p1: vec3, p2: vec3, v1: f32, v2: f32) -> vec3 { workgroupBarrier(); let pos = vec3(invocation_index); - let voxel = in_voxels.data[get_flat_index(pos)]; + let voxel = in_voxels[get_flat_index(pos)]; if (voxel.flags == 0u) { @@ -145,9 +119,9 @@ fn interp_vertex(p1: vec3, p2: vec3, v1: f32, v2: f32) -> vec3 { let start_vertex_index = atomicAdd(&workgroup_atomics.vertices_head, 3u); let start_indices_index = atomicAdd(&workgroup_atomics.indices_head, 3u); - let v0 = vertices[triangle_table.data[cube_index][triangle_index + 0u]]; - let v1 = vertices[triangle_table.data[cube_index][triangle_index + 1u]]; - let v2 = vertices[triangle_table.data[cube_index][triangle_index + 2u]]; + let v0 = vertices[triangle_table[cube_index][triangle_index + 0u]]; + let v1 = vertices[triangle_table[cube_index][triangle_index + 1u]]; + let v2 = vertices[triangle_table[cube_index][triangle_index + 2u]]; workgroup_vertices[start_vertex_index + 0u] = v0; workgroup_vertices[start_vertex_index + 1u] = v1; @@ -167,7 +141,7 @@ fn interp_vertex(p1: vec3, p2: vec3, v1: f32, v2: f32) -> vec3 { workgroup_uvs[start_vertex_index + 2u] = vec2(0.0, 1.0); triangle_index += 3u; - if (triangle_table.data[cube_index][triangle_index] == -1) { + if (triangle_table[cube_index][triangle_index] == -1) { break; } } @@ -175,45 +149,7 @@ fn interp_vertex(p1: vec3, p2: vec3, v1: f32, v2: f32) -> vec3 { } else { - var block_faces = array, 4>, 6>( - array, 4>( - vec3(0.5, -0.5, -0.5), - vec3(0.5, 0.5, -0.5), - vec3(0.5, 0.5, 0.5), - vec3(0.5, -0.5, 0.5), - ), - array, 4>( - vec3(-0.5, -0.5, 0.5), - vec3(-0.5, 0.5, 0.5), - vec3(-0.5, 0.5, -0.5), - vec3(-0.5, -0.5, -0.5) - ), - array, 4>( - vec3(-0.5, 0.5, 0.5), - vec3( 0.5, 0.5, 0.5), - vec3( 0.5, 0.5, -0.5), - vec3(-0.5, 0.5, -0.5) - ), - array, 4>( - vec3(-0.5, -0.5, -0.5), - vec3( 0.5, -0.5, -0.5), - vec3( 0.5, -0.5, 0.5), - vec3(-0.5, -0.5, 0.5) - ), - array, 4>( - vec3( 0.5, -0.5, 0.5), - vec3( 0.5, 0.5, 0.5), - vec3(-0.5, 0.5, 0.5), - vec3(-0.5, -0.5, 0.5) - ), - array, 4>( - vec3(-0.5, -0.5, -0.5), - vec3(-0.5, 0.5, -0.5), - vec3( 0.5, 0.5, -0.5), - vec3( 0.5, -0.5, -0.5) - ), - ); - var block_adj_offsets = array, 6>( + var block_adjacent_offsets = array, 6>( vec3( 1, 0, 0), vec3(-1, 0, 0), vec3( 0, 1, 0), @@ -224,42 +160,42 @@ fn interp_vertex(p1: vec3, p2: vec3, v1: f32, v2: f32) -> vec3 { var dir: u32 = 0u; loop { - let adj_pos = pos + block_adj_offsets[dir]; + let adj_pos = pos + block_adjacent_offsets[dir]; let adj_density = get_voxel_density(pos); if (adj_density < 0.5) { var pos = vec3(invocation_index); let start_vertex_index = atomicAdd(&out_atomics.vertices_head, 4u); - let start_indices_index = atomicAdd(&out_atomics.indices_head, 6u); + let start_triangle_index = atomicAdd(&out_atomics.indices_head, 6u); - let v0 = block_faces[dir][0u]; - let v1 = block_faces[dir][1u]; - let v2 = block_faces[dir][2u]; - let v3 = block_faces[dir][3u]; + let v0 = block_faces_table[dir][0u]; + let v1 = block_faces_table[dir][1u]; + let v2 = block_faces_table[dir][2u]; + let v3 = block_faces_table[dir][3u]; - out_vertices.data[start_vertex_index + 0u] = pos + v0; - out_vertices.data[start_vertex_index + 1u] = pos + v1; - out_vertices.data[start_vertex_index + 2u] = pos + v2; - out_vertices.data[start_vertex_index + 3u] = pos + v3; + out_vertices[start_vertex_index + 0u] = pos + v0; + out_vertices[start_vertex_index + 1u] = pos + v1; + out_vertices[start_vertex_index + 2u] = pos + v2; + out_vertices[start_vertex_index + 3u] = pos + v3; let normal = cross(v0 - v1, v0 - v2); - out_normals.data[start_vertex_index + 0u] = normal; - out_normals.data[start_vertex_index + 1u] = normal; - out_normals.data[start_vertex_index + 2u] = normal; - out_normals.data[start_vertex_index + 3u] = normal; - - out_uvs.data[start_vertex_index + 0u] = vec2(0.0, 0.0); - out_uvs.data[start_vertex_index + 1u] = vec2(1.0, 0.0); - out_uvs.data[start_vertex_index + 2u] = vec2(1.0, 1.0); - out_uvs.data[start_vertex_index + 3u] = vec2(0.0, 1.0); - - out_indices.data[start_indices_index + 0u] = start_vertex_index + 0u; - out_indices.data[start_indices_index + 1u] = start_vertex_index + 1u; - out_indices.data[start_indices_index + 2u] = start_vertex_index + 2u; - out_indices.data[start_indices_index + 3u] = start_vertex_index + 0u; - out_indices.data[start_indices_index + 4u] = start_vertex_index + 2u; - out_indices.data[start_indices_index + 5u] = start_vertex_index + 3u; + out_normals[start_vertex_index + 0u] = normal; + out_normals[start_vertex_index + 1u] = normal; + out_normals[start_vertex_index + 2u] = normal; + out_normals[start_vertex_index + 3u] = normal; + + out_uvs[start_vertex_index + 0u] = vec2(0.0, 0.0); + out_uvs[start_vertex_index + 1u] = vec2(1.0, 0.0); + out_uvs[start_vertex_index + 2u] = vec2(1.0, 1.0); + out_uvs[start_vertex_index + 3u] = vec2(0.0, 1.0); + + out_indices[start_triangle_index + 0u] = start_vertex_index + 0u; + out_indices[start_triangle_index + 1u] = start_vertex_index + 1u; + out_indices[start_triangle_index + 2u] = start_vertex_index + 2u; + out_indices[start_triangle_index + 3u] = start_vertex_index + 0u; + out_indices[start_triangle_index + 4u] = start_vertex_index + 2u; + out_indices[start_triangle_index + 5u] = start_vertex_index + 3u; } dir += 1u; @@ -276,15 +212,15 @@ fn interp_vertex(p1: vec3, p2: vec3, v1: f32, v2: f32) -> vec3 { var vertex_index: u32 = 0u; loop { let out_index = start_vertex_index + vertex_index; - out_vertices.data[out_index + 0u] = workgroup_vertices[vertex_index + 0u]; - out_vertices.data[out_index + 1u] = workgroup_vertices[vertex_index + 1u]; - out_vertices.data[out_index + 2u] = workgroup_vertices[vertex_index + 2u]; - out_normals.data[out_index + 0u] = workgroup_normals[vertex_index + 0u]; - out_normals.data[out_index + 1u] = workgroup_normals[vertex_index + 1u]; - out_normals.data[out_index + 2u] = workgroup_normals[vertex_index + 2u]; - out_uvs.data[out_index + 0u] = workgroup_uvs[vertex_index + 0u]; - out_uvs.data[out_index + 1u] = workgroup_uvs[vertex_index + 1u]; - out_uvs.data[out_index + 2u] = workgroup_uvs[vertex_index + 2u]; + out_vertices[out_index + 0u] = workgroup_vertices[vertex_index + 0u]; + out_vertices[out_index + 1u] = workgroup_vertices[vertex_index + 1u]; + out_vertices[out_index + 2u] = workgroup_vertices[vertex_index + 2u]; + out_normals[out_index + 0u] = workgroup_normals[vertex_index + 0u]; + out_normals[out_index + 1u] = workgroup_normals[vertex_index + 1u]; + out_normals[out_index + 2u] = workgroup_normals[vertex_index + 2u]; + out_uvs[out_index + 0u] = workgroup_uvs[vertex_index + 0u]; + out_uvs[out_index + 1u] = workgroup_uvs[vertex_index + 1u]; + out_uvs[out_index + 2u] = workgroup_uvs[vertex_index + 2u]; vertex_index += 3u; if (vertex_index >= workgroup_atomics.vertices_head) { @@ -292,16 +228,16 @@ fn interp_vertex(p1: vec3, p2: vec3, v1: f32, v2: f32) -> vec3 { } } - let start_indices_index = atomicAdd(&out_atomics.indices_head, workgroup_atomics.indices_head); - var index_index: u32 = 0u; + let start_triangle_index = atomicAdd(&out_atomics.indices_head, workgroup_atomics.indices_head); + var triangle_index: u32 = 0u; loop { - let out_index = start_indices_index + index_index; - out_indices.data[out_index + 0u] = start_vertex_index + workgroup_indices[index_index + 0u]; - out_indices.data[out_index + 1u] = start_vertex_index + workgroup_indices[index_index + 1u]; - out_indices.data[out_index + 2u] = start_vertex_index + workgroup_indices[index_index + 2u]; + let out_index = start_triangle_index + triangle_index; + out_indices[out_index + 0u] = start_vertex_index + workgroup_indices[triangle_index + 0u]; + out_indices[out_index + 1u] = start_vertex_index + workgroup_indices[triangle_index + 1u]; + out_indices[out_index + 2u] = start_vertex_index + workgroup_indices[triangle_index + 2u]; - index_index += 3u; - if (index_index >= workgroup_atomics.indices_head) { + triangle_index += 3u; + if (triangle_index >= workgroup_atomics.indices_head) { break; } } diff --git a/src/main.rs b/src/main.rs index dfbab65..f2134c6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -257,6 +257,7 @@ pub struct Buffers { // Place edge table and triangle table in uniform buffer // They are too large to have inline in the shader triangle_table: Buffer, + block_face_table: Buffer, points: BufVec, heights: BufVec, voxels: Buffer, diff --git a/src/qgame/lookup.rs b/src/qgame/lookup.rs index 91d80ed..ebfb0d1 100644 --- a/src/qgame/lookup.rs +++ b/src/qgame/lookup.rs @@ -1,4 +1,4 @@ -pub(crate) const TRI_TABLE: &'static [[i32; 16]; 256] = &[ +pub(crate) const TRIANGLE_TABLE: &'static [[i32; 16]; 256] = &[ [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], [0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], [0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], @@ -257,4 +257,11 @@ pub(crate) const TRI_TABLE: &'static [[i32; 16]; 256] = &[ [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1] ]; -// pub (crate) const +pub(crate) const BLOCK_FACE_TABLE: &'static [[[f32; 3]; 4]; 6] = &[ + [[0.5, -0.5, -0.5], [0.5, 0.5, -0.5], [0.5, 0.5, 0.5], [0.5, -0.5, 0.5]], + [[-0.5, -0.5, 0.5], [-0.5, 0.5, 0.5], [-0.5, 0.5, -0.5], [-0.5, -0.5, -0.5]], + [[-0.5, 0.5, 0.5], [-0.5, 0.5, -0.5], [0.5, 0.5, -0.5], [0.5, 0.5, 0.5]], + [[-0.5, -0.5, 0.5], [0.5, -0.5, 0.5], [0.5, -0.5, -0.5], [-0.5, -0.5, -0.5]], + [[-0.5, -0.5, 0.5], [-0.5, 0.5, 0.5], [0.5, 0.5, 0.5], [0.5, -0.5, 0.5]], + [[-0.5, 0.5, -0.5], [-0.5, -0.5, -0.5], [0.5, -0.5, -0.5], [0.5, 0.5, -0.5]], +]; diff --git a/src/qgame/voxel.rs b/src/qgame/voxel.rs index 56fe8fa..3159398 100644 --- a/src/qgame/voxel.rs +++ b/src/qgame/voxel.rs @@ -86,9 +86,14 @@ impl FromWorld for VoxelsPipeline { let render_device = world.get_resource::().unwrap(); let _asset_server = world.get_resource::().unwrap(); - let tri_table = render_device.create_buffer_with_data(&BufferInitDescriptor { + let triangle_table = render_device.create_buffer_with_data(&BufferInitDescriptor { label: Some("tri table buffer"), - contents: cast_slice(TRI_TABLE), + contents: cast_slice(TRIANGLE_TABLE), + usage: BufferUsages::STORAGE, + }); + let block_face_table = render_device.create_buffer_with_data(&BufferInitDescriptor { + label: Some("block face table buffer"), + contents: cast_slice(BLOCK_FACE_TABLE), usage: BufferUsages::STORAGE, }); let points: BufVec = BufVec::with_capacity(false, CHUNK_SZ_2, render_device); @@ -143,7 +148,7 @@ impl FromWorld for VoxelsPipeline { entry_point: "main", }); - world.insert_resource(Buffers { triangle_table: tri_table, points, heights, voxels, voxels_staging, vertices, normals, uvs, indices, atomics, atomics_staging }); + world.insert_resource(Buffers { triangle_table, block_face_table, points, heights, voxels, voxels_staging, vertices, normals, uvs, indices, atomics, atomics_staging }); VoxelsPipeline { simplex_pipeline, @@ -202,12 +207,13 @@ pub fn voxel_polygonize_system( layout: &pipeline.voxels_pipeline.get_bind_group_layout(0), entries: &[ BindGroupEntry { binding: 0, resource: buffers.triangle_table.as_entire_binding() }, - BindGroupEntry { binding: 1, resource: buffers.voxels.as_entire_binding() }, - BindGroupEntry { binding: 2, resource: buffers.atomics.buffer().as_entire_binding() }, - BindGroupEntry { binding: 3, resource: buffers.vertices.buffer().as_entire_binding() }, - BindGroupEntry { binding: 4, resource: buffers.normals.buffer().as_entire_binding() }, - BindGroupEntry { binding: 5, resource: buffers.indices.buffer().as_entire_binding() }, - BindGroupEntry { binding: 6, resource: buffers.uvs.buffer().as_entire_binding() }, + BindGroupEntry { binding: 1, resource: buffers.block_face_table.as_entire_binding() }, + BindGroupEntry { binding: 2, resource: buffers.voxels.as_entire_binding() }, + BindGroupEntry { binding: 3, resource: buffers.atomics.buffer().as_entire_binding() }, + BindGroupEntry { binding: 4, resource: buffers.vertices.buffer().as_entire_binding() }, + BindGroupEntry { binding: 5, resource: buffers.normals.buffer().as_entire_binding() }, + BindGroupEntry { binding: 6, resource: buffers.indices.buffer().as_entire_binding() }, + BindGroupEntry { binding: 7, resource: buffers.uvs.buffer().as_entire_binding() }, ], }), }; From ba3fee729bf33f32d24d707cb6a91354117c50d2 Mon Sep 17 00:00:00 2001 From: qhdwight Date: Sun, 30 Apr 2023 17:18:00 -0400 Subject: [PATCH 3/3] Try setting work group size to 4x4x4 --- Cargo.lock | 701 +++++++++++++++++++++--------------- Cargo.toml | 4 +- assets/shaders/simplex.wgsl | 6 +- assets/shaders/voxels.wgsl | 136 +++---- src/main.rs | 2 +- src/qgame/voxel.rs | 9 +- 6 files changed, 483 insertions(+), 375 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ebd7d90..99f96fd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "ab_glyph" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe21446ad43aa56417a767f3e2f3d7c4ca522904de1dd640529a76e9c5c3b33c" +checksum = "5110f1c78cf582855d895ecd0746b653db010cec6d9f5575293f27934d980a39" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -35,9 +35,9 @@ dependencies = [ [[package]] name = "accesskit_macos" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc50af17818440f580a894536c4c5a95ff9e4bad59f19ee68757ca959d001813" +checksum = "58d062544d6cc36f4213323b7cb3a0d74ddff4b0d2311ab5e7596f4278bb2cc9" dependencies = [ "accesskit", "accesskit_consumer", @@ -61,9 +61,9 @@ dependencies = [ [[package]] name = "accesskit_winit" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eb880d83a5502edd311bdb3af1cf7113b250c9c2d92fbdd05342c7b9f38bf51" +checksum = "fbcb615217efc79c4bed3094c4ca76c4bc554751d1da16f3ed4ba0459b1e8f31" dependencies = [ "accesskit", "accesskit_macos", @@ -99,9 +99,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" dependencies = [ "memchr", ] @@ -169,9 +169,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.69" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" [[package]] name = "approx" @@ -210,9 +210,9 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17adb73da160dfb475c183343c8cccd80721ea5a605d3eb57125f0a7b7a92d0b" +checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" dependencies = [ "async-lock", "async-task", @@ -233,9 +233,9 @@ dependencies = [ [[package]] name = "async-task" -version = "4.3.0" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524" +checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" [[package]] name = "autocfg" @@ -253,7 +253,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "miniz_oxide", + "miniz_oxide 0.6.2", "object", "rustc-demangle", ] @@ -266,18 +266,18 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "bevy" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc88fece4660d68690585668f1a4e18e6dcbab160b08f337b498a96ccde91cfe" +checksum = "b93f906133305915d63f04108e6873c1b93a6605fe374b8f3391f6bda093e396" dependencies = [ "bevy_internal", ] [[package]] name = "bevy_a11y" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a10b25cf04971b9d68271aa54e4601c673509db6edaf1f5359dd91fb3e84cc27" +checksum = "037c4063f7dac1a5d596eb47f40782a04ca5838dc4274dbbadc90eb81efe5169" dependencies = [ "accesskit", "bevy_app", @@ -287,9 +287,9 @@ dependencies = [ [[package]] name = "bevy_animation" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aabb803571785797c84e106ed63427eaf2cb12832a591923707896ee000bde8" +checksum = "d0dc19f21846ebf8ba4d96617c2517b5119038774aa5dbbaf1bff122332b359c" dependencies = [ "bevy_app", "bevy_asset", @@ -305,9 +305,9 @@ dependencies = [ [[package]] name = "bevy_app" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960c6e444dc6a25dd51a2196f04872ae9e2e876802b66c391104849ec9225e38" +checksum = "01db46963eb9486f7884121527ec69751d0e448f9e1d5329e80ea3424118a31a" dependencies = [ "bevy_derive", "bevy_ecs", @@ -320,9 +320,9 @@ dependencies = [ [[package]] name = "bevy_asset" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adea538a3d166c8609621994972c31be591c96f931f160f96e74697d8c24ba45" +checksum = "98609b4b0694a23bde0628aed626644967991f167aad9db2afb68dacb0017540" dependencies = [ "anyhow", "bevy_app", @@ -348,9 +348,9 @@ dependencies = [ [[package]] name = "bevy_audio" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0841e98276000dc06e2cf7593ee20b16b84da3bc7faa7b549938cb982b33b0e1" +checksum = "42b9f9b87b0d094268ce52bb75ff346ae0054573f7acc5d66bf032e2c88f748d" dependencies = [ "anyhow", "bevy_app", @@ -367,9 +367,9 @@ dependencies = [ [[package]] name = "bevy_core" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed29797fa386c6969fa1e4ef9e194a27f89ddb2fa78751fe46838495d374f90f" +checksum = "0ee53d7b4691b57207d72e996992c995a53f3e8d21ca7151ca3956d9ce7d232e" dependencies = [ "bevy_app", "bevy_ecs", @@ -383,9 +383,9 @@ dependencies = [ [[package]] name = "bevy_core_pipeline" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3129d308df70dee3c46b6bb64e54d2552e7106fd3185d75732ad5e739a830fee" +checksum = "093ae5ced77251602ad6e43521e2acc1a5570bf85b80f232f1a7fdd43b50f8d8" dependencies = [ "bevy_app", "bevy_asset", @@ -403,20 +403,20 @@ dependencies = [ [[package]] name = "bevy_derive" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf11701c01bf4dc7a3fac9f4547f3643d3db4cc1682af40c8c86e2f8734b617" +checksum = "dff0add5ab4a6b2b7e86e18f9043bb48b6386faa3b56abaa0ed97a3d669a1992" dependencies = [ "bevy_macro_utils", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "bevy_diagnostic" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576508ffe7ad5124781edd352b79bdc79ffbb6e2f26bad6f722774f7c9fd16c9" +checksum = "64c778422643b0adee9e82abbd07e1e906eb9947c274a9b18e0f7fbf137d4c34" dependencies = [ "bevy_app", "bevy_core", @@ -429,9 +429,9 @@ dependencies = [ [[package]] name = "bevy_ecs" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc5b19451128091e8507c9247888359ca0bfa895e7f6ca749ccc55c5463bef6" +checksum = "bed2f74687ccf13046c0f8e3b00dc61d7e656877b4a1380cf04635bb74d8e586" dependencies = [ "async-channel", "bevy_ecs_macros", @@ -449,21 +449,21 @@ dependencies = [ [[package]] name = "bevy_ecs_macros" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e79757319533bde006a4f30c268223ec6426371297182925932075ccfdae30" +checksum = "a97fd126a0db7b30fb1833614b3a657b44ac88485741c33b2780e25de0f96d78" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "bevy_encase_derive" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "723d4838d1f88955f348294c0a9d067307f2437725400b0776e9677154914f14" +checksum = "c086ebdc1f5522787d63772943277cc74a279445fb65db4d58c2c5330654648e" dependencies = [ "bevy_macro_utils", "encase_derive_impl", @@ -471,9 +471,9 @@ dependencies = [ [[package]] name = "bevy_gilrs" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905e547d213e368f997d08f140f4e893923c7dce4760bf0fb63401232262fa79" +checksum = "3f32eb07e8c9ea4be7195ccec10d8f9ad70200f3ae2e13adc4b84df9f50bb1c6" dependencies = [ "bevy_app", "bevy_ecs", @@ -484,9 +484,9 @@ dependencies = [ [[package]] name = "bevy_gltf" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2994d7e47c36bfe36710c4a26d3f36dd8641bfaa2c5d4d0581e001942aab6f" +checksum = "2707632208617c3660ea7a1d2ef2ccc84b59f217c2f01a1d0abe81db4ae7bbde" dependencies = [ "anyhow", "base64", @@ -513,9 +513,9 @@ dependencies = [ [[package]] name = "bevy_hierarchy" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd246c862fcaeef3a769f47c6297139f971db0c8fdd6188fe9419ee8873b7e8" +checksum = "9d04099865a13d1fd8bf3c044a80148cb3d23bfe8c3d5f082dda2ce091d85532" dependencies = [ "bevy_app", "bevy_core", @@ -528,9 +528,9 @@ dependencies = [ [[package]] name = "bevy_input" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c809b3df62e1fcbdc6744233ae6c95a67d2cc7e518db43ab81f417d5875ba3b" +checksum = "a15d40aa636bb656967ac16ca36066ab7a7bb9179e1b0390c5705e54208e8fd7" dependencies = [ "bevy_app", "bevy_ecs", @@ -543,9 +543,9 @@ dependencies = [ [[package]] name = "bevy_internal" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a065c7ac81cd7cf3f1b8f15c4a93db5f07274ddaaec145ba7d0393be0c9c413" +checksum = "862b11931c5874cb00778ffb715fc526ee49e52a493d3bcf50e8010f301858b3" dependencies = [ "bevy_a11y", "bevy_animation", @@ -581,9 +581,9 @@ dependencies = [ [[package]] name = "bevy_log" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47dcb09ec71145c80d88a84181cc1449d30f23c571bdd58c59c10eece82dfaa5" +checksum = "25980c90ceaad34d09a53291e72ca56fcc754a974cd4654fffcf5b68b283b7a7" dependencies = [ "android_log-sys", "bevy_app", @@ -597,20 +597,20 @@ dependencies = [ [[package]] name = "bevy_macro_utils" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f24ca3363292f1435641fbafd5c24ce362137dd7d69bee56dcaaa2bc1d512ffe" +checksum = "5b2fee53b2497cdc3bffff2ddf52afa751242424a5fd0d51d227d4dab081d0d9" dependencies = [ "quote", - "syn", + "syn 1.0.109", "toml_edit", ] [[package]] name = "bevy_math" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e45e46c2ac0a92db3ae622f2ed690928fe2612e7c9470a46d0ed4c2c77e2e95" +checksum = "da6a1109d06fe947990db032e719e162414cf9bf7a478dcc52742f1c7136c42a" dependencies = [ "glam", "serde", @@ -618,18 +618,18 @@ dependencies = [ [[package]] name = "bevy_mikktspace" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaa0358a79823e6f0069b910d90b615d02dad08279b5856d3d1e401472b6379a" +checksum = "39106bc2ee21fce9496d2e15e0ba7925dff63e3eae10f7c1fc0094b56ad9f2bb" dependencies = [ "glam", ] [[package]] name = "bevy_pbr" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90230c526ee7257229c1db0fc4aafaa947ea806bb4b0674785930ea59d0cc7f8" +checksum = "4f507cef55812aa70c2ec2b30fb996eb285fa7497d974cf03f76ec49c77fbe27" dependencies = [ "bevy_app", "bevy_asset", @@ -649,9 +649,9 @@ dependencies = [ [[package]] name = "bevy_ptr" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96c24da064370917b92c2a84527e6a73b620c50ac5ef8b1af8c04ccf5256a7c" +checksum = "0c4b88451d4c5a353bff67dbaa937b6886efd26ae114769c17f2b35099c7a4de" [[package]] name = "bevy_rapier3d" @@ -668,9 +668,9 @@ dependencies = [ [[package]] name = "bevy_reflect" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab880e0eed9df5c99ce1a2f89edc11cdef1bc78413719b29e9ad7e3bc27f4c20" +checksum = "9fc3979471890e336f3ba87961ef3ecd45c331cf2cb2f582c885e541af228b48" dependencies = [ "bevy_math", "bevy_ptr", @@ -688,23 +688,23 @@ dependencies = [ [[package]] name = "bevy_reflect_derive" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b361b8671bdffe93978270dd770b03b48560c3127fdf9003f98111fb806bb11" +checksum = "2bc7ea7c9bc2c531eb29ba5619976613d6680453ff5dd4a7fcd08848e8bec5ad" dependencies = [ "bevy_macro_utils", "bit-set", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "uuid", ] [[package]] name = "bevy_render" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e352868ab1a9ad9fbaa6ff025505e685781ad1790377b2d038afeb9df18214" +checksum = "ee1e126226f0a4d439bf82fe07c1104f894a6a365888e3eba7356f9647e77a83" dependencies = [ "anyhow", "async-channel", @@ -748,21 +748,21 @@ dependencies = [ [[package]] name = "bevy_render_macros" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "570b1d0f38439c5ac8ab75572804c9979b9caa372c49bd00803f60a22a3e1328" +checksum = "652f8c4d9577c6e6a8b3dfd8a4ce331e8b6ecdbb99636a4b2701dec50104d6bc" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "bevy_scene" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3995f756e482e964e0244a5d388e757f272d1dcdc02136730b1c45f4d5eeb516" +checksum = "1de59637d27726251091120ce6f63917328ffd60aaccbda4d65a615873aff631" dependencies = [ "anyhow", "bevy_app", @@ -782,9 +782,9 @@ dependencies = [ [[package]] name = "bevy_sprite" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14aa41c9480b76d7b3c3f1ed89f95c9d6e2a39d3c3367ca82c122d853ac0463e" +checksum = "c110358fe3651a5796fd1c07989635680738f5b5c7e9b8a463dd50d12bb78410" dependencies = [ "bevy_app", "bevy_asset", @@ -807,9 +807,9 @@ dependencies = [ [[package]] name = "bevy_tasks" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e368e4177fe70d695d5cb67fb7480fa262de79948d9b883a21788b9abf5a85a" +checksum = "3de86364316e151aeb0897eaaa917c3ad5ee5ef1471a939023cf7f2d5ab76955" dependencies = [ "async-channel", "async-executor", @@ -822,9 +822,9 @@ dependencies = [ [[package]] name = "bevy_text" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33fc934d7cbadbb6dac11547dfb805d3e6b3f0b40f6e66e437fe4b3c7581cc5c" +checksum = "995188f59dc06da3fc951e1f58a105cde2c817d5330ae67ddc0a140f46482f6b" dependencies = [ "ab_glyph", "anyhow", @@ -845,9 +845,9 @@ dependencies = [ [[package]] name = "bevy_time" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f2863cfc08fa38909e047a1bbc2dd71d0836057ed0840c69ace9dff3e0c298" +checksum = "d3edbd605df1bced312eb9888d6be3d5a5fcac3d4140038bbe3233d218399eef" dependencies = [ "bevy_app", "bevy_ecs", @@ -860,9 +860,9 @@ dependencies = [ [[package]] name = "bevy_transform" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de9cda3df545ac889b4f6b702109e51d29d7b4b6f402f2bb9b4d1d9f9c382b63" +checksum = "24383dfb97d8a14b17721ecfdf58556eff5ea9a4b2a3d91accf2b472783880b0" dependencies = [ "bevy_app", "bevy_ecs", @@ -874,9 +874,9 @@ dependencies = [ [[package]] name = "bevy_ui" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc341d652ba20fac0170a46eff8310829a862f4e52db06164dc6200706768934" +checksum = "cb597aeed4e1bf5e6913879c3e22a7d50a843b822a7f71a4a80ebdfdf79e68d4" dependencies = [ "bevy_a11y", "bevy_app", @@ -904,9 +904,9 @@ dependencies = [ [[package]] name = "bevy_utils" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04d90ce493910ad9af3b4220ea6864c7d1472761086a98230ecac59c8d547e95" +checksum = "0a88ebbca55d360d72e9fe78df0d22e25cd419933c9559e79dae2757f7c4d066" dependencies = [ "ahash", "bevy_utils_proc_macros", @@ -921,20 +921,20 @@ dependencies = [ [[package]] name = "bevy_utils_proc_macros" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62a42e465c446800c57a5bf65b64f4fa1c1f3a74efc2a64a2a001e4a4f548a2e" +checksum = "630b92e32fa5cd7917c7d4fdbf63a90af958b01e096239f71bc4f8f3cf40c0d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "bevy_window" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da8a2c523302ad64768991a7474c6010c76b9eb78323309ef3911521887fd108" +checksum = "ad31234754268fbe12050290b0496e2296252a16995a38f94bfb9680a4f09fda" dependencies = [ "bevy_app", "bevy_ecs", @@ -948,9 +948,9 @@ dependencies = [ [[package]] name = "bevy_winit" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb6eb9b9790c1ad925d900a3f315abf15b11fb56c6464747a96560e559e1a9c" +checksum = "cf17bd6330f7e633b7c56754c776511a8f52cde4bf54c0278f34d7527548f253" dependencies = [ "accesskit_winit", "approx", @@ -973,9 +973,9 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.61.0" +version = "0.64.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a022e58a142a46fea340d68012b9201c094e93ec3d033a944a24f8fd4a4f09a" +checksum = "c4243e6031260db77ede97ad86c27e501d646a27ab57b59a574f725d98ab1fb4" dependencies = [ "bitflags", "cexpr", @@ -988,7 +988,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn", + "syn 1.0.109", ] [[package]] @@ -1039,9 +1039,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" [[package]] name = "bytemuck" @@ -1054,13 +1054,13 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aca418a974d83d40a0c1f0c5cba6ff4bc28d8df099109ca459a2118d40b6322" +checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] @@ -1113,9 +1113,9 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "clang-sys" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ed9a53e5d4d9c573ae844bfac6872b159cb1d1585a83b29e7a64b7eef7332a" +checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" dependencies = [ "glob", "libc", @@ -1156,9 +1156,9 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e" +checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" dependencies = [ "crossbeam-utils", ] @@ -1185,7 +1185,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" dependencies = [ - "core-foundation-sys 0.8.3", + "core-foundation-sys 0.8.4", "libc", ] @@ -1197,9 +1197,9 @@ checksum = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "core-graphics" @@ -1239,37 +1239,36 @@ dependencies = [ [[package]] name = "coreaudio-sys" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a9444b94b8024feecc29e01a9706c69c1e26bfee480221c90764200cfd778fb" +checksum = "f034b2258e6c4ade2f73bf87b21047567fb913ee9550837c2316d139b0262b24" dependencies = [ "bindgen", ] [[package]] name = "cpal" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34fa7b20adf588f73f094cd9b1d944977c686e37a2759ea217ab174f017e10a" +checksum = "6d959d90e938c5493000514b446987c07aed46c668faaa7d34d6c7a67b1a578c" dependencies = [ "alsa", - "core-foundation-sys 0.8.3", + "core-foundation-sys 0.8.4", "coreaudio-rs", "dasp_sample", "jni 0.19.0", "js-sys", "libc", - "mach", + "mach2", "ndk", "ndk-context", "oboe", "once_cell", "parking_lot", - "thiserror", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows 0.44.0", + "windows 0.46.0", ] [[package]] @@ -1297,9 +1296,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" dependencies = [ "cfg-if", "crossbeam-utils", @@ -1412,7 +1411,7 @@ checksum = "ae489d58959f3c4cdd1250866a05acfb341469affe4fced71aff3ba228be1693" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1426,9 +1425,9 @@ dependencies = [ [[package]] name = "euclid" -version = "0.22.7" +version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b52c2ef4a78da0ba68fbe1fd920627411096d2ac478f7f4c9f3a54ba6705bade" +checksum = "87f253bc5c813ca05792837a0ff4b3a580336b224512d48f7eda1d7dd9210787" dependencies = [ "num-traits", ] @@ -1448,16 +1447,25 @@ dependencies = [ "instant", ] +[[package]] +name = "fdeflate" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +dependencies = [ + "simd-adler32", +] + [[package]] name = "filetime" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412" +checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" dependencies = [ "cfg-if", "libc", "redox_syscall 0.2.16", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -1474,12 +1482,12 @@ checksum = "cda653ca797810c02f7ca4b804b40b8b95ae046eb989d356bce17919a8c25499" [[package]] name = "flate2" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.7.1", ] [[package]] @@ -1514,21 +1522,21 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86d7a0c1aa76363dac491de0ee99faf6941128376f1cf96f07db7603b7de69dd" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" [[package]] name = "futures-io" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d422fa3cbe3b40dca574ab087abb5bc98258ea57eea3fd6f1fa7162c778b91" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" [[package]] name = "futures-lite" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" dependencies = [ "fastrand", "futures-core", @@ -1550,9 +1558,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" dependencies = [ "cfg-if", "js-sys", @@ -1563,9 +1571,9 @@ dependencies = [ [[package]] name = "gilrs" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d0342acdc7b591d171212e17c9350ca02383b86d5f9af33c6e3598e03a6c57e" +checksum = "62fd19844d0eb919aca41d3e4ea0e0b6bf60e1e827558b101c269015b8f5f27a" dependencies = [ "fnv", "gilrs-core", @@ -1576,9 +1584,9 @@ dependencies = [ [[package]] name = "gilrs-core" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6789d356476c3280a4e15365d23f62b4b4f1bcdac81fdd552f65807bce4666dd" +checksum = "fd745b0cb1a207756e8fabacf5623066ad6aa543ea0be4bab34e897e6bbe24f9" dependencies = [ "core-foundation", "io-kit-sys", @@ -1586,12 +1594,12 @@ dependencies = [ "libc", "libudev-sys", "log", - "nix 0.25.1", + "nix 0.26.2", "uuid", "vec_map", "wasm-bindgen", "web-sys", - "windows 0.43.0", + "windows 0.48.0", ] [[package]] @@ -1649,7 +1657,7 @@ dependencies = [ "inflections", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1780,9 +1788,9 @@ checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" [[package]] name = "image" -version = "0.24.5" +version = "0.24.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69b7ea949b537b0fd0af141fff8c77690f2ce96f4f41f042ccb6c69c6c965945" +checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" dependencies = [ "bytemuck", "byteorder", @@ -1790,14 +1798,13 @@ dependencies = [ "num-rational", "num-traits", "png", - "scoped_threadpool", ] [[package]] name = "indexmap" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown", @@ -1844,12 +1851,12 @@ dependencies = [ [[package]] name = "io-kit-sys" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7789f7f3c9686f96164f5109d69152de759e76e284f736bd57661c6df5091919" +checksum = "9b2d4429acc1deff0fbdece0325b4997bdb02b2c245ab7023fd5deca0f6348de" dependencies = [ - "core-foundation-sys 0.8.3", - "mach", + "core-foundation-sys 0.8.4", + "mach2", ] [[package]] @@ -1975,9 +1982,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.140" +version = "0.2.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" +checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" [[package]] name = "libloading" @@ -2025,10 +2032,10 @@ dependencies = [ ] [[package]] -name = "mach" -version = "0.3.2" +name = "mach2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" dependencies = [ "libc", ] @@ -2053,10 +2060,11 @@ dependencies = [ [[package]] name = "matrixmultiply" -version = "0.3.2" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add85d4dd35074e6fedc608f8c8f513a3548619a9024b751949ef0e8e45a4d84" +checksum = "f0f0cb8fdceebf83cff284ae2c862792f989731d5eda7bd5b3fd3722003fe8be" dependencies = [ + "autocfg", "rawpointer", ] @@ -2104,6 +2112,16 @@ dependencies = [ "adler", ] +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", + "simd-adler32", +] + [[package]] name = "mio" version = "0.8.6" @@ -2163,7 +2181,7 @@ checksum = "d232c68884c0c99810a5a4d333ef7e47689cfd0edc85efc9e54e1e6bf5212766" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2208,14 +2226,14 @@ dependencies = [ [[package]] name = "nix" -version = "0.25.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" +checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" dependencies = [ - "autocfg", "bitflags", "cfg-if", "libc", + "static_assertions", ] [[package]] @@ -2248,9 +2266,9 @@ dependencies = [ [[package]] name = "ntapi" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc51db7b362b205941f71232e56c625156eb9a929f8cf74a428fd5bc094a4afc" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" dependencies = [ "winapi", ] @@ -2282,7 +2300,7 @@ checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2334,7 +2352,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2355,9 +2373,9 @@ checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" [[package]] name = "objc2" -version = "0.3.0-beta.3" +version = "0.3.0-beta.3.patch-leaks.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe31e5425d3d0b89a15982c024392815da40689aceb34bad364d58732bcfd649" +checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468" dependencies = [ "block2", "objc-sys", @@ -2437,14 +2455,11 @@ checksum = "978aa494585d3ca4ad74929863093e87cac9790d81fe7aba2b3dc2890643a0fc" [[package]] name = "orbclient" -version = "0.3.43" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "974465c5e83cf9df05c1e4137b271d29035c902e39e5ad4c1939837e22160af8" +checksum = "221d488cd70617f1bd599ed8ceb659df2147d9393717954d82a0f5e8032a6ab1" dependencies = [ - "cfg-if", - "redox_syscall 0.2.16", - "wasm-bindgen", - "web-sys", + "redox_syscall 0.3.5", ] [[package]] @@ -2455,18 +2470,18 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "owned_ttf_parser" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e25e9fb15717794fae58ab55c26e044103aad13186fbb625893f9a3bbcc24228" +checksum = "706de7e2214113d63a8238d1910463cfce781129a6f263d13fdb09ff64355ba4" dependencies = [ "ttf-parser", ] [[package]] name = "parking" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" +checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" [[package]] name = "parking_lot" @@ -2493,9 +2508,9 @@ dependencies = [ [[package]] name = "parry3d" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c73a9ea58699f422dcd322c134ab02dad2871ba02ee871c9ae1f277c302eb092" +checksum = "2d527d9e8d203c55e5d25811d6c65e120b577985cb9b64f00fdb9aaf8c3d80ea" dependencies = [ "approx", "arrayvec", @@ -2555,14 +2570,15 @@ checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" [[package]] name = "png" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d708eaf860a19b19ce538740d2b4bdeeb8337fa53f7738455e706623ad5c638" +checksum = "aaeebc51f9e7d2c150d3f3bfeb667f2aa985db5ef1e3d212847bdedb488beeaa" dependencies = [ "bitflags", "crc32fast", + "fdeflate", "flate2", - "miniz_oxide", + "miniz_oxide 0.7.1", ] [[package]] @@ -2586,18 +2602,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.51" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74605f360ce573babfe43964cbe520294dcb081afbf8c108fc6e23036b4da2df" +checksum = "332cd62e95873ea4f41f3dfd6bbbfc5b52aec892d7e8d534197c4720a0bbbab2" [[package]] name = "qgame" @@ -2617,9 +2633,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" dependencies = [ "proc-macro2", ] @@ -2658,9 +2674,9 @@ dependencies = [ [[package]] name = "raw-window-handle" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f851a03551ceefd30132e447f07f96cb7011d6b658374f3aed847333adb5559" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" [[package]] name = "rawpointer" @@ -2685,22 +2701,22 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb02a9aee8e8c7ad8d86890f1e16b49e0bbbffc9961ff3788c31d57c98bcbf03" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.7.1" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.7.1", ] [[package]] @@ -2709,14 +2725,20 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" dependencies = [ - "regex-syntax", + "regex-syntax 0.6.29", ] [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" [[package]] name = "renderdoc-sys" @@ -2753,9 +2775,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.21" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustc-hash" @@ -2797,12 +2819,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "scoped_threadpool" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" - [[package]] name = "scopeguard" version = "1.1.0" @@ -2811,29 +2827,29 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.155" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71f2b4817415c6d4210bfe1c7bfcf4801b2d904cb4d0e1a8fdb651013c9e86b8" +checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.155" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d071a94a3fac4aff69d023a7f411e33f40f3483f8c5190b1953822b6b76d7630" +checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] name = "serde_json" -version = "1.0.94" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa", "ryu", @@ -2866,9 +2882,9 @@ checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" [[package]] name = "simba" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50582927ed6f77e4ac020c057f37a268fc6aebc29225050365aacbb9deeeddc4" +checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" dependencies = [ "approx", "libm", @@ -2878,6 +2894,12 @@ dependencies = [ "wide", ] +[[package]] +name = "simd-adler32" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "238abfbb77c1915110ad968465608b68e869e0772622c9656714e73e5a1a522f" + [[package]] name = "slab" version = "0.4.8" @@ -2919,9 +2941,9 @@ dependencies = [ [[package]] name = "spade" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1190e0e8f4eb17fc3dbb2d20e1142676e56aaac3daede39f64a3302d687b80f3" +checksum = "88e65803986868d2372c582007c39ba89936a36ea5f236bf7a7728dc258f04f9" dependencies = [ "num-traits", "optional", @@ -2962,14 +2984,25 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "sysinfo" -version = "0.28.2" +version = "0.28.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e847e2de7a137c8c2cede5095872dbb00f4f9bf34d061347e36b43322acd56" +checksum = "b4c2f3ca6693feb29a89724516f016488e9aafc7f37264f898593ee4b942f31b" dependencies = [ "cfg-if", - "core-foundation-sys 0.8.3", + "core-foundation-sys 0.8.4", "libc", "ntapi", "once_cell", @@ -2978,9 +3011,9 @@ dependencies = [ [[package]] name = "taffy" -version = "0.3.7" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee314c07429e51c4770287734f62d23bb27cb9e941823f969b57f50171079ee" +checksum = "3540ec65df399929a04a485feb50144475735920cc47eaf8eba09c70b1df4055" dependencies = [ "arrayvec", "num-traits", @@ -2998,22 +3031,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.39" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ab016db510546d856297882807df8da66a16fb8c4101cb8b30054b0d5b2d9c" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.39" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] @@ -3089,13 +3122,13 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" +checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] @@ -3121,9 +3154,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" dependencies = [ "matchers", "nu-ansi-term", @@ -3150,9 +3183,9 @@ dependencies = [ [[package]] name = "ttf-parser" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0609f771ad9c6155384897e1df4d948e692667cc0588548b68eb44d052b27633" +checksum = "44dcf002ae3b32cd25400d6df128c5babec3927cd1eb7ce813cfff20eb6c3746" [[package]] name = "twox-hash" @@ -3196,9 +3229,9 @@ checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" [[package]] name = "uuid" -version = "1.3.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79" +checksum = "4dad5567ad0cf5b760e5665964bec1b47dfd077ba8a2544b513f3556d3d239a2" dependencies = [ "getrandom", "serde", @@ -3230,12 +3263,11 @@ checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" [[package]] name = "walkdir" -version = "2.3.2" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" dependencies = [ "same-file", - "winapi", "winapi-util", ] @@ -3266,7 +3298,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -3300,7 +3332,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3381,9 +3413,9 @@ dependencies = [ [[package]] name = "wgpu-hal" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7762ae7fcc06943c1b5d4987ab0194e82aaba7767fbfb75d3458844c5b82cc45" +checksum = "bdcf61a283adc744bb5453dd88ea91f3f86d5ca6b027661c6c73c7734ae0288b" dependencies = [ "android_system_properties", "arrayvec", @@ -3481,28 +3513,31 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" -version = "0.43.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04662ed0e3e5630dfa9b26e4cb823b817f1a9addda855d973a9458c236556244" +checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows-implement", + "windows-interface", + "windows-targets 0.42.2", ] [[package]] name = "windows" -version = "0.44.0" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" +checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25" dependencies = [ - "windows-implement", - "windows-interface", - "windows-targets", + "windows-targets 0.42.2", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.0", ] [[package]] @@ -3513,7 +3548,7 @@ checksum = "6ce87ca8e3417b02dc2a8a22769306658670ec92d78f1bd420d6310a67c245c6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -3524,7 +3559,7 @@ checksum = "853f69a591ecd4f810d29f17e902d40e349fb05b0b11fff63b08b826bfe39c7f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -3533,13 +3568,13 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", ] [[package]] @@ -3548,71 +3583,137 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets", + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", ] [[package]] name = "windows-targets" -version = "0.42.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.1" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.42.1" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.42.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" -version = "0.42.1" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.42.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.1" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.42.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winit" -version = "0.28.2" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d38e7dc904dda347b54dbec3b2d4bf534794f4fb4e6df0be91a264f4f2ed1cf" +checksum = "4f504e8c117b9015f618774f8d58cd4781f5a479bc41079c064f974cbb253874" dependencies = [ "android-activity", "bitflags", @@ -3630,7 +3731,7 @@ dependencies = [ "orbclient", "percent-encoding", "raw-window-handle", - "redox_syscall 0.3.4", + "redox_syscall 0.3.5", "wasm-bindgen", "wayland-scanner", "web-sys", diff --git a/Cargo.toml b/Cargo.toml index 79acac1..fd75293 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] anyhow = "1.0.4" -bevy = { version = "0.10.0", features = ["serialize"] } +bevy = { version = "0.10.1", features = ["serialize"] } bevy_rapier3d = { version = "0.21.0", features = ["enhanced-determinism", "debug-render"] } bytemuck = "1.7" ron = "0.8.0" @@ -20,7 +20,7 @@ wgpu = "0.15.0" opt-level = 0 [profile.dev.package."*"] -opt-level = 3 +opt-level = 0 [profile.release] opt-level = 3 diff --git a/assets/shaders/simplex.wgsl b/assets/shaders/simplex.wgsl index bc57d02..d3a509f 100644 --- a/assets/shaders/simplex.wgsl +++ b/assets/shaders/simplex.wgsl @@ -36,9 +36,9 @@ fn simplexNoise2(v: vec2) -> f32 { return 130. * dot(m, g); } -@compute @workgroup_size(32, 32, 1) -fn main(@builtin(global_invocation_id) invocation_id: vec3) { - let index = invocation_id.x + invocation_id.y * 32u; +@workgroup_size(32, 32, 1) +@compute fn main(@builtin(global_invocation_id) invocation_id: vec3) { + let index = invocation_id.x + invocation_id.y * 16u; let in_point = in_points.data[index]; out_heights.data[index] = simplexNoise2(in_point); } diff --git a/assets/shaders/voxels.wgsl b/assets/shaders/voxels.wgsl index 68922d9..49ba290 100644 --- a/assets/shaders/voxels.wgsl +++ b/assets/shaders/voxels.wgsl @@ -4,8 +4,8 @@ struct Voxel { }; struct Atomics { - vertices_head: atomic, - indices_head: atomic, + vertex_head: atomic, + triangle_head: atomic, }; @group(0) @binding(0) @@ -21,15 +21,15 @@ var out_vertices: array>; @group(0) @binding(5) var out_normals: array>; @group(0) @binding(6) -var out_indices: array; +var out_triangles: array; @group(0) @binding(7) var out_uvs: array>; var workgroup_atomics: Atomics; -var workgroup_vertices: array, 2048>; -var workgroup_normals: array, 2048>; -var workgroup_indices: array; -var workgroup_uvs: array, 2048>; +var workgroup_vertices: array, 768>; +var workgroup_normals: array, 768>; +var workgroup_triangles: array; +var workgroup_uvs: array, 768>; const chunk_sz = 32; @@ -47,18 +47,18 @@ fn get_voxel_density(pos: vec3) -> f32 { return density; } -fn interp_vertex(p1: vec3, p2: vec3, v1: f32, v2: f32) -> vec3 { +fn interpolate_vertex(p1: vec3, p2: vec3, v1: f32, v2: f32) -> vec3 { let mu = (0.5 - v1) / (v2 - v1); return p1 + mu * (p2 - p1); } -@workgroup_size(8, 8, 8) +@workgroup_size(4, 4, 4) @compute fn main(@builtin(global_invocation_id) invocation_index: vec3, @builtin(local_invocation_index) workgroup_index: u32) { if (workgroup_index == 0u) { - atomicStore(&workgroup_atomics.vertices_head, 0u); - atomicStore(&workgroup_atomics.indices_head, 0u); + atomicStore(&workgroup_atomics.vertex_head, 0u); + atomicStore(&workgroup_atomics.triangle_head, 0u); } workgroupBarrier(); @@ -89,35 +89,35 @@ fn interp_vertex(p1: vec3, p2: vec3, v1: f32, v2: f32) -> vec3 { get_voxel_density(pos + vec3(1, 1, 0)), get_voxel_density(pos + vec3(0, 1, 0)), ); - cube_index |= u32(densities[0u] < 0.5) * (1u << 0u); - cube_index |= u32(densities[1u] < 0.5) * (1u << 1u); - cube_index |= u32(densities[2u] < 0.5) * (1u << 2u); - cube_index |= u32(densities[3u] < 0.5) * (1u << 3u); - cube_index |= u32(densities[4u] < 0.5) * (1u << 4u); - cube_index |= u32(densities[5u] < 0.5) * (1u << 5u); - cube_index |= u32(densities[6u] < 0.5) * (1u << 6u); - cube_index |= u32(densities[7u] < 0.5) * (1u << 7u); + cube_index |= select(0u, 1u << 0u, densities[0u] < 0.5); + cube_index |= select(0u, 1u << 1u, densities[1u] < 0.5); + cube_index |= select(0u, 1u << 2u, densities[2u] < 0.5); + cube_index |= select(0u, 1u << 3u, densities[3u] < 0.5); + cube_index |= select(0u, 1u << 4u, densities[4u] < 0.5); + cube_index |= select(0u, 1u << 5u, densities[5u] < 0.5); + cube_index |= select(0u, 1u << 6u, densities[6u] < 0.5); + cube_index |= select(0u, 1u << 7u, densities[7u] < 0.5); if (cube_index > 0x00u && cube_index < 0xffu) { var vertices = array, 12>( - interp_vertex(positions[0u], positions[1u], densities[0u], densities[1u]), - interp_vertex(positions[1u], positions[2u], densities[1u], densities[2u]), - interp_vertex(positions[2u], positions[3u], densities[2u], densities[3u]), - interp_vertex(positions[3u], positions[0u], densities[3u], densities[0u]), - interp_vertex(positions[4u], positions[5u], densities[4u], densities[5u]), - interp_vertex(positions[5u], positions[6u], densities[5u], densities[6u]), - interp_vertex(positions[6u], positions[7u], densities[6u], densities[7u]), - interp_vertex(positions[7u], positions[4u], densities[7u], densities[4u]), - interp_vertex(positions[0u], positions[4u], densities[0u], densities[4u]), - interp_vertex(positions[1u], positions[5u], densities[1u], densities[5u]), - interp_vertex(positions[2u], positions[6u], densities[2u], densities[6u]), - interp_vertex(positions[3u], positions[7u], densities[3u], densities[7u]), + interpolate_vertex(positions[0u], positions[1u], densities[0u], densities[1u]), + interpolate_vertex(positions[1u], positions[2u], densities[1u], densities[2u]), + interpolate_vertex(positions[2u], positions[3u], densities[2u], densities[3u]), + interpolate_vertex(positions[3u], positions[0u], densities[3u], densities[0u]), + interpolate_vertex(positions[4u], positions[5u], densities[4u], densities[5u]), + interpolate_vertex(positions[5u], positions[6u], densities[5u], densities[6u]), + interpolate_vertex(positions[6u], positions[7u], densities[6u], densities[7u]), + interpolate_vertex(positions[7u], positions[4u], densities[7u], densities[4u]), + interpolate_vertex(positions[0u], positions[4u], densities[0u], densities[4u]), + interpolate_vertex(positions[1u], positions[5u], densities[1u], densities[5u]), + interpolate_vertex(positions[2u], positions[6u], densities[2u], densities[6u]), + interpolate_vertex(positions[3u], positions[7u], densities[3u], densities[7u]), ); var triangle_index: u32 = 0u; loop { - let start_vertex_index = atomicAdd(&workgroup_atomics.vertices_head, 3u); - let start_indices_index = atomicAdd(&workgroup_atomics.indices_head, 3u); + let start_vertex_index = atomicAdd(&workgroup_atomics.vertex_head, 3u); + let start_triangle_index = atomicAdd(&workgroup_atomics.triangle_head, 3u); let v0 = vertices[triangle_table[cube_index][triangle_index + 0u]]; let v1 = vertices[triangle_table[cube_index][triangle_index + 1u]]; @@ -127,9 +127,9 @@ fn interp_vertex(p1: vec3, p2: vec3, v1: f32, v2: f32) -> vec3 { workgroup_vertices[start_vertex_index + 1u] = v1; workgroup_vertices[start_vertex_index + 2u] = v2; - workgroup_indices[start_indices_index + 0u] = start_vertex_index + 0u; - workgroup_indices[start_indices_index + 1u] = start_vertex_index + 1u; - workgroup_indices[start_indices_index + 2u] = start_vertex_index + 2u; + workgroup_triangles[start_triangle_index + 0u] = start_vertex_index + 0u; + workgroup_triangles[start_triangle_index + 1u] = start_vertex_index + 1u; + workgroup_triangles[start_triangle_index + 2u] = start_vertex_index + 2u; let normal = normalize(cross(v1 - v0, v2 - v0)); workgroup_normals[start_vertex_index + 0u] = normal; @@ -166,36 +166,36 @@ fn interp_vertex(p1: vec3, p2: vec3, v1: f32, v2: f32) -> vec3 { if (adj_density < 0.5) { var pos = vec3(invocation_index); - let start_vertex_index = atomicAdd(&out_atomics.vertices_head, 4u); - let start_triangle_index = atomicAdd(&out_atomics.indices_head, 6u); + let start_vertex_index = atomicAdd(&workgroup_atomics.vertex_head, 4u); + let start_triangle_index = atomicAdd(&workgroup_atomics.triangle_head, 6u); let v0 = block_faces_table[dir][0u]; let v1 = block_faces_table[dir][1u]; let v2 = block_faces_table[dir][2u]; let v3 = block_faces_table[dir][3u]; - out_vertices[start_vertex_index + 0u] = pos + v0; - out_vertices[start_vertex_index + 1u] = pos + v1; - out_vertices[start_vertex_index + 2u] = pos + v2; - out_vertices[start_vertex_index + 3u] = pos + v3; + workgroup_vertices[start_vertex_index + 0u] = pos + v0; + workgroup_vertices[start_vertex_index + 1u] = pos + v1; + workgroup_vertices[start_vertex_index + 2u] = pos + v2; + workgroup_vertices[start_vertex_index + 3u] = pos + v3; let normal = cross(v0 - v1, v0 - v2); - out_normals[start_vertex_index + 0u] = normal; - out_normals[start_vertex_index + 1u] = normal; - out_normals[start_vertex_index + 2u] = normal; - out_normals[start_vertex_index + 3u] = normal; - - out_uvs[start_vertex_index + 0u] = vec2(0.0, 0.0); - out_uvs[start_vertex_index + 1u] = vec2(1.0, 0.0); - out_uvs[start_vertex_index + 2u] = vec2(1.0, 1.0); - out_uvs[start_vertex_index + 3u] = vec2(0.0, 1.0); - - out_indices[start_triangle_index + 0u] = start_vertex_index + 0u; - out_indices[start_triangle_index + 1u] = start_vertex_index + 1u; - out_indices[start_triangle_index + 2u] = start_vertex_index + 2u; - out_indices[start_triangle_index + 3u] = start_vertex_index + 0u; - out_indices[start_triangle_index + 4u] = start_vertex_index + 2u; - out_indices[start_triangle_index + 5u] = start_vertex_index + 3u; + workgroup_normals[start_vertex_index + 0u] = normal; + workgroup_normals[start_vertex_index + 1u] = normal; + workgroup_normals[start_vertex_index + 2u] = normal; + workgroup_normals[start_vertex_index + 3u] = normal; + + workgroup_uvs[start_vertex_index + 0u] = vec2(0.0, 0.0); + workgroup_uvs[start_vertex_index + 1u] = vec2(1.0, 0.0); + workgroup_uvs[start_vertex_index + 2u] = vec2(1.0, 1.0); + workgroup_uvs[start_vertex_index + 3u] = vec2(0.0, 1.0); + + workgroup_triangles[start_triangle_index + 0u] = start_vertex_index + 0u; + workgroup_triangles[start_triangle_index + 1u] = start_vertex_index + 1u; + workgroup_triangles[start_triangle_index + 2u] = start_vertex_index + 2u; + workgroup_triangles[start_triangle_index + 3u] = start_vertex_index + 0u; + workgroup_triangles[start_triangle_index + 4u] = start_vertex_index + 2u; + workgroup_triangles[start_triangle_index + 5u] = start_vertex_index + 3u; } dir += 1u; @@ -208,7 +208,8 @@ fn interp_vertex(p1: vec3, p2: vec3, v1: f32, v2: f32) -> vec3 { workgroupBarrier(); if (workgroup_index == 0u) { - let start_vertex_index = atomicAdd(&out_atomics.vertices_head, workgroup_atomics.vertices_head); + let workgroup_vertex_count = atomicLoad(&workgroup_atomics.vertex_head); + let start_vertex_index = atomicAdd(&out_atomics.vertex_head, workgroup_vertex_count); var vertex_index: u32 = 0u; loop { let out_index = start_vertex_index + vertex_index; @@ -222,22 +223,27 @@ fn interp_vertex(p1: vec3, p2: vec3, v1: f32, v2: f32) -> vec3 { out_uvs[out_index + 1u] = workgroup_uvs[vertex_index + 1u]; out_uvs[out_index + 2u] = workgroup_uvs[vertex_index + 2u]; +// out_triangles[out_index + 0u] = out_index + 0u; +// out_triangles[out_index + 1u] = out_index + 1u; +// out_triangles[out_index + 2u] = out_index + 2u; + vertex_index += 3u; - if (vertex_index >= workgroup_atomics.vertices_head) { + if (vertex_index >= workgroup_vertex_count) { break; } } - let start_triangle_index = atomicAdd(&out_atomics.indices_head, workgroup_atomics.indices_head); + let workgroup_triangle_count = atomicLoad(&workgroup_atomics.triangle_head); + let start_triangle_index = atomicAdd(&out_atomics.triangle_head, workgroup_triangle_count); var triangle_index: u32 = 0u; loop { let out_index = start_triangle_index + triangle_index; - out_indices[out_index + 0u] = start_vertex_index + workgroup_indices[triangle_index + 0u]; - out_indices[out_index + 1u] = start_vertex_index + workgroup_indices[triangle_index + 1u]; - out_indices[out_index + 2u] = start_vertex_index + workgroup_indices[triangle_index + 2u]; + out_triangles[out_index + 0u] = start_vertex_index + workgroup_triangles[triangle_index + 0u]; + out_triangles[out_index + 1u] = start_vertex_index + workgroup_triangles[triangle_index + 1u]; + out_triangles[out_index + 2u] = start_vertex_index + workgroup_triangles[triangle_index + 2u]; triangle_index += 3u; - if (triangle_index >= workgroup_atomics.indices_head) { + if (triangle_index >= workgroup_triangle_count) { break; } } diff --git a/src/main.rs b/src/main.rs index f2134c6..616a756 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,8 +13,8 @@ use bevy::{ mesh::{Indices, VertexAttributeValues}, render_resource::*, }, + render::view::NoFrustumCulling, }; -use bevy::render::view::NoFrustumCulling; use bevy_rapier3d::prelude::*; use qgame::*; diff --git a/src/qgame/voxel.rs b/src/qgame/voxel.rs index 3159398..0b01534 100644 --- a/src/qgame/voxel.rs +++ b/src/qgame/voxel.rs @@ -22,7 +22,7 @@ use crate::*; const CHUNK_SZ: usize = 32; const CHUNK_SZ_2: usize = CHUNK_SZ * CHUNK_SZ; const CHUNK_SZ_3: usize = CHUNK_SZ * CHUNK_SZ * CHUNK_SZ; -const COMPUTE_TILE_SZ: usize = 8; +const COMPUTE_TILE_SZ: usize = 4; #[derive(Component)] pub struct Chunk { @@ -225,7 +225,7 @@ pub fn voxel_polygonize_system( let mut pass = command_encoder.begin_compute_pass(&ComputePassDescriptor::default()); pass.set_pipeline(&pipeline.simplex_pipeline); pass.set_bind_group(0, &binding_groups.simplex, &[]); - pass.dispatch_workgroups((CHUNK_SZ / 32) as u32, (CHUNK_SZ / 32) as u32, 1); + pass.dispatch_workgroups(1, 1, 1); } buffers.heights.encode_read(CHUNK_SZ_2, &mut command_encoder); render_queue.submit(once(command_encoder.finish())); @@ -237,7 +237,8 @@ pub fn voxel_polygonize_system( for y in 0..CHUNK_SZ { for x in 0..CHUNK_SZ { let noise01 = (buffers.heights.as_slice()[x + z * CHUNK_SZ] + 1.0) * 0.5; - let height = noise01 * 4.0 + 8.0 - (y as f32); + // let height = noise01 * 4.0 + 8.0 - (y as f32); + let height = noise01 * 1.0 + 2.0 - (y as f32); let mut density = 0.0; if height > 1.0 { @@ -327,7 +328,7 @@ pub fn voxel_polygonize_system( } // TODO:perf inefficient - commands.entity(entity).insert(Collider::from_bevy_mesh(mesh, &ComputedColliderShape::TriMesh).unwrap()); + // commands.entity(entity).insert(Collider::from_bevy_mesh(mesh, &ComputedColliderShape::TriMesh).unwrap()); } // println!("Elapsed: {:.2?}", now.elapsed());