7 bindings::{globals, view, VertexOutput, TaskPayload}, 10enable wgpu_mesh_shader; 12fn position_world_to_clip(world_pos: vec3<f32>) -> vec4<f32> { 13 let clip_pos = view.clip_from_world * vec4(world_pos, 1.0); 17fn mesh_position_local_to_world(world_from_local: mat4x4<f32>, vertex_position: vec4<f32>) -> vec4<f32> { 18 return world_from_local * vertex_position; 23const half_size = vec3(0.1); 24const min = -half_size; 29const vertices = array( 32 min.x, min.y, max.z, 0.0, 0.0, 1.0, 0.0, 0.0, 33 max.x, min.y, max.z, 0.0, 0.0, 1.0, 1.0, 0.0, 34 max.x, max.y, max.z, 0.0, 0.0, 1.0, 1.0, 1.0, 35 min.x, max.y, max.z, 0.0, 0.0, 1.0, 0.0, 1.0, 37 min.x, max.y, min.z, 0.0, 0.0, -1.0, 1.0, 0.0, 38 max.x, max.y, min.z, 0.0, 0.0, -1.0, 0.0, 0.0, 39 max.x, min.y, min.z, 0.0, 0.0, -1.0, 0.0, 1.0, 40 min.x, min.y, min.z, 0.0, 0.0, -1.0, 1.0, 1.0, 42 max.x, min.y, min.z, 1.0, 0.0, 0.0, 0.0, 0.0, 43 max.x, max.y, min.z, 1.0, 0.0, 0.0, 1.0, 0.0, 44 max.x, max.y, max.z, 1.0, 0.0, 0.0, 1.0, 1.0, 45 max.x, min.y, max.z, 1.0, 0.0, 0.0, 0.0, 1.0, 47 min.x, min.y, max.z, -1.0, 0.0, 0.0, 1.0, 0.0, 48 min.x, max.y, max.z, -1.0, 0.0, 0.0, 0.0, 0.0, 49 min.x, max.y, min.z, -1.0, 0.0, 0.0, 0.0, 1.0, 50 min.x, min.y, min.z, -1.0, 0.0, 0.0, 1.0, 1.0, 52 max.x, max.y, min.z, 0.0, 1.0, 0.0, 1.0, 0.0, 53 min.x, max.y, min.z, 0.0, 1.0, 0.0, 0.0, 0.0, 54 min.x, max.y, max.z, 0.0, 1.0, 0.0, 0.0, 1.0, 55 max.x, max.y, max.z, 0.0, 1.0, 0.0, 1.0, 1.0, 57 max.x, min.y, max.z, 0.0, -1.0, 0.0, 0.0, 0.0, 58 min.x, min.y, max.z, 0.0, -1.0, 0.0, 1.0, 0.0, 59 min.x, min.y, min.z, 0.0, -1.0, 0.0, 1.0, 1.0, 60 max.x, min.y, min.z, 0.0, -1.0, 0.0, 0.0, 1.0 68 12, 13, 14, 14, 15, 12, 69 16, 17, 18, 18, 19, 16, 70 20, 21, 22, 22, 23, 20, 74struct PrimitiveOutput { 75 @builtin(triangle_indices) indices: vec3<u32>, 76 @builtin(cull_primitive) cull: bool, 77 @per_primitive @location(3) colorMask: vec4<f32>, 80var<task_payload> taskPayload: TaskPayload; 83 @builtin(vertices) vertices: array<VertexOutput, 24>, 84 @builtin(primitives) primitives: array<PrimitiveOutput, 12>, 85 @builtin(vertex_count) vertex_count: u32, 86 @builtin(primitive_count) primitive_count: u32, 89var<workgroup> mesh_output: MeshOutput; 92 @builtin(global_invocation_id) global_invocation_id: vec3u, 93 @builtin(num_workgroups) num_workgroups: vec3u, 94 @builtin(workgroup_id) workgroup_id: vec3u 100fn mesh(mesh_input: MeshInput) { 101 mesh_output.vertex_count = 24; 102 mesh_output.primitive_count = 12; 108 let world_from_local = mat4x4( 109 vec4(1., 0., 0., 0,), 110 vec4(0., 1., 0., 0.), 111 vec4(0., 0., 1., 0.), 113 f32(mesh_input.global_invocation_id.x), 114 f32(mesh_input.global_invocation_id.y), 115 f32(mesh_input.global_invocation_id.z), 121 for (var i: i32 = 0; i < 24; i++) { 123 mesh_output.vertices[i].position = position_world_to_clip( 124 mesh_position_local_to_world(world_from_local, 125 vec4(vertices[offset] , vertices[offset + 1], vertices[offset + 2], 1.) 128 mesh_output.vertices[i].normal = vec3(vertices[offset + 3], vertices[offset + 4], vertices[offset + 5]); 129 mesh_output.vertices[i].uv = vec2(vertices[offset + 6], vertices[offset + 7]); 135 let colorMask = vec4<f32>( 136 vec3f(mesh_input.global_invocation_id.xyz) / vec3f(mesh_input.num_workgroups.xyz), 140 for (var i: i32 = 0; i < 12; i++) { 143 mesh_output.primitives[i].indices = vec3<u32>(u32(indices[offset]), u32(indices[offset + 1]), u32(indices[offset + 2])); 145 mesh_output.primitives[i].cull = sin(globals.time * 10. + f32(mesh_input.global_invocation_id.x) + f32(mesh_input.global_invocation_id.y) + f32(mesh_input.global_invocation_id.z) ) > 0.8; 147 mesh_output.primitives[i].colorMask = colorMask * taskPayload.colorMask;