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; 69 let mesh_world_from_local = mesh_functions::get_world_from_local(vertex_no_morph.instance_index); 72 var world_from_local = skinning::skin_model( 75 vertex_no_morph.instance_index 80 var world_from_local = mesh_world_from_local; 83 out.world_position = mesh_functions::mesh_position_local_to_world(world_from_local, vec4<f32>(vertex.position, 1.0)); 84 out.position = position_world_to_clip(out.world_position.xyz); 85#ifdef UNCLIPPED_DEPTH_ORTHO_EMULATION 86 out.unclipped_depth = out.position.z; 87 out.position.z = min(out.position.z, 1.0); 88#endif // UNCLIPPED_DEPTH_ORTHO_EMULATION 95 out.uv_b = vertex.uv_b; 98#ifdef NORMAL_PREPASS_OR_DEFERRED_PREPASS 101 out.world_normal = skinning::skin_normals(world_from_local, vertex.normal); 103 out.world_normal = mesh_functions::mesh_normal_local_to_world( 107 vertex_no_morph.instance_index 110#endif // VERTEX_NORMALS 112#ifdef VERTEX_TANGENTS 113 out.world_tangent = mesh_functions::mesh_tangent_local_to_world( 118 vertex_no_morph.instance_index 120#endif // VERTEX_TANGENTS 121#endif // NORMAL_PREPASS_OR_DEFERRED_PREPASS 124 out.color = vertex.color; 129#ifdef MOTION_VECTOR_PREPASS 134#ifdef HAS_PREVIOUS_MORPH 135 let prev_vertex = morph_prev_vertex(vertex_no_morph); 136#else // HAS_PREVIOUS_MORPH 137 let prev_vertex = vertex_no_morph; 138#endif // HAS_PREVIOUS_MORPH 140#else // MORPH_TARGETS 141 let prev_vertex = vertex_no_morph; 142#endif // MORPH_TARGETS 147#ifdef HAS_PREVIOUS_SKIN 148 let prev_model = skinning::skin_prev_model( 149 prev_vertex.joint_indices, 150 prev_vertex.joint_weights, 151 vertex_no_morph.instance_index 153#else // HAS_PREVIOUS_SKIN 154 let prev_model = mesh_functions::get_previous_world_from_local(prev_vertex.instance_index); 155#endif // HAS_PREVIOUS_SKIN 158 let prev_model = mesh_functions::get_previous_world_from_local(prev_vertex.instance_index); 161 out.previous_world_position = mesh_functions::mesh_position_local_to_world( 163 vec4<f32>(prev_vertex.position, 1.0) 165#endif // MOTION_VECTOR_PREPASS 167#ifdef VERTEX_OUTPUT_INSTANCE_INDEX 170 out.instance_index = vertex_no_morph.instance_index; 173#ifdef VISIBILITY_RANGE_DITHER 174 out.visibility_range_dither = mesh_functions::get_visibility_range_dither_level( 175 vertex_no_morph.instance_index, mesh_world_from_local[3]); 176#endif // VISIBILITY_RANGE_DITHER 181#ifdef PREPASS_FRAGMENT 183fn fragment(in: VertexOutput) -> FragmentOutput { 184 var out: FragmentOutput; 187 out.normal = vec4(in.world_normal * 0.5 + vec3(0.5), 1.0); 190#ifdef UNCLIPPED_DEPTH_ORTHO_EMULATION 191 out.frag_depth = in.unclipped_depth; 192#endif // UNCLIPPED_DEPTH_ORTHO_EMULATION 194#ifdef MOTION_VECTOR_PREPASS 195 let clip_position_t = view.unjittered_clip_from_world * in.world_position; 196 let clip_position = clip_position_t.xy / clip_position_t.w; 197 let previous_clip_position_t = prepass_bindings::previous_view_uniforms.clip_from_world * in.previous_world_position; 198 let previous_clip_position = previous_clip_position_t.xy / previous_clip_position_t.w; 205 out.motion_vector = (clip_position - previous_clip_position) * vec2(0.5, -0.5); 206#endif // MOTION_VECTOR_PREPASS 208#ifdef DEFERRED_PREPASS 213 out.deferred = vec4(0u, bevy_pbr::rgb9e5::vec3_to_rgb9e5_(vec3(1.0, 0.0, 1.0)), 0u, 0u); 214 out.deferred_lighting_pass_id = 1u; 219#endif // PREPASS_FRAGMENT