1import package::render::{ 5 VISIBILITY_RANGE_UNIFORM_BUFFER_SIZE 7 mesh_bindings::{mesh, metadata}, 8 mesh_types::{MESH_FLAGS_SIGN_DETERMINANT_MODEL_3X3_BIT}, 9 view_transformations::position_world_to_clip, 11import bevy_render::maths::{affine3_to_square, mat2x4_f32_to_mat3x3_unpack}; 12import bevy_render::mesh::metadata_types::MeshMetadata; 14@if(!MESHLET_MESH_MATERIAL_PASS) 15fn get_world_from_local(instance_index: u32) -> mat4x4<f32> { 16 return affine3_to_square(mesh[instance_index].world_from_local); 19@if(!MESHLET_MESH_MATERIAL_PASS) 20fn get_previous_world_from_local(instance_index: u32) -> mat4x4<f32> { 21 return affine3_to_square(mesh[instance_index].previous_world_from_local); 24@if(!MESHLET_MESH_MATERIAL_PASS) 25fn get_local_from_world(instance_index: u32) -> mat4x4<f32> { 29 let inverse_model_3x3 = transpose(mat2x4_f32_to_mat3x3_unpack( 30 mesh[instance_index].local_from_world_transpose_a, 31 mesh[instance_index].local_from_world_transpose_b, 34 let inverse_model_4x4_no_trans = mat4x4<f32>( 35 vec4(inverse_model_3x3[0], 0.0), 36 vec4(inverse_model_3x3[1], 0.0), 37 vec4(inverse_model_3x3[2], 0.0), 41 let model = get_world_from_local(instance_index); 42 let inverse_model_4x4_only_trans = mat4x4<f32>( 43 vec4(1.0,0.0,0.0,0.0), 44 vec4(0.0,1.0,0.0,0.0), 45 vec4(0.0,0.0,1.0,0.0), 46 vec4(-model[3].xyz, 1.0) 49 return inverse_model_4x4_no_trans * inverse_model_4x4_only_trans; 52fn mesh_position_local_to_world(world_from_local: mat4x4<f32>, vertex_position: vec4<f32>) -> vec4<f32> { 53 return world_from_local * vertex_position; 59fn mesh_position_local_to_clip(world_from_local: mat4x4<f32>, vertex_position: vec4<f32>) -> vec4<f32> { 60 let world_position = mesh_position_local_to_world(world_from_local, vertex_position); 61 return position_world_to_clip(world_position.xyz); 64@if(!MESHLET_MESH_MATERIAL_PASS) 65fn mesh_normal_local_to_world(vertex_normal: vec3<f32>, instance_index: u32) -> vec3<f32> { 73 if any(vertex_normal != vec3<f32>(0.0)) { 75 mat2x4_f32_to_mat3x3_unpack( 76 mesh[instance_index].local_from_world_transpose_a, 77 mesh[instance_index].local_from_world_transpose_b, 87fn sign_determinant_model_3x3m(mesh_flags: u32) -> f32 { 91 return f32(bool(mesh_flags & MESH_FLAGS_SIGN_DETERMINANT_MODEL_3X3_BIT)) * 2.0 - 1.0; 94@if(!MESHLET_MESH_MATERIAL_PASS) 95fn mesh_tangent_local_to_world(world_from_local: mat4x4<f32>, vertex_tangent: vec4<f32>, instance_index: u32) -> vec4<f32> { 103 if any(vertex_tangent != vec4<f32>(0.0)) { 107 world_from_local[0].xyz, 108 world_from_local[1].xyz, 109 world_from_local[2].xyz, 110 ) * vertex_tangent.xyz 114 vertex_tangent.w * sign_determinant_model_3x3m(mesh[instance_index].flags) 117 return vertex_tangent; 125@if(VISIBILITY_RANGE_DITHER) 126fn get_visibility_range_dither_level(instance_index: u32, world_position: vec4<f32>) -> i32 { 127@if(AVAILABLE_STORAGE_BUFFER_BINDINGS__GE_6) 129 let visibility_buffer_array_len = arrayLength(&visibility_ranges); 132 let visibility_buffer_array_len = VISIBILITY_RANGE_UNIFORM_BUFFER_SIZE; 134 let visibility_buffer_index = mesh[instance_index].flags & 0xffffu; 135 if (visibility_buffer_index > visibility_buffer_array_len) { 139 let lod_range = visibility_ranges[visibility_buffer_index]; 140 let camera_distance = length(view.lod_view_world_position.xyz - world_position.xyz); 147 let offset = select(-16, 0, camera_distance >= lod_range.z); 148 let bounds = select(lod_range.xy, lod_range.zw, camera_distance >= lod_range.z); 149 let level = i32(round((camera_distance - bounds.x) / (bounds.y - bounds.x) * 16.0)); 150 return offset + clamp(level, 0, 16); 154@if(!MESHLET_MESH_MATERIAL_PASS) 155fn get_tag(instance_index: u32) -> u32 { 156 return mesh[instance_index].tag; 159@if(!MESHLET_MESH_MATERIAL_PASS) 160fn get_metadata(instance_index: u32) -> MeshMetadata { 161@if(METADATA_USE_UNIFORM_BUFFERS) 164 return metadata[mesh[instance_index].metadata_index];