1#define_import_path bevy_pbr::view_transformations 3#import bevy_pbr::mesh_view_bindings as view_bindings 33fn position_view_to_world(view_pos: vec3<f32>) -> vec3<f32> { 34 let world_pos = view_bindings::view.world_from_view * vec4(view_pos, 1.0); 39fn position_clip_to_world(clip_pos: vec4<f32>) -> vec3<f32> { 40 let world_pos = view_bindings::view.world_from_clip * clip_pos; 45fn position_ndc_to_world(ndc_pos: vec3<f32>) -> vec3<f32> { 46 let world_pos = view_bindings::view.world_from_clip * vec4(ndc_pos, 1.0); 47 return world_pos.xyz / world_pos.w; 51fn direction_view_to_world(view_dir: vec3<f32>) -> vec3<f32> { 52 let world_dir = view_bindings::view.world_from_view * vec4(view_dir, 0.0); 57fn direction_clip_to_world(clip_dir: vec4<f32>) -> vec3<f32> { 58 let world_dir = view_bindings::view.world_from_clip * clip_dir; 67fn position_world_to_view(world_pos: vec3<f32>) -> vec3<f32> { 68 let view_pos = view_bindings::view.view_from_world * vec4(world_pos, 1.0); 73fn position_clip_to_view(clip_pos: vec4<f32>) -> vec3<f32> { 74 let view_pos = view_bindings::view.view_from_clip * clip_pos; 79fn position_ndc_to_view(ndc_pos: vec3<f32>) -> vec3<f32> { 80 let view_pos = view_bindings::view.view_from_clip * vec4(ndc_pos, 1.0); 81 return view_pos.xyz / view_pos.w; 85fn direction_world_to_view(world_dir: vec3<f32>) -> vec3<f32> { 86 let view_dir = view_bindings::view.view_from_world * vec4(world_dir, 0.0); 91fn direction_clip_to_view(clip_dir: vec4<f32>) -> vec3<f32> { 92 let view_dir = view_bindings::view.view_from_clip * clip_dir; 101fn position_world_to_clip(world_pos: vec3<f32>) -> vec4<f32> { 102 let clip_pos = view_bindings::view.clip_from_world * vec4(world_pos, 1.0); 107fn position_view_to_clip(view_pos: vec3<f32>) -> vec4<f32> { 108 let clip_pos = view_bindings::view.clip_from_view * vec4(view_pos, 1.0); 113fn direction_world_to_clip(world_dir: vec3<f32>) -> vec4<f32> { 114 let clip_dir = view_bindings::view.clip_from_world * vec4(world_dir, 0.0); 119fn direction_view_to_clip(view_dir: vec3<f32>) -> vec4<f32> { 120 let clip_dir = view_bindings::view.clip_from_view * vec4(view_dir, 0.0); 129fn position_world_to_ndc(world_pos: vec3<f32>) -> vec3<f32> { 130 let ndc_pos = view_bindings::view.clip_from_world * vec4(world_pos, 1.0); 131 return ndc_pos.xyz / ndc_pos.w; 135fn position_view_to_ndc(view_pos: vec3<f32>) -> vec3<f32> { 136 let ndc_pos = view_bindings::view.clip_from_view * vec4(view_pos, 1.0); 137 return ndc_pos.xyz / ndc_pos.w; 145fn perspective_camera_near() -> f32 { 146 return view_bindings::view.clip_from_view[3][2]; 151fn depth_ndc_to_view_z(ndc_depth: f32) -> f32 { 152#ifdef VIEW_PROJECTION_PERSPECTIVE 153 return -perspective_camera_near() / ndc_depth; 154#else ifdef VIEW_PROJECTION_ORTHOGRAPHIC 155 return -(view_bindings::view.clip_from_view[3][2] - ndc_depth) / view_bindings::view.clip_from_view[2][2]; 157 let view_pos = view_bindings::view.view_from_clip * vec4(0.0, 0.0, ndc_depth, 1.0); 158 return view_pos.z / view_pos.w; 164fn view_z_to_depth_ndc(view_z: f32) -> f32 { 165#ifdef VIEW_PROJECTION_PERSPECTIVE 166 return -perspective_camera_near() / view_z; 167#else ifdef VIEW_PROJECTION_ORTHOGRAPHIC 168 return view_bindings::view.clip_from_view[3][2] + view_z * view_bindings::view.clip_from_view[2][2]; 170 let ndc_pos = view_bindings::view.clip_from_view * vec4(0.0, 0.0, view_z, 1.0); 171 return ndc_pos.z / ndc_pos.w; 180fn ndc_to_uv(ndc: vec2<f32>) -> vec2<f32> { 181 return ndc * vec2(0.5, -0.5) + vec2(0.5); 185fn uv_to_ndc(uv: vec2<f32>) -> vec2<f32> { 186 return uv * vec2(2.0, -2.0) + vec2(-1.0, 1.0); 191fn frag_coord_to_uv(frag_coord: vec2<f32>) -> vec2<f32> { 192 return (frag_coord - view_bindings::view.viewport.xy) / view_bindings::view.viewport.zw; 196fn frag_coord_to_ndc(frag_coord: vec4<f32>) -> vec3<f32> { 197 return vec3(uv_to_ndc(frag_coord_to_uv(frag_coord.xy)), frag_coord.z); 202fn ndc_to_frag_coord(ndc: vec2<f32>) -> vec2<f32> { 203 return ndc_to_uv(ndc) * view_bindings::view.viewport.zw;