5 prepass_io::{Vertex, VertexOutput, FragmentOutput}, 8 mesh_view_bindings::view, 9 view_transformations::position_world_to_clip, 12#ifdef DEFERRED_PREPASS 13#import bevy_pbr::rgb9e5 17fn morph_vertex(vertex_in: Vertex) -> Vertex { 18 var vertex = vertex_in; 19 let first_vertex = mesh[vertex.instance_index].first_vertex_index; 20 let vertex_index = vertex.index - first_vertex; 22 let weight_count = morph::layer_count(); 23 for (var i: u32 = 0u; i < weight_count; i ++) { 24 let weight = morph::weight_at(i); 28 vertex.position += weight * morph::morph(vertex_index, morph::position_offset, i); 30 vertex.normal += weight * morph::morph(vertex_index, morph::normal_offset, i); 33 vertex.tangent += vec4(weight * morph::morph(vertex_index, morph::tangent_offset, i), 0.0); 43fn morph_prev_vertex(vertex_in: Vertex) -> Vertex { 44 var vertex = vertex_in; 45 let weight_count = morph::layer_count(); 46 for (var i: u32 = 0u; i < weight_count; i ++) { 47 let weight = morph::prev_weight_at(i); 51 vertex.position += weight * morph::morph(vertex.index, morph::position_offset, i); 57#endif // MORPH_TARGETS 60fn vertex(vertex_no_morph: Vertex) -> VertexOutput { 61 var out: VertexOutput; 64 var vertex = morph_vertex(vertex_no_morph); 66 var vertex = vertex_no_morph; 70 var world_from_local = skinning::skin_model(vertex.joint_indices, vertex.joint_weights); 74 var world_from_local = mesh_functions::get_world_from_local(vertex_no_morph.instance_index); 77 out.world_position = mesh_functions::mesh_position_local_to_world(world_from_local, vec4<f32>(vertex.position, 1.0)); 78 out.position = position_world_to_clip(out.world_position.xyz); 79#ifdef DEPTH_CLAMP_ORTHO 80 out.clip_position_unclamped = out.position; 81 out.position.z = min(out.position.z, 1.0); 82#endif // DEPTH_CLAMP_ORTHO 89 out.uv_b = vertex.uv_b; 92#ifdef NORMAL_PREPASS_OR_DEFERRED_PREPASS 94 out.world_normal = skinning::skin_normals(world_from_local, vertex.normal); 96 out.world_normal = mesh_functions::mesh_normal_local_to_world( 100 vertex_no_morph.instance_index 104#ifdef VERTEX_TANGENTS 105 out.world_tangent = mesh_functions::mesh_tangent_local_to_world( 110 vertex_no_morph.instance_index 112#endif // VERTEX_TANGENTS 113#endif // NORMAL_PREPASS_OR_DEFERRED_PREPASS 116 out.color = vertex.color; 121#ifdef MOTION_VECTOR_PREPASS 126#ifdef HAS_PREVIOUS_MORPH 127 let prev_vertex = morph_prev_vertex(vertex_no_morph); 128#else // HAS_PREVIOUS_MORPH 129 let prev_vertex = vertex_no_morph; 130#endif // HAS_PREVIOUS_MORPH 132#else // MORPH_TARGETS 133 let prev_vertex = vertex_no_morph; 134#endif // MORPH_TARGETS 139#ifdef HAS_PREVIOUS_SKIN 140 let prev_model = skinning::skin_prev_model( 141 prev_vertex.joint_indices, 142 prev_vertex.joint_weights, 144#else // HAS_PREVIOUS_SKIN 145 let prev_model = mesh_functions::get_previous_world_from_local(prev_vertex.instance_index); 146#endif // HAS_PREVIOUS_SKIN 149 let prev_model = mesh_functions::get_previous_world_from_local(prev_vertex.instance_index); 152 out.previous_world_position = mesh_functions::mesh_position_local_to_world( 154 vec4<f32>(prev_vertex.position, 1.0) 156#endif // MOTION_VECTOR_PREPASS 158#ifdef VERTEX_OUTPUT_INSTANCE_INDEX 161 out.instance_index = vertex_no_morph.instance_index; 167#ifdef PREPASS_FRAGMENT 169fn fragment(in: VertexOutput) -> FragmentOutput { 170 var out: FragmentOutput; 173 out.normal = vec4(in.world_normal * 0.5 + vec3(0.5), 1.0); 176#ifdef DEPTH_CLAMP_ORTHO 177 out.frag_depth = in.clip_position_unclamped.z; 178#endif // DEPTH_CLAMP_ORTHO 180#ifdef MOTION_VECTOR_PREPASS 181 let clip_position_t = view.unjittered_clip_from_world * in.world_position; 182 let clip_position = clip_position_t.xy / clip_position_t.w; 183 let previous_clip_position_t = prepass_bindings::previous_view_uniforms.clip_from_world * in.previous_world_position; 184 let previous_clip_position = previous_clip_position_t.xy / previous_clip_position_t.w; 191 out.motion_vector = (clip_position - previous_clip_position) * vec2(0.5, -0.5); 192#endif // MOTION_VECTOR_PREPASS 194#ifdef DEFERRED_PREPASS 199 out.deferred = vec4(0u, bevy_pbr::rgb9e5::vec3_to_rgb9e5_(vec3(1.0, 0.0, 1.0)), 0u, 0u); 200 out.deferred_lighting_pass_id = 1u; 205#endif // PREPASS_FRAGMENT