#include oct_encoding.wgsl #include skin.wgsl struct SkinningUniform { transform: mat4x4, src_offset: u32, dst_offset: u32, count: u32, }; @group(0) @binding(0) var skinning_ubo: SkinningUniform; @group(0) @binding(1) var dst_vertices: SkinnedVertexArray; @group(0) @binding(2) var src_vertices: SkinnedVertexArray; @compute @workgroup_size(64) fn cs_main( @builtin(global_invocation_id) global_invocation_id: vec3, ) { let vertex_index = global_invocation_id.x; if (vertex_index >= skinning_ubo.count) { return; } let src_index = skinning_ubo.src_offset + vertex_index; let dst_index = skinning_ubo.dst_offset + vertex_index; let ptf = src_vertices.data[src_index].ptf; let position = ptf.xyz; let tan_frame = bitcast(ptf.w); let transform = skinning_ubo.transform; let position = transform * vec4(position, 1.0); let tan_frame = tan_frame_transform(tan_frame, transform); let dst_ptf = vec4(position.xyz, bitcast(tan_frame)); dst_vertices.data[dst_index].ptf = dst_ptf; }