#import bevy_pbr::mesh_bindings mesh #import bevy_pbr::mesh_functions get_model_matrix, mesh_position_local_to_clip #import bevy_pbr::morph #ifdef SKINNED #import bevy_pbr::skinning #endif struct Vertex { @builtin(instance_index) instance_index: u32, @location(0) position: vec3, #ifdef SKINNED @location(5) joint_indexes: vec4, @location(6) joint_weights: vec4, #endif #ifdef MORPH_TARGETS @builtin(vertex_index) index: u32, #endif }; struct VertexOutput { @builtin(position) clip_position: vec4, }; #ifdef MORPH_TARGETS fn morph_vertex(vertex_in: Vertex) -> Vertex { var vertex = vertex_in; let weight_count = bevy_pbr::morph::layer_count(); for (var i: u32 = 0u; i < weight_count; i ++) { let weight = bevy_pbr::morph::weight_at(i); if weight == 0.0 { continue; } vertex.position += weight * bevy_pbr::morph::morph(vertex.index, bevy_pbr::morph::position_offset, i); } return vertex; } #endif @vertex fn vertex(vertex_no_morph: Vertex) -> VertexOutput { #ifdef MORPH_TARGETS var vertex = morph_vertex(vertex_no_morph); #else var vertex = vertex_no_morph; #endif #ifdef SKINNED let model = bevy_pbr::skinning::skin_model(vertex.joint_indexes, vertex.joint_weights); #else // Use vertex_no_morph.instance_index instead of vertex.instance_index to work around a wgpu dx12 bug. // See https://github.com/gfx-rs/naga/issues/2416 . let model = get_model_matrix(vertex_no_morph.instance_index); #endif var out: VertexOutput; out.clip_position = mesh_position_local_to_clip(model, vec4(vertex.position, 1.0)); return out; } @fragment fn fragment() -> @location(0) vec4 { return vec4(1.0, 1.0, 1.0, 1.0); }