27import package::render::mesh_view_bindings as view_bindings; 28import package::prepass::bindings as prepass_bindings; 35fn position_view_to_world(view_pos: vec3<f32>) -> vec3<f32> { 36 let world_pos = view_bindings::view.world_from_view * vec4(view_pos, 1.0); 41fn position_clip_to_world(clip_pos: vec4<f32>) -> vec3<f32> { 42 let world_pos = view_bindings::view.world_from_clip * clip_pos; 47fn position_ndc_to_world(ndc_pos: vec3<f32>) -> vec3<f32> { 48 let world_pos = view_bindings::view.world_from_clip * vec4(ndc_pos, 1.0); 49 return world_pos.xyz / world_pos.w; 53fn direction_view_to_world(view_dir: vec3<f32>) -> vec3<f32> { 54 let world_dir = view_bindings::view.world_from_view * vec4(view_dir, 0.0); 59fn direction_clip_to_world(clip_dir: vec4<f32>) -> vec3<f32> { 60 let world_dir = view_bindings::view.world_from_clip * clip_dir; 69fn position_world_to_view(world_pos: vec3<f32>) -> vec3<f32> { 70 let view_pos = view_bindings::view.view_from_world * vec4(world_pos, 1.0); 75fn position_clip_to_view(clip_pos: vec4<f32>) -> vec3<f32> { 76 let view_pos = view_bindings::view.view_from_clip * clip_pos; 81fn position_ndc_to_view(ndc_pos: vec3<f32>) -> vec3<f32> { 82 let view_pos = view_bindings::view.view_from_clip * vec4(ndc_pos, 1.0); 83 return view_pos.xyz / view_pos.w; 87fn direction_world_to_view(world_dir: vec3<f32>) -> vec3<f32> { 88 let view_dir = view_bindings::view.view_from_world * vec4(world_dir, 0.0); 93fn direction_clip_to_view(clip_dir: vec4<f32>) -> vec3<f32> { 94 let view_dir = view_bindings::view.view_from_clip * clip_dir; 102fn position_world_to_prev_view(world_pos: vec3<f32>) -> vec3<f32> { 103 let view_pos = prepass_bindings::previous_view_uniforms.view_from_world * 104 vec4(world_pos, 1.0); 108fn position_world_to_prev_ndc(world_pos: vec3<f32>) -> vec3<f32> { 109 let ndc_pos = prepass_bindings::previous_view_uniforms.clip_from_world * 110 vec4(world_pos, 1.0); 111 return ndc_pos.xyz / ndc_pos.w; 119fn position_world_to_clip(world_pos: vec3<f32>) -> vec4<f32> { 120 let clip_pos = view_bindings::view.clip_from_world * vec4(world_pos, 1.0); 125fn position_view_to_clip(view_pos: vec3<f32>) -> vec4<f32> { 126 let clip_pos = view_bindings::view.clip_from_view * vec4(view_pos, 1.0); 131fn direction_world_to_clip(world_dir: vec3<f32>) -> vec4<f32> { 132 let clip_dir = view_bindings::view.clip_from_world * vec4(world_dir, 0.0); 137fn direction_view_to_clip(view_dir: vec3<f32>) -> vec4<f32> { 138 let clip_dir = view_bindings::view.clip_from_view * vec4(view_dir, 0.0); 147fn position_world_to_ndc(world_pos: vec3<f32>) -> vec3<f32> { 148 let ndc_pos = view_bindings::view.clip_from_world * vec4(world_pos, 1.0); 149 return ndc_pos.xyz / ndc_pos.w; 153fn position_view_to_ndc(view_pos: vec3<f32>) -> vec3<f32> { 154 let ndc_pos = view_bindings::view.clip_from_view * vec4(view_pos, 1.0); 155 return ndc_pos.xyz / ndc_pos.w; 163fn perspective_camera_near() -> f32 { 164 return view_bindings::view.clip_from_view[3][2]; 169fn depth_ndc_to_view_z(ndc_depth: f32) -> f32 { 170@if(VIEW_PROJECTION_PERSPECTIVE) 171 return -perspective_camera_near() / ndc_depth; 172@elif(VIEW_PROJECTION_ORTHOGRAPHIC) 173 return -(view_bindings::view.clip_from_view[3][2] - ndc_depth) / view_bindings::view.clip_from_view[2][2]; 175 let view_pos = view_bindings::view.view_from_clip * vec4(0.0, 0.0, ndc_depth, 1.0); 176 return view_pos.z / view_pos.w; 182fn view_z_to_depth_ndc(view_z: f32) -> f32 { 183@if(VIEW_PROJECTION_PERSPECTIVE) 184 return -perspective_camera_near() / view_z; 185@elif(VIEW_PROJECTION_ORTHOGRAPHIC) 186 return view_bindings::view.clip_from_view[3][2] + view_z * view_bindings::view.clip_from_view[2][2]; 188 let ndc_pos = view_bindings::view.clip_from_view * vec4(0.0, 0.0, view_z, 1.0); 189 return ndc_pos.z / ndc_pos.w; 193fn prev_view_z_to_depth_ndc(view_z: f32) -> f32 { 194@if(VIEW_PROJECTION_PERSPECTIVE) 195 return -perspective_camera_near() / view_z; 196@elif(VIEW_PROJECTION_ORTHOGRAPHIC) 197 return prepass_bindings::previous_view_uniforms.clip_from_view[3][2] + 198 view_z * prepass_bindings::previous_view_uniforms.clip_from_view[2][2]; 200 let ndc_pos = prepass_bindings::previous_view_uniforms.clip_from_view * 201 vec4(0.0, 0.0, view_z, 1.0); 202 return ndc_pos.z / ndc_pos.w; 211fn ndc_to_uv(ndc: vec2<f32>) -> vec2<f32> { 212 return ndc * vec2(0.5, -0.5) + vec2(0.5); 216fn uv_to_ndc(uv: vec2<f32>) -> vec2<f32> { 217 return uv * vec2(2.0, -2.0) + vec2(-1.0, 1.0); 222fn frag_coord_to_uv(frag_coord: vec2<f32>) -> vec2<f32> { 223 return (frag_coord - view_bindings::view.viewport.xy) / view_bindings::view.viewport.zw; 227fn frag_coord_to_ndc(frag_coord: vec4<f32>) -> vec3<f32> { 228 return vec3(uv_to_ndc(frag_coord_to_uv(frag_coord.xy)), frag_coord.z); 233fn ndc_to_frag_coord(ndc: vec2<f32>) -> vec2<f32> { 234 return ndc_to_uv(ndc) * view_bindings::view.viewport.zw;