#import bevy_pbr::{ mesh_bindings::mesh, mesh_functions, skinning, morph::morph, forward_io::{Vertex, VertexOutput}, view_transformations::position_world_to_clip, } @vertex fn vertex(vertex: Vertex) -> VertexOutput { var out: VertexOutput; let mesh_world_from_local = mesh_functions::get_world_from_local(vertex.instance_index); #ifdef SKINNED var world_from_local = skinning::skin_model( vertex.joint_indices, vertex.joint_weights, vertex.instance_index ); #else var world_from_local = mesh_world_from_local; #endif #ifdef VERTEX_NORMALS #ifdef SKINNED out.world_normal = skinning::skin_normals(world_from_local, vertex.normal); #else out.world_normal = mesh_functions::mesh_normal_local_to_world( vertex.normal, vertex.instance_index ); #endif #endif #ifdef VERTEX_POSITIONS out.world_position = mesh_functions::mesh_position_local_to_world(world_from_local, vec4(vertex.position, 1.0)); out.position = position_world_to_clip(out.world_position.xyz); #endif #ifdef VERTEX_UVS_A out.uv = vertex.uv; #endif #ifdef VERTEX_UVS_B out.uv_b = vertex.uv_b; #endif #ifdef VERTEX_TANGENTS out.world_tangent = mesh_functions::mesh_tangent_local_to_world( world_from_local, vertex.tangent, vertex.instance_index ); #endif #ifdef VERTEX_COLORS out.color = vertex.color; #endif #ifdef VERTEX_OUTPUT_INSTANCE_INDEX out.instance_index = vertex.instance_index; #endif #ifdef VISIBILITY_RANGE_DITHER out.visibility_range_dither = mesh_functions::get_visibility_range_dither_level( vertex.instance_index, mesh_world_from_local[3] ); #endif return out; }