#import bevy_pbr::mesh_view_bind_group #import bevy_pbr::mesh_struct struct Vertex { [[location(0)]] position: vec3; [[location(1)]] normal: vec3; [[location(2)]] uv: vec2; #ifdef VERTEX_TANGENTS [[location(3)]] tangent: vec4; #endif #ifdef SKINNED [[location(4)]] joint_indices: vec4; [[location(5)]] joint_weights: vec4; #endif }; struct VertexOutput { [[builtin(position)]] clip_position: vec4; [[location(0)]] world_position: vec4; [[location(1)]] world_normal: vec3; [[location(2)]] uv: vec2; #ifdef VERTEX_TANGENTS [[location(3)]] world_tangent: vec4; #endif }; [[group(2), binding(0)]] var mesh: Mesh; #ifdef SKINNED [[group(2), binding(1)]] var joint_matrices: SkinnedMesh; #import bevy_pbr::skinning #endif [[stage(vertex)]] fn vertex(vertex: Vertex) -> VertexOutput { var out: VertexOutput; #ifdef SKINNED var model = skin_model(vertex.joint_indices, vertex.joint_weights); out.world_position = model * vec4(vertex.position, 1.0); out.world_normal = skin_normals(model, vertex.normal); #ifdef VERTEX_TANGENTS out.world_tangent = skin_tangents(model, vertex.tangent); #endif #else out.world_position = mesh.model * vec4(vertex.position, 1.0); out.world_normal = mat3x3( mesh.inverse_transpose_model[0].xyz, mesh.inverse_transpose_model[1].xyz, mesh.inverse_transpose_model[2].xyz ) * vertex.normal; #ifdef VERTEX_TANGENTS out.world_tangent = vec4( mat3x3( mesh.model[0].xyz, mesh.model[1].xyz, mesh.model[2].xyz ) * vertex.tangent.xyz, vertex.tangent.w ); #endif #endif out.uv = vertex.uv; out.clip_position = view.view_proj * out.world_position; return out; } struct FragmentInput { [[builtin(front_facing)]] is_front: bool; [[location(0)]] world_position: vec4; [[location(1)]] world_normal: vec3; [[location(2)]] uv: vec2; #ifdef VERTEX_TANGENTS [[location(3)]] world_tangent: vec4; #endif }; [[stage(fragment)]] fn fragment(in: FragmentInput) -> [[location(0)]] vec4 { return vec4(1.0, 0.0, 1.0, 1.0); }