From a80286ea142386d128fb9bb49527129008594651 Mon Sep 17 00:00:00 2001 From: Danny McGee Date: Fri, 10 May 2024 21:23:39 -0400 Subject: [PATCH] Vastly improved error recovery --- .../tests/e2e/bevy_pbr_shadows-001.wgsl-ast | 5190 +++++++++++++++++ packages/parser/src/common.rs | 22 +- packages/parser/src/decl/func.rs | 37 +- packages/parser/src/decl/import.rs | 10 +- packages/parser/src/decl/struc.rs | 35 +- packages/parser/src/lib.rs | 31 +- packages/parser/src/parser.rs | 86 +- packages/parser/src/stmt.rs | 7 +- packages/parser/src/tests/e2e.rs | 5 + .../test-files/modules/pbr_shadows.wgsl | 183 + 10 files changed, 5486 insertions(+), 120 deletions(-) create mode 100644 packages/parser/snapshots/tests/e2e/bevy_pbr_shadows-001.wgsl-ast create mode 100644 packages/parser/test-files/modules/pbr_shadows.wgsl diff --git a/packages/parser/snapshots/tests/e2e/bevy_pbr_shadows-001.wgsl-ast b/packages/parser/snapshots/tests/e2e/bevy_pbr_shadows-001.wgsl-ast new file mode 100644 index 00000000..7e8cbd78 --- /dev/null +++ b/packages/parser/snapshots/tests/e2e/bevy_pbr_shadows-001.wgsl-ast @@ -0,0 +1,5190 @@ +================================================================================ +tests::e2e::bevy_pbr_shadows / #1 +================================================================================ +(SyntaxTree + inner: [ + (Decl::ImportPath (ImportPathDecl + keyword: `#define_import_path` (Directive (1:1..1:20)), + path: (ImportPath::Namespaced (NamespacedImportPath + namespace: `bevy_pbr` (Module (1:21..1:29)), + path: (ImportPath::Leaf (ImportPathLeaf + name: `shadows` (Module (1:31..1:38)), + )), + )), + )), + (Decl::Import (ImportDecl + keyword: `#import` (Directive (3:1..3:8)), + path: (ImportPath::Namespaced (NamespacedImportPath + namespace: `bevy_pbr` (Module (3:9..3:17)), + path: (ImportPath::Block (ImportPathBlock + brace_open: `{` (Brace (3:19..3:20)), + paths: [ + (ImportPath::Namespaced (NamespacedImportPath + namespace: `mesh_view_types` (Module (4:5..4:20)), + path: (ImportPath::Leaf (ImportPathLeaf + name: `POINT_LIGHT_FLAGS_SPOT_LIGHT_Y_NEGATIVE` (Module (4:22..4:61)), + )), + )), + (ImportPath::Leaf (ImportPathLeaf + name: `mesh_view_bindings` (Module (5:5..5:23)), + as_binding: `view_bindings` (Module (5:27..5:40)), + )), + (ImportPath::Namespaced (NamespacedImportPath + namespace: `utils` (Module (6:5..6:10)), + path: (ImportPath::Leaf (ImportPathLeaf + name: `hsv2rgb` (Module (6:12..6:19)), + )), + )), + (ImportPath::Namespaced (NamespacedImportPath + namespace: `shadow_sampling` (Module (7:5..7:20)), + path: (ImportPath::Leaf (ImportPathLeaf + name: `sample_shadow_map` (Module (7:22..7:39)), + )), + )), + ], + brace_close: `}` (Brace (8:1..8:2)), + )), + )), + )), + (Decl::Const (VarDecl + storage: `const` (Keyword (10:1..10:6)), + name: `flip_z` (Ident (10:7..10:13)), + ty: (TypeDecl + annotator: `:` (Punct (10:13..10:14)), + name: (IdentExpr::Leaf `vec3` (Type (10:15..10:19))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (10:20..10:23))), + ), + ), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `vec3` (Type (10:27..10:31))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (10:32..10:35))), + ), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (10:36..10:37)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `1.0` (FloatLiteral (10:37..10:40))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `1.0` (FloatLiteral (10:42..10:45))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `-1.0` (FloatLiteral (10:47..10:51))), + )), + ], + brace_close: `)` (Brace (10:51..10:52)), + ), + )), + )), + semicolon: `;` (Punct (10:52..10:53)), + )), + (Decl::Function (FunctionDecl + storage: `fn` (Keyword (12:1..12:3)), + name: `fetch_point_shadow` (Function (12:4..12:22)), + params: [ + (Decl::Param (ParamDecl + name: `light_id` (Ident (12:23..12:31)), + ty: (TypeDecl + annotator: `:` (Punct (12:31..12:32)), + name: (IdentExpr::Leaf `u32` (Type (12:33..12:36))), + ), + )), + (Decl::Param (ParamDecl + name: `frag_position` (Ident (12:38..12:51)), + ty: (TypeDecl + annotator: `:` (Punct (12:51..12:52)), + name: (IdentExpr::Leaf `vec4` (Type (12:53..12:57))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (12:58..12:61))), + ), + ), + )), + (Decl::Param (ParamDecl + name: `surface_normal` (Ident (12:64..12:78)), + ty: (TypeDecl + annotator: `:` (Punct (12:78..12:79)), + name: (IdentExpr::Leaf `vec3` (Type (12:80..12:84))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (12:85..12:88))), + ), + ), + )), + ], + return_ty: (TypeDecl + annotator: `->` (Operator (12:91..12:93)), + name: (IdentExpr::Leaf `f32` (Type (12:94..12:97))), + ), + body: (BlockStmt + brace_open: `{` (Brace (12:98..12:99)), + stmts: [ + (Stmt::Var (VarDecl + storage: `let` (Keyword (13:5..13:8)), + name: `light` (Ident (13:9..13:14)), + assignment: (Expr::UnaryPre (UnaryPreExpr + op: `&` (Operator (13:17..13:18)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Namespaced (NamespacedIdent + namespace: `view_bindings` (Module (13:18..13:31)), + ident: (IdentExpr::Leaf `point_lights` (Ident (13:33..13:45))), + ))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (13:45..13:46))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `data` (Field (13:46..13:50)))), + postfix: (PostfixExpr + accessor: (Accessor::Index + `[` (Brace (13:50..13:51)), + `]` (Brace (13:59..13:60)), + ), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_id` (Ident (13:51..13:59)))), + )), + ), + )), + ), + )), + )), + semicolon: `;` (Punct (13:60..13:61)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (17:5..17:8)), + name: `surface_to_light` (Ident (17:9..17:25)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (17:28..17:29)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (17:29..17:30)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (17:30..17:35)))), + )), + )), + brace_close: `)` (Brace (17:35..17:36)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (17:36..17:37))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `position_radius` (Field (17:37..17:52)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (17:52..17:53))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xyz` (Field (17:53..17:56)))), + )), + ), + )), + ), + )), + op: `-` (Operator (17:57..17:58)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `frag_position` (Ident (17:59..17:72)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (17:72..17:73))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xyz` (Field (17:73..17:76)))), + )), + ), + )), + )), + semicolon: `;` (Punct (17:76..17:77)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (18:5..18:8)), + name: `surface_to_light_abs` (Ident (18:9..18:29)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `abs` (Function (18:32..18:35))), + arguments: (ArgumentList + brace_open: `(` (Brace (18:35..18:36)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `surface_to_light` (Ident (18:36..18:52)))), + )), + ], + brace_close: `)` (Brace (18:52..18:53)), + ), + )), + )), + semicolon: `;` (Punct (18:53..18:54)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (19:5..19:8)), + name: `distance_to_light` (Ident (19:9..19:26)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `max` (Function (19:29..19:32))), + arguments: (ArgumentList + brace_open: `(` (Brace (19:32..19:33)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `surface_to_light_abs` (Ident (19:33..19:53)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (19:53..19:54))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `x` (Field (19:54..19:55)))), + )), + ), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `max` (Function (19:57..19:60))), + arguments: (ArgumentList + brace_open: `(` (Brace (19:60..19:61)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `surface_to_light_abs` (Ident (19:61..19:81)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (19:81..19:82))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `y` (Field (19:82..19:83)))), + )), + ), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `surface_to_light_abs` (Ident (19:85..19:105)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (19:105..19:106))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `z` (Field (19:106..19:107)))), + )), + ), + )), + ], + brace_close: `)` (Brace (19:107..19:108)), + ), + )), + )), + ], + brace_close: `)` (Brace (19:108..19:109)), + ), + )), + )), + semicolon: `;` (Punct (19:109..19:110)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (24:5..24:8)), + name: `normal_offset` (Ident (24:9..24:22)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (24:25..24:26)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (24:26..24:27)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (24:27..24:32)))), + )), + )), + brace_close: `)` (Brace (24:32..24:33)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (24:33..24:34))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `shadow_normal_bias` (Field (24:34..24:52)))), + )), + ), + )), + op: `*` (Operator (24:53..24:54)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `distance_to_light` (Ident (24:55..24:72)))), + )), + )), + op: `*` (Operator (24:73..24:74)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `surface_normal` (Ident (24:75..24:89)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (24:89..24:90))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xyz` (Field (24:90..24:93)))), + )), + ), + )), + )), + semicolon: `;` (Punct (24:93..24:94)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (25:5..25:8)), + name: `depth_offset` (Ident (25:9..25:21)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (25:24..25:25)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (25:25..25:26)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (25:26..25:31)))), + )), + )), + brace_close: `)` (Brace (25:31..25:32)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (25:32..25:33))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `shadow_depth_bias` (Field (25:33..25:50)))), + )), + ), + )), + op: `*` (Operator (25:51..25:52)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `normalize` (Function (25:53..25:62))), + arguments: (ArgumentList + brace_open: `(` (Brace (25:62..25:63)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `surface_to_light` (Ident (25:63..25:79)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (25:79..25:80))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xyz` (Field (25:80..25:83)))), + )), + ), + )), + ], + brace_close: `)` (Brace (25:83..25:84)), + ), + )), + )), + )), + semicolon: `;` (Punct (25:84..25:85)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (26:5..26:8)), + name: `offset_position` (Ident (26:9..26:24)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `frag_position` (Ident (26:27..26:40)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (26:40..26:41))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xyz` (Field (26:41..26:44)))), + )), + ), + )), + op: `+` (Operator (26:45..26:46)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `normal_offset` (Ident (26:47..26:60)))), + )), + )), + op: `+` (Operator (26:61..26:62)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `depth_offset` (Ident (26:63..26:75)))), + )), + )), + semicolon: `;` (Punct (26:75..26:76)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (29:5..29:8)), + name: `frag_ls` (Ident (29:9..29:16)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `offset_position` (Ident (29:19..29:34)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (29:34..29:35))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xyz` (Field (29:35..29:38)))), + )), + ), + )), + op: `-` (Operator (29:39..29:40)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (29:41..29:42)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (29:42..29:43)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (29:43..29:48)))), + )), + )), + brace_close: `)` (Brace (29:48..29:49)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (29:49..29:50))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `position_radius` (Field (29:50..29:65)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (29:65..29:66))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xyz` (Field (29:66..29:69)))), + )), + ), + )), + ), + )), + )), + semicolon: `;` (Punct (29:70..29:71)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (30:5..30:8)), + name: `abs_position_ls` (Ident (30:9..30:24)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `abs` (Function (30:27..30:30))), + arguments: (ArgumentList + brace_open: `(` (Brace (30:30..30:31)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `frag_ls` (Ident (30:31..30:38)))), + )), + ], + brace_close: `)` (Brace (30:38..30:39)), + ), + )), + )), + semicolon: `;` (Punct (30:39..30:40)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (31:5..31:8)), + name: `major_axis_magnitude` (Ident (31:9..31:29)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `max` (Function (31:32..31:35))), + arguments: (ArgumentList + brace_open: `(` (Brace (31:35..31:36)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `abs_position_ls` (Ident (31:36..31:51)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (31:51..31:52))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `x` (Field (31:52..31:53)))), + )), + ), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `max` (Function (31:55..31:58))), + arguments: (ArgumentList + brace_open: `(` (Brace (31:58..31:59)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `abs_position_ls` (Ident (31:59..31:74)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (31:74..31:75))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `y` (Field (31:75..31:76)))), + )), + ), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `abs_position_ls` (Ident (31:78..31:93)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (31:93..31:94))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `z` (Field (31:94..31:95)))), + )), + ), + )), + ], + brace_close: `)` (Brace (31:95..31:96)), + ), + )), + )), + ], + brace_close: `)` (Brace (31:96..31:97)), + ), + )), + )), + semicolon: `;` (Punct (31:97..31:98)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (37:5..37:8)), + name: `zw` (Ident (37:9..37:11)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Binary (BinaryExpr + lhs: (Expr::UnaryPre (UnaryPreExpr + op: `-` (Operator (37:14..37:15)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `major_axis_magnitude` (Ident (37:15..37:35)))), + )), + )), + op: `*` (Operator (37:36..37:37)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (37:38..37:39)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (37:39..37:40)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (37:40..37:45)))), + )), + )), + brace_close: `)` (Brace (37:45..37:46)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (37:46..37:47))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_custom_data` (Field (37:47..37:64)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (37:64..37:65))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xy` (Field (37:65..37:67)))), + )), + ), + )), + ), + )), + )), + op: `+` (Operator (37:68..37:69)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (37:70..37:71)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (37:71..37:72)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (37:72..37:77)))), + )), + )), + brace_close: `)` (Brace (37:77..37:78)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (37:78..37:79))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_custom_data` (Field (37:79..37:96)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (37:96..37:97))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `zw` (Field (37:97..37:99)))), + )), + ), + )), + ), + )), + )), + semicolon: `;` (Punct (37:99..37:100)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (38:5..38:8)), + name: `depth` (Ident (38:9..38:14)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `zw` (Ident (38:17..38:19)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (38:19..38:20))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `x` (Field (38:20..38:21)))), + )), + ), + )), + op: `/` (Operator (38:22..38:23)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `zw` (Ident (38:24..38:26)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (38:26..38:27))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `y` (Field (38:27..38:28)))), + )), + ), + )), + )), + semicolon: `;` (Punct (38:28..38:29)), + )), + (Stmt::Return (ReturnStmt + keyword: `return` (Keyword (48:5..48:11)), + value: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `textureSampleCompare` (Function (48:12..48:32))), + arguments: (ArgumentList + brace_open: `(` (Brace (48:32..48:33)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Namespaced (NamespacedIdent + namespace: `view_bindings` (Module (48:33..48:46)), + ident: (IdentExpr::Leaf `point_shadow_textures` (Ident (48:48..48:69))), + ))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Namespaced (NamespacedIdent + namespace: `view_bindings` (Module (48:71..48:84)), + ident: (IdentExpr::Leaf `point_shadow_textures_sampler` (Ident (48:86..48:115))), + ))), + )), + (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `frag_ls` (Ident (48:117..48:124)))), + )), + op: `*` (Operator (48:125..48:126)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `flip_z` (Ident (48:127..48:133)))), + )), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `depth` (Ident (48:135..48:140)))), + )), + ], + brace_close: `)` (Brace (48:140..48:141)), + ), + )), + )), + semicolon: `;` (Punct (48:141..48:142)), + )), + (Stmt::Return (ReturnStmt + keyword: `return` (Keyword (50:5..50:11)), + value: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `textureSampleCompareLevel` (Function (50:12..50:37))), + arguments: (ArgumentList + brace_open: `(` (Brace (50:37..50:38)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Namespaced (NamespacedIdent + namespace: `view_bindings` (Module (50:38..50:51)), + ident: (IdentExpr::Leaf `point_shadow_textures` (Ident (50:53..50:74))), + ))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Namespaced (NamespacedIdent + namespace: `view_bindings` (Module (50:76..50:89)), + ident: (IdentExpr::Leaf `point_shadow_textures_sampler` (Ident (50:91..50:120))), + ))), + )), + (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `frag_ls` (Ident (50:122..50:129)))), + )), + op: `*` (Operator (50:130..50:131)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `flip_z` (Ident (50:132..50:138)))), + )), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `i32` (Type (50:140..50:143))), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (50:143..50:144)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_id` (Ident (50:144..50:152)))), + )), + ], + brace_close: `)` (Brace (50:152..50:153)), + ), + )), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `depth` (Ident (50:155..50:160)))), + )), + ], + brace_close: `)` (Brace (50:160..50:161)), + ), + )), + )), + semicolon: `;` (Punct (50:161..50:162)), + )), + ], + brace_close: `}` (Brace (52:1..52:2)), + ), + )), + (Decl::Function (FunctionDecl + storage: `fn` (Keyword (54:1..54:3)), + name: `fetch_spot_shadow` (Function (54:4..54:21)), + params: [ + (Decl::Param (ParamDecl + name: `light_id` (Ident (54:22..54:30)), + ty: (TypeDecl + annotator: `:` (Punct (54:30..54:31)), + name: (IdentExpr::Leaf `u32` (Type (54:32..54:35))), + ), + )), + (Decl::Param (ParamDecl + name: `frag_position` (Ident (54:37..54:50)), + ty: (TypeDecl + annotator: `:` (Punct (54:50..54:51)), + name: (IdentExpr::Leaf `vec4` (Type (54:52..54:56))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (54:57..54:60))), + ), + ), + )), + (Decl::Param (ParamDecl + name: `surface_normal` (Ident (54:63..54:77)), + ty: (TypeDecl + annotator: `:` (Punct (54:77..54:78)), + name: (IdentExpr::Leaf `vec3` (Type (54:79..54:83))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (54:84..54:87))), + ), + ), + )), + ], + return_ty: (TypeDecl + annotator: `->` (Operator (54:90..54:92)), + name: (IdentExpr::Leaf `f32` (Type (54:93..54:96))), + ), + body: (BlockStmt + brace_open: `{` (Brace (54:97..54:98)), + stmts: [ + (Stmt::Var (VarDecl + storage: `let` (Keyword (55:5..55:8)), + name: `light` (Ident (55:9..55:14)), + assignment: (Expr::UnaryPre (UnaryPreExpr + op: `&` (Operator (55:17..55:18)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Namespaced (NamespacedIdent + namespace: `view_bindings` (Module (55:18..55:31)), + ident: (IdentExpr::Leaf `point_lights` (Ident (55:33..55:45))), + ))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (55:45..55:46))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `data` (Field (55:46..55:50)))), + postfix: (PostfixExpr + accessor: (Accessor::Index + `[` (Brace (55:50..55:51)), + `]` (Brace (55:59..55:60)), + ), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_id` (Ident (55:51..55:59)))), + )), + ), + )), + ), + )), + )), + semicolon: `;` (Punct (55:60..55:61)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (57:5..57:8)), + name: `surface_to_light` (Ident (57:9..57:25)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (57:28..57:29)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (57:29..57:30)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (57:30..57:35)))), + )), + )), + brace_close: `)` (Brace (57:35..57:36)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (57:36..57:37))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `position_radius` (Field (57:37..57:52)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (57:52..57:53))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xyz` (Field (57:53..57:56)))), + )), + ), + )), + ), + )), + op: `-` (Operator (57:57..57:58)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `frag_position` (Ident (57:59..57:72)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (57:72..57:73))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xyz` (Field (57:73..57:76)))), + )), + ), + )), + )), + semicolon: `;` (Punct (57:76..57:77)), + )), + (Stmt::Var (VarDecl + storage: `var` (Keyword (60:5..60:8)), + name: `spot_dir` (Ident (60:9..60:17)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `vec3` (Type (60:20..60:24))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (60:25..60:28))), + ), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (60:29..60:30)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (60:30..60:31)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (60:31..60:32)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (60:32..60:37)))), + )), + )), + brace_close: `)` (Brace (60:37..60:38)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (60:38..60:39))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_custom_data` (Field (60:39..60:56)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (60:56..60:57))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `x` (Field (60:57..60:58)))), + )), + ), + )), + ), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0.0` (FloatLiteral (60:60..60:63))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (60:65..60:66)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (60:66..60:67)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (60:67..60:72)))), + )), + )), + brace_close: `)` (Brace (60:72..60:73)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (60:73..60:74))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_custom_data` (Field (60:74..60:91)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (60:91..60:92))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `y` (Field (60:92..60:93)))), + )), + ), + )), + ), + )), + ], + brace_close: `)` (Brace (60:93..60:94)), + ), + )), + )), + semicolon: `;` (Punct (60:94..60:95)), + )), + (Stmt::Expr (ExprStmt + expr: (Expr::Assignment (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `spot_dir` (Ident (62:5..62:13)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (62:13..62:14))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `y` (Field (62:14..62:15)))), + )), + ), + )), + op: `=` (Operator (62:16..62:17)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `sqrt` (Function (62:18..62:22))), + arguments: (ArgumentList + brace_open: `(` (Brace (62:22..62:23)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `max` (Function (62:23..62:26))), + arguments: (ArgumentList + brace_open: `(` (Brace (62:26..62:27)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0.0` (FloatLiteral (62:27..62:30))), + )), + (Expr::Binary (BinaryExpr + lhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `1.0` (FloatLiteral (62:32..62:35))), + )), + op: `-` (Operator (62:36..62:37)), + rhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `spot_dir` (Ident (62:38..62:46)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (62:46..62:47))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `x` (Field (62:47..62:48)))), + )), + ), + )), + op: `*` (Operator (62:49..62:50)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `spot_dir` (Ident (62:51..62:59)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (62:59..62:60))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `x` (Field (62:60..62:61)))), + )), + ), + )), + )), + )), + op: `-` (Operator (62:62..62:63)), + rhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `spot_dir` (Ident (62:64..62:72)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (62:72..62:73))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `z` (Field (62:73..62:74)))), + )), + ), + )), + op: `*` (Operator (62:75..62:76)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `spot_dir` (Ident (62:77..62:85)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (62:85..62:86))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `z` (Field (62:86..62:87)))), + )), + ), + )), + )), + )), + ], + brace_close: `)` (Brace (62:87..62:88)), + ), + )), + )), + ], + brace_close: `)` (Brace (62:88..62:89)), + ), + )), + )), + )), + semicolon: `;` (Punct (62:89..62:90)), + )), + (Stmt::If (IfStmt + keyword: `if` (Keyword (63:5..63:7)), + condition: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (63:8..63:9)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (63:9..63:10)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (63:10..63:11)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (63:11..63:12)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (63:12..63:17)))), + )), + )), + brace_close: `)` (Brace (63:17..63:18)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (63:18..63:19))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `flags` (Field (63:19..63:24)))), + )), + ), + )), + op: `&` (Operator (63:25..63:26)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `POINT_LIGHT_FLAGS_SPOT_LIGHT_Y_NEGATIVE` (Ident (63:27..63:66)))), + )), + )), + brace_close: `)` (Brace (63:66..63:67)), + )), + )), + op: `!=` (Operator (63:68..63:70)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0u` (IntLiteral (63:71..63:73))), + )), + )), + brace_close: `)` (Brace (63:73..63:74)), + )), + )), + then_branch: (BlockStmt + brace_open: `{` (Brace (63:75..63:76)), + stmts: [ + (Stmt::Expr (ExprStmt + expr: (Expr::Assignment (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `spot_dir` (Ident (64:9..64:17)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (64:17..64:18))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `y` (Field (64:18..64:19)))), + )), + ), + )), + op: `=` (Operator (64:20..64:21)), + rhs: (Expr::UnaryPre (UnaryPreExpr + op: `-` (Operator (64:22..64:23)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `spot_dir` (Ident (64:23..64:31)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (64:31..64:32))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `y` (Field (64:32..64:33)))), + )), + ), + )), + )), + )), + semicolon: `;` (Punct (64:33..64:34)), + )), + ], + brace_close: `}` (Brace (65:5..65:6)), + ), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (68:5..68:8)), + name: `fwd` (Ident (68:9..68:12)), + assignment: (Expr::UnaryPre (UnaryPreExpr + op: `-` (Operator (68:15..68:16)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `spot_dir` (Ident (68:16..68:24)))), + )), + )), + semicolon: `;` (Punct (68:24..68:25)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (69:5..69:8)), + name: `distance_to_light` (Ident (69:9..69:26)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `dot` (Function (69:29..69:32))), + arguments: (ArgumentList + brace_open: `(` (Brace (69:32..69:33)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `fwd` (Ident (69:33..69:36)))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `surface_to_light` (Ident (69:38..69:54)))), + )), + ], + brace_close: `)` (Brace (69:54..69:55)), + ), + )), + )), + semicolon: `;` (Punct (69:55..69:56)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (70:5..70:8)), + name: `offset_position` (Ident (70:9..70:24)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Binary (BinaryExpr + lhs: (Expr::UnaryPre (UnaryPreExpr + op: `-` (Operator (71:9..71:10)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `surface_to_light` (Ident (71:10..71:26)))), + )), + )), + op: `+` (Operator (72:9..72:10)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (72:11..72:12)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (72:12..72:13)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (72:13..72:14)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (72:14..72:19)))), + )), + )), + brace_close: `)` (Brace (72:19..72:20)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (72:20..72:21))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `shadow_depth_bias` (Field (72:21..72:38)))), + )), + ), + )), + op: `*` (Operator (72:39..72:40)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `normalize` (Function (72:41..72:50))), + arguments: (ArgumentList + brace_open: `(` (Brace (72:50..72:51)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `surface_to_light` (Ident (72:51..72:67)))), + )), + ], + brace_close: `)` (Brace (72:67..72:68)), + ), + )), + )), + )), + brace_close: `)` (Brace (72:68..72:69)), + )), + )), + )), + op: `+` (Operator (73:9..73:10)), + rhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (73:11..73:12)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `surface_normal` (Ident (73:12..73:26)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (73:26..73:27))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xyz` (Field (73:27..73:30)))), + )), + ), + )), + op: `*` (Operator (73:31..73:32)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (73:33..73:34)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (73:34..73:35)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (73:35..73:40)))), + )), + )), + brace_close: `)` (Brace (73:40..73:41)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (73:41..73:42))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `shadow_normal_bias` (Field (73:42..73:60)))), + )), + ), + )), + )), + brace_close: `)` (Brace (73:60..73:61)), + )), + )), + op: `*` (Operator (73:62..73:63)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `distance_to_light` (Ident (73:64..73:81)))), + )), + )), + )), + semicolon: `;` (Punct (73:81..73:82)), + )), + (Stmt::Var (VarDecl + storage: `var` (Keyword (77:5..77:8)), + name: `sign` (Ident (77:9..77:13)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `-1.0` (FloatLiteral (77:16..77:20))), + )), + semicolon: `;` (Punct (77:20..77:21)), + )), + (Stmt::If (IfStmt + keyword: `if` (Keyword (78:5..78:7)), + condition: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (78:8..78:9)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `fwd` (Ident (78:9..78:12)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (78:12..78:13))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `z` (Field (78:13..78:14)))), + )), + ), + )), + op: `>=` (Operator (78:15..78:17)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0.0` (FloatLiteral (78:18..78:21))), + )), + )), + brace_close: `)` (Brace (78:21..78:22)), + )), + )), + then_branch: (BlockStmt + brace_open: `{` (Brace (78:23..78:24)), + stmts: [ + (Stmt::Expr (ExprStmt + expr: (Expr::Assignment (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `sign` (Ident (79:9..79:13)))), + )), + op: `=` (Operator (79:14..79:15)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `1.0` (FloatLiteral (79:16..79:19))), + )), + )), + semicolon: `;` (Punct (79:19..79:20)), + )), + ], + brace_close: `}` (Brace (80:5..80:6)), + ), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (81:5..81:8)), + name: `a` (Ident (81:9..81:10)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `-1.0` (FloatLiteral (81:13..81:17))), + )), + op: `/` (Operator (81:18..81:19)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (81:20..81:21)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `fwd` (Ident (81:21..81:24)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (81:24..81:25))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `z` (Field (81:25..81:26)))), + )), + ), + )), + op: `+` (Operator (81:27..81:28)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `sign` (Ident (81:29..81:33)))), + )), + )), + brace_close: `)` (Brace (81:33..81:34)), + )), + )), + )), + semicolon: `;` (Punct (81:34..81:35)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (82:5..82:8)), + name: `b` (Ident (82:9..82:10)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `fwd` (Ident (82:13..82:16)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (82:16..82:17))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `x` (Field (82:17..82:18)))), + )), + ), + )), + op: `*` (Operator (82:19..82:20)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `fwd` (Ident (82:21..82:24)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (82:24..82:25))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `y` (Field (82:25..82:26)))), + )), + ), + )), + )), + op: `*` (Operator (82:27..82:28)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `a` (Ident (82:29..82:30)))), + )), + )), + semicolon: `;` (Punct (82:30..82:31)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (83:5..83:8)), + name: `up_dir` (Ident (83:9..83:15)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `vec3` (Type (83:18..83:22))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (83:23..83:26))), + ), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (83:27..83:28)), + arguments: [ + (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `1.0` (FloatLiteral (83:28..83:31))), + )), + op: `+` (Operator (83:32..83:33)), + rhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `sign` (Ident (83:34..83:38)))), + )), + op: `*` (Operator (83:39..83:40)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `fwd` (Ident (83:41..83:44)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (83:44..83:45))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `x` (Field (83:45..83:46)))), + )), + ), + )), + )), + op: `*` (Operator (83:47..83:48)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `fwd` (Ident (83:49..83:52)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (83:52..83:53))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `x` (Field (83:53..83:54)))), + )), + ), + )), + )), + op: `*` (Operator (83:55..83:56)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `a` (Ident (83:57..83:58)))), + )), + )), + )), + (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `sign` (Ident (83:60..83:64)))), + )), + op: `*` (Operator (83:65..83:66)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `b` (Ident (83:67..83:68)))), + )), + )), + (Expr::Binary (BinaryExpr + lhs: (Expr::UnaryPre (UnaryPreExpr + op: `-` (Operator (83:70..83:71)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `sign` (Ident (83:71..83:75)))), + )), + )), + op: `*` (Operator (83:76..83:77)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `fwd` (Ident (83:78..83:81)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (83:81..83:82))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `x` (Field (83:82..83:83)))), + )), + ), + )), + )), + ], + brace_close: `)` (Brace (83:83..83:84)), + ), + )), + )), + semicolon: `;` (Punct (83:84..83:85)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (84:5..84:8)), + name: `right_dir` (Ident (84:9..84:18)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `vec3` (Type (84:21..84:25))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (84:26..84:29))), + ), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (84:30..84:31)), + arguments: [ + (Expr::UnaryPre (UnaryPreExpr + op: `-` (Operator (84:31..84:32)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `b` (Ident (84:32..84:33)))), + )), + )), + (Expr::Binary (BinaryExpr + lhs: (Expr::UnaryPre (UnaryPreExpr + op: `-` (Operator (84:35..84:36)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `sign` (Ident (84:36..84:40)))), + )), + )), + op: `-` (Operator (84:41..84:42)), + rhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `fwd` (Ident (84:43..84:46)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (84:46..84:47))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `y` (Field (84:47..84:48)))), + )), + ), + )), + op: `*` (Operator (84:49..84:50)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `fwd` (Ident (84:51..84:54)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (84:54..84:55))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `y` (Field (84:55..84:56)))), + )), + ), + )), + )), + op: `*` (Operator (84:57..84:58)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `a` (Ident (84:59..84:60)))), + )), + )), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `fwd` (Ident (84:62..84:65)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (84:65..84:66))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `y` (Field (84:66..84:67)))), + )), + ), + )), + ], + brace_close: `)` (Brace (84:67..84:68)), + ), + )), + )), + semicolon: `;` (Punct (84:68..84:69)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (85:5..85:8)), + name: `light_inv_rot` (Ident (85:9..85:22)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `mat3x3` (Type (85:25..85:31))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (85:32..85:35))), + ), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (85:36..85:37)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `right_dir` (Ident (85:37..85:46)))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `up_dir` (Ident (85:48..85:54)))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `fwd` (Ident (85:56..85:59)))), + )), + ], + brace_close: `)` (Brace (85:59..85:60)), + ), + )), + )), + semicolon: `;` (Punct (85:60..85:61)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (90:5..90:8)), + name: `projected_position` (Ident (90:9..90:27)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `offset_position` (Ident (90:30..90:45)))), + )), + op: `*` (Operator (90:46..90:47)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_inv_rot` (Ident (90:48..90:61)))), + )), + )), + semicolon: `;` (Punct (90:61..90:62)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (94:5..94:8)), + name: `f_div_minus_z` (Ident (94:9..94:22)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `1.0` (FloatLiteral (94:25..94:28))), + )), + op: `/` (Operator (94:29..94:30)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (94:31..94:32)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (94:32..94:33)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (94:33..94:34)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (94:34..94:39)))), + )), + )), + brace_close: `)` (Brace (94:39..94:40)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (94:40..94:41))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `spot_light_tan_angle` (Field (94:41..94:61)))), + )), + ), + )), + op: `*` (Operator (94:62..94:63)), + rhs: (Expr::UnaryPre (UnaryPreExpr + op: `-` (Operator (94:64..94:65)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `projected_position` (Ident (94:65..94:83)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (94:83..94:84))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `z` (Field (94:84..94:85)))), + )), + ), + )), + )), + )), + brace_close: `)` (Brace (94:85..94:86)), + )), + )), + )), + semicolon: `;` (Punct (94:86..94:87)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (95:5..95:8)), + name: `shadow_xy_ndc` (Ident (95:9..95:22)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `projected_position` (Ident (95:25..95:43)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (95:43..95:44))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xy` (Field (95:44..95:46)))), + )), + ), + )), + op: `*` (Operator (95:47..95:48)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `f_div_minus_z` (Ident (95:49..95:62)))), + )), + )), + semicolon: `;` (Punct (95:62..95:63)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (97:5..97:8)), + name: `shadow_uv` (Ident (97:9..97:18)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `shadow_xy_ndc` (Ident (97:21..97:34)))), + )), + op: `*` (Operator (97:35..97:36)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `vec2` (Type (97:37..97:41))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (97:42..97:45))), + ), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (97:46..97:47)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0.5` (FloatLiteral (97:47..97:50))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `-0.5` (FloatLiteral (97:52..97:56))), + )), + ], + brace_close: `)` (Brace (97:56..97:57)), + ), + )), + )), + )), + op: `+` (Operator (97:58..97:59)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `vec2` (Type (97:60..97:64))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (97:65..97:68))), + ), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (97:69..97:70)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0.5` (FloatLiteral (97:70..97:73))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0.5` (FloatLiteral (97:75..97:78))), + )), + ], + brace_close: `)` (Brace (97:78..97:79)), + ), + )), + )), + )), + semicolon: `;` (Punct (97:79..97:80)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (100:5..100:8)), + name: `depth` (Ident (100:9..100:14)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0.1` (FloatLiteral (100:17..100:20))), + )), + op: `/` (Operator (100:21..100:22)), + rhs: (Expr::UnaryPre (UnaryPreExpr + op: `-` (Operator (100:23..100:24)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `projected_position` (Ident (100:24..100:42)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (100:42..100:43))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `z` (Field (100:43..100:44)))), + )), + ), + )), + )), + )), + semicolon: `;` (Punct (100:44..100:45)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (103:6..103:9)), + name: `texel_size` (Ident (103:10..103:20)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0.0134277345` (FloatLiteral (103:23..103:35))), + )), + semicolon: `;` (Punct (103:35..103:36)), + )), + (Stmt::Return (ReturnStmt + keyword: `return` (Keyword (104:5..104:11)), + value: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `sample_shadow_map` (Function (104:12..104:29))), + arguments: (ArgumentList + brace_open: `(` (Brace (104:29..104:30)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `shadow_uv` (Ident (104:30..104:39)))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `depth` (Ident (104:41..104:46)))), + )), + (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `i32` (Type (104:48..104:51))), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (104:51..104:52)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_id` (Ident (104:52..104:60)))), + )), + ], + brace_close: `)` (Brace (104:60..104:61)), + ), + )), + )), + op: `+` (Operator (104:62..104:63)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Namespaced (NamespacedIdent + namespace: `view_bindings` (Module (104:64..104:77)), + ident: (IdentExpr::Leaf `lights` (Ident (104:79..104:85))), + ))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (104:85..104:86))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `spot_light_shadowmap_offset` (Field (104:86..104:113)))), + )), + ), + )), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `texel_size` (Ident (104:115..104:125)))), + )), + ], + brace_close: `)` (Brace (104:125..104:126)), + ), + )), + )), + semicolon: `;` (Punct (104:126..104:127)), + )), + ], + brace_close: `}` (Brace (105:1..105:2)), + ), + )), + (Decl::Function (FunctionDecl + storage: `fn` (Keyword (107:1..107:3)), + name: `get_cascade_index` (Function (107:4..107:21)), + params: [ + (Decl::Param (ParamDecl + name: `light_id` (Ident (107:22..107:30)), + ty: (TypeDecl + annotator: `:` (Punct (107:30..107:31)), + name: (IdentExpr::Leaf `u32` (Type (107:32..107:35))), + ), + )), + (Decl::Param (ParamDecl + name: `view_z` (Ident (107:37..107:43)), + ty: (TypeDecl + annotator: `:` (Punct (107:43..107:44)), + name: (IdentExpr::Leaf `f32` (Type (107:45..107:48))), + ), + )), + ], + return_ty: (TypeDecl + annotator: `->` (Operator (107:50..107:52)), + name: (IdentExpr::Leaf `u32` (Type (107:53..107:56))), + ), + body: (BlockStmt + brace_open: `{` (Brace (107:57..107:58)), + stmts: [ + (Stmt::Var (VarDecl + storage: `let` (Keyword (108:5..108:8)), + name: `light` (Ident (108:9..108:14)), + assignment: (Expr::UnaryPre (UnaryPreExpr + op: `&` (Operator (108:17..108:18)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Namespaced (NamespacedIdent + namespace: `view_bindings` (Module (108:18..108:31)), + ident: (IdentExpr::Leaf `lights` (Ident (108:33..108:39))), + ))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (108:39..108:40))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `directional_lights` (Field (108:40..108:58)))), + postfix: (PostfixExpr + accessor: (Accessor::Index + `[` (Brace (108:58..108:59)), + `]` (Brace (108:67..108:68)), + ), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_id` (Ident (108:59..108:67)))), + )), + ), + )), + ), + )), + )), + semicolon: `;` (Punct (108:68..108:69)), + )), + (Stmt::For (ForStmt + keyword: `for` (Keyword (110:5..110:8)), + initializer: (Stmt::Var (VarDecl + storage: `var` (Keyword (110:10..110:13)), + name: `i` (Ident (110:14..110:15)), + ty: (TypeDecl + annotator: `:` (Punct (110:15..110:16)), + name: (IdentExpr::Leaf `u32` (Type (110:17..110:20))), + ), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0u` (IntLiteral (110:23..110:25))), + )), + semicolon: `;` (Punct (110:25..110:26)), + )), + condition: (Stmt::Expr (ExprStmt + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `i` (Ident (110:27..110:28)))), + )), + op: `<` (Operator (110:29..110:30)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (110:31..110:32)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (110:32..110:33)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (110:33..110:38)))), + )), + )), + brace_close: `)` (Brace (110:38..110:39)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (110:39..110:40))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `num_cascades` (Field (110:40..110:52)))), + )), + ), + )), + )), + semicolon: `;` (Punct (110:52..110:53)), + )), + increment: (Expr::Assignment (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `i` (Ident (110:54..110:55)))), + )), + op: `=` (Operator (110:56..110:57)), + rhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `i` (Ident (110:58..110:59)))), + )), + op: `+` (Operator (110:60..110:61)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `1u` (IntLiteral (110:62..110:64))), + )), + )), + )), + body: (BlockStmt + brace_open: `{` (Brace (110:66..110:67)), + stmts: [ + (Stmt::If (IfStmt + keyword: `if` (Keyword (111:9..111:11)), + condition: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (111:12..111:13)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::UnaryPre (UnaryPreExpr + op: `-` (Operator (111:13..111:14)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `view_z` (Ident (111:14..111:20)))), + )), + )), + op: `<` (Operator (111:21..111:22)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (111:23..111:24)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (111:24..111:25)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (111:25..111:30)))), + )), + )), + brace_close: `)` (Brace (111:30..111:31)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (111:31..111:32))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `cascades` (Field (111:32..111:40)))), + postfix: (PostfixExpr + accessor: (Accessor::Index + `[` (Brace (111:40..111:41)), + `]` (Brace (111:42..111:43)), + ), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `i` (Ident (111:41..111:42)))), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (111:43..111:44))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `far_bound` (Field (111:44..111:53)))), + )), + ), + ), + )), + ), + )), + )), + brace_close: `)` (Brace (111:53..111:54)), + )), + )), + then_branch: (BlockStmt + brace_open: `{` (Brace (111:55..111:56)), + stmts: [ + (Stmt::Return (ReturnStmt + keyword: `return` (Keyword (112:13..112:19)), + value: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `i` (Ident (112:20..112:21)))), + )), + semicolon: `;` (Punct (112:21..112:22)), + )), + ], + brace_close: `}` (Brace (113:9..113:10)), + ), + )), + ], + brace_close: `}` (Brace (114:5..114:6)), + ), + )), + (Stmt::Return (ReturnStmt + keyword: `return` (Keyword (115:5..115:11)), + value: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (115:12..115:13)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (115:13..115:14)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (115:14..115:19)))), + )), + )), + brace_close: `)` (Brace (115:19..115:20)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (115:20..115:21))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `num_cascades` (Field (115:21..115:33)))), + )), + ), + )), + semicolon: `;` (Punct (115:33..115:34)), + )), + ], + brace_close: `}` (Brace (116:1..116:2)), + ), + )), + (Decl::Function (FunctionDecl + storage: `fn` (Keyword (118:1..118:3)), + name: `sample_directional_cascade` (Function (118:4..118:30)), + params: [ + (Decl::Param (ParamDecl + name: `light_id` (Ident (118:31..118:39)), + ty: (TypeDecl + annotator: `:` (Punct (118:39..118:40)), + name: (IdentExpr::Leaf `u32` (Type (118:41..118:44))), + ), + )), + (Decl::Param (ParamDecl + name: `cascade_index` (Ident (118:46..118:59)), + ty: (TypeDecl + annotator: `:` (Punct (118:59..118:60)), + name: (IdentExpr::Leaf `u32` (Type (118:61..118:64))), + ), + )), + (Decl::Param (ParamDecl + name: `frag_position` (Ident (118:66..118:79)), + ty: (TypeDecl + annotator: `:` (Punct (118:79..118:80)), + name: (IdentExpr::Leaf `vec4` (Type (118:81..118:85))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (118:86..118:89))), + ), + ), + )), + (Decl::Param (ParamDecl + name: `surface_normal` (Ident (118:92..118:106)), + ty: (TypeDecl + annotator: `:` (Punct (118:106..118:107)), + name: (IdentExpr::Leaf `vec3` (Type (118:108..118:112))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (118:113..118:116))), + ), + ), + )), + ], + return_ty: (TypeDecl + annotator: `->` (Operator (118:119..118:121)), + name: (IdentExpr::Leaf `f32` (Type (118:122..118:125))), + ), + body: (BlockStmt + brace_open: `{` (Brace (118:126..118:127)), + stmts: [ + (Stmt::Var (VarDecl + storage: `let` (Keyword (119:5..119:8)), + name: `light` (Ident (119:9..119:14)), + assignment: (Expr::UnaryPre (UnaryPreExpr + op: `&` (Operator (119:17..119:18)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Namespaced (NamespacedIdent + namespace: `view_bindings` (Module (119:18..119:31)), + ident: (IdentExpr::Leaf `lights` (Ident (119:33..119:39))), + ))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (119:39..119:40))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `directional_lights` (Field (119:40..119:58)))), + postfix: (PostfixExpr + accessor: (Accessor::Index + `[` (Brace (119:58..119:59)), + `]` (Brace (119:67..119:68)), + ), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_id` (Ident (119:59..119:67)))), + )), + ), + )), + ), + )), + )), + semicolon: `;` (Punct (119:68..119:69)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (120:5..120:8)), + name: `cascade` (Ident (120:9..120:16)), + assignment: (Expr::UnaryPre (UnaryPreExpr + op: `&` (Operator (120:19..120:20)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (120:20..120:21)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (120:21..120:22)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (120:22..120:27)))), + )), + )), + brace_close: `)` (Brace (120:27..120:28)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (120:28..120:29))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `cascades` (Field (120:29..120:37)))), + postfix: (PostfixExpr + accessor: (Accessor::Index + `[` (Brace (120:37..120:38)), + `]` (Brace (120:51..120:52)), + ), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `cascade_index` (Ident (120:38..120:51)))), + )), + ), + )), + ), + )), + )), + semicolon: `;` (Punct (120:52..120:53)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (123:5..123:8)), + name: `normal_offset` (Ident (123:9..123:22)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (123:25..123:26)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (123:26..123:27)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (123:27..123:32)))), + )), + )), + brace_close: `)` (Brace (123:32..123:33)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (123:33..123:34))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `shadow_normal_bias` (Field (123:34..123:52)))), + )), + ), + )), + op: `*` (Operator (123:53..123:54)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (123:55..123:56)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (123:56..123:57)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `cascade` (Ident (123:57..123:64)))), + )), + )), + brace_close: `)` (Brace (123:64..123:65)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (123:65..123:66))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `texel_size` (Field (123:66..123:76)))), + )), + ), + )), + )), + op: `*` (Operator (123:77..123:78)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `surface_normal` (Ident (123:79..123:93)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (123:93..123:94))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xyz` (Field (123:94..123:97)))), + )), + ), + )), + )), + semicolon: `;` (Punct (123:97..123:98)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (124:5..124:8)), + name: `depth_offset` (Ident (124:9..124:21)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (124:24..124:25)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (124:25..124:26)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (124:26..124:31)))), + )), + )), + brace_close: `)` (Brace (124:31..124:32)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (124:32..124:33))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `shadow_depth_bias` (Field (124:33..124:50)))), + )), + ), + )), + op: `*` (Operator (124:51..124:52)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (124:53..124:54)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (124:54..124:55)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (124:55..124:60)))), + )), + )), + brace_close: `)` (Brace (124:60..124:61)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (124:61..124:62))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `direction_to_light` (Field (124:62..124:80)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (124:80..124:81))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xyz` (Field (124:81..124:84)))), + )), + ), + )), + ), + )), + )), + semicolon: `;` (Punct (124:84..124:85)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (125:5..125:8)), + name: `offset_position` (Ident (125:9..125:24)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `vec4` (Type (125:27..125:31))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (125:32..125:35))), + ), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (125:36..125:37)), + arguments: [ + (Expr::Binary (BinaryExpr + lhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `frag_position` (Ident (125:37..125:50)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (125:50..125:51))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xyz` (Field (125:51..125:54)))), + )), + ), + )), + op: `+` (Operator (125:55..125:56)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `normal_offset` (Ident (125:57..125:70)))), + )), + )), + op: `+` (Operator (125:71..125:72)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `depth_offset` (Ident (125:73..125:85)))), + )), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `frag_position` (Ident (125:87..125:100)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (125:100..125:101))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `w` (Field (125:101..125:102)))), + )), + ), + )), + ], + brace_close: `)` (Brace (125:102..125:103)), + ), + )), + )), + semicolon: `;` (Punct (125:103..125:104)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (127:5..127:8)), + name: `offset_position_clip` (Ident (127:9..127:29)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (127:32..127:33)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (127:33..127:34)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `cascade` (Ident (127:34..127:41)))), + )), + )), + brace_close: `)` (Brace (127:41..127:42)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (127:42..127:43))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `view_projection` (Field (127:43..127:58)))), + )), + ), + )), + op: `*` (Operator (127:59..127:60)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `offset_position` (Ident (127:61..127:76)))), + )), + )), + semicolon: `;` (Punct (127:76..127:77)), + )), + (Stmt::If (IfStmt + keyword: `if` (Keyword (128:5..128:7)), + condition: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (128:8..128:9)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `offset_position_clip` (Ident (128:9..128:29)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (128:29..128:30))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `w` (Field (128:30..128:31)))), + )), + ), + )), + op: `<=` (Operator (128:32..128:34)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0.0` (FloatLiteral (128:35..128:38))), + )), + )), + brace_close: `)` (Brace (128:38..128:39)), + )), + )), + then_branch: (BlockStmt + brace_open: `{` (Brace (128:40..128:41)), + stmts: [ + (Stmt::Return (ReturnStmt + keyword: `return` (Keyword (129:9..129:15)), + value: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `1.0` (FloatLiteral (129:16..129:19))), + )), + semicolon: `;` (Punct (129:19..129:20)), + )), + ], + brace_close: `}` (Brace (130:5..130:6)), + ), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (131:5..131:8)), + name: `offset_position_ndc` (Ident (131:9..131:28)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `offset_position_clip` (Ident (131:31..131:51)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (131:51..131:52))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xyz` (Field (131:52..131:55)))), + )), + ), + )), + op: `/` (Operator (131:56..131:57)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `offset_position_clip` (Ident (131:58..131:78)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (131:78..131:79))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `w` (Field (131:79..131:80)))), + )), + ), + )), + )), + semicolon: `;` (Punct (131:80..131:81)), + )), + (Stmt::If (IfStmt + keyword: `if` (Keyword (133:5..133:7)), + condition: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (133:8..133:9)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `any` (Function (133:9..133:12))), + arguments: (ArgumentList + brace_open: `(` (Brace (133:12..133:13)), + arguments: [ + (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `offset_position_ndc` (Ident (133:13..133:32)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (133:32..133:33))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xy` (Field (133:33..133:35)))), + )), + ), + )), + op: `<` (Operator (133:36..133:37)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `vec2` (Type (133:38..133:42))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (133:43..133:46))), + ), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (133:47..133:48)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `-1.0` (FloatLiteral (133:48..133:52))), + )), + ], + brace_close: `)` (Brace (133:52..133:53)), + ), + )), + )), + )), + ], + brace_close: `)` (Brace (133:53..133:54)), + ), + )), + )), + op: `||` (Operator (133:55..133:57)), + rhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `offset_position_ndc` (Ident (133:58..133:77)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (133:77..133:78))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `z` (Field (133:78..133:79)))), + )), + ), + )), + op: `<` (Operator (133:80..133:81)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0.0` (FloatLiteral (133:82..133:85))), + )), + )), + )), + op: `||` (Operator (134:13..134:15)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `any` (Function (134:16..134:19))), + arguments: (ArgumentList + brace_open: `(` (Brace (134:19..134:20)), + arguments: [ + (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `offset_position_ndc` (Ident (134:20..134:39)))), + )), + op: `>` (Operator (134:40..134:41)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `vec3` (Type (134:42..134:46))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (134:47..134:50))), + ), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (134:51..134:52)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `1.0` (FloatLiteral (134:52..134:55))), + )), + ], + brace_close: `)` (Brace (134:55..134:56)), + ), + )), + )), + )), + ], + brace_close: `)` (Brace (134:56..134:57)), + ), + )), + )), + )), + brace_close: `)` (Brace (134:57..134:58)), + )), + )), + then_branch: (BlockStmt + brace_open: `{` (Brace (134:59..134:60)), + stmts: [ + (Stmt::Return (ReturnStmt + keyword: `return` (Keyword (135:9..135:15)), + value: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `1.0` (FloatLiteral (135:16..135:19))), + )), + semicolon: `;` (Punct (135:19..135:20)), + )), + ], + brace_close: `}` (Brace (136:5..136:6)), + ), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (140:5..140:8)), + name: `flip_correction` (Ident (140:9..140:24)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `vec2` (Type (140:27..140:31))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (140:32..140:35))), + ), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (140:36..140:37)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0.5` (FloatLiteral (140:37..140:40))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `-0.5` (FloatLiteral (140:42..140:46))), + )), + ], + brace_close: `)` (Brace (140:46..140:47)), + ), + )), + )), + semicolon: `;` (Punct (140:47..140:48)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (141:5..141:8)), + name: `light_local` (Ident (141:9..141:20)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `offset_position_ndc` (Ident (141:23..141:42)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (141:42..141:43))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `xy` (Field (141:43..141:45)))), + )), + ), + )), + op: `*` (Operator (141:46..141:47)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `flip_correction` (Ident (141:48..141:63)))), + )), + )), + op: `+` (Operator (141:64..141:65)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `vec2` (Type (141:66..141:70))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (141:71..141:74))), + ), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (141:75..141:76)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0.5` (FloatLiteral (141:76..141:79))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0.5` (FloatLiteral (141:81..141:84))), + )), + ], + brace_close: `)` (Brace (141:84..141:85)), + ), + )), + )), + )), + semicolon: `;` (Punct (141:85..141:86)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (143:5..143:8)), + name: `depth` (Ident (143:9..143:14)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `offset_position_ndc` (Ident (143:17..143:36)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (143:36..143:37))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `z` (Field (143:37..143:38)))), + )), + ), + )), + semicolon: `;` (Punct (143:38..143:39)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (145:5..145:8)), + name: `array_index` (Ident (145:9..145:20)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `i32` (Type (145:23..145:26))), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (145:26..145:27)), + arguments: [ + (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (145:27..145:28)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (145:28..145:29)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (145:29..145:34)))), + )), + )), + brace_close: `)` (Brace (145:34..145:35)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (145:35..145:36))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `depth_texture_base_index` (Field (145:36..145:60)))), + )), + ), + )), + op: `+` (Operator (145:61..145:62)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `cascade_index` (Ident (145:63..145:76)))), + )), + )), + ], + brace_close: `)` (Brace (145:76..145:77)), + ), + )), + )), + semicolon: `;` (Punct (145:77..145:78)), + )), + (Stmt::Return (ReturnStmt + keyword: `return` (Keyword (146:5..146:11)), + value: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `sample_shadow_map` (Function (146:12..146:29))), + arguments: (ArgumentList + brace_open: `(` (Brace (146:29..146:30)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_local` (Ident (146:30..146:41)))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `depth` (Ident (146:43..146:48)))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `array_index` (Ident (146:50..146:61)))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (146:63..146:64)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (146:64..146:65)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `cascade` (Ident (146:65..146:72)))), + )), + )), + brace_close: `)` (Brace (146:72..146:73)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (146:73..146:74))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `texel_size` (Field (146:74..146:84)))), + )), + ), + )), + ], + brace_close: `)` (Brace (146:84..146:85)), + ), + )), + )), + semicolon: `;` (Punct (146:85..146:86)), + )), + ], + brace_close: `}` (Brace (147:1..147:2)), + ), + )), + (Decl::Function (FunctionDecl + storage: `fn` (Keyword (149:1..149:3)), + name: `fetch_directional_shadow` (Function (149:4..149:28)), + params: [ + (Decl::Param (ParamDecl + name: `light_id` (Ident (149:29..149:37)), + ty: (TypeDecl + annotator: `:` (Punct (149:37..149:38)), + name: (IdentExpr::Leaf `u32` (Type (149:39..149:42))), + ), + )), + (Decl::Param (ParamDecl + name: `frag_position` (Ident (149:44..149:57)), + ty: (TypeDecl + annotator: `:` (Punct (149:57..149:58)), + name: (IdentExpr::Leaf `vec4` (Type (149:59..149:63))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (149:64..149:67))), + ), + ), + )), + (Decl::Param (ParamDecl + name: `surface_normal` (Ident (149:70..149:84)), + ty: (TypeDecl + annotator: `:` (Punct (149:84..149:85)), + name: (IdentExpr::Leaf `vec3` (Type (149:86..149:90))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (149:91..149:94))), + ), + ), + )), + (Decl::Param (ParamDecl + name: `view_z` (Ident (149:97..149:103)), + ty: (TypeDecl + annotator: `:` (Punct (149:103..149:104)), + name: (IdentExpr::Leaf `f32` (Type (149:105..149:108))), + ), + )), + ], + return_ty: (TypeDecl + annotator: `->` (Operator (149:110..149:112)), + name: (IdentExpr::Leaf `f32` (Type (149:113..149:116))), + ), + body: (BlockStmt + brace_open: `{` (Brace (149:117..149:118)), + stmts: [ + (Stmt::Var (VarDecl + storage: `let` (Keyword (150:5..150:8)), + name: `light` (Ident (150:9..150:14)), + assignment: (Expr::UnaryPre (UnaryPreExpr + op: `&` (Operator (150:17..150:18)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Namespaced (NamespacedIdent + namespace: `view_bindings` (Module (150:18..150:31)), + ident: (IdentExpr::Leaf `lights` (Ident (150:33..150:39))), + ))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (150:39..150:40))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `directional_lights` (Field (150:40..150:58)))), + postfix: (PostfixExpr + accessor: (Accessor::Index + `[` (Brace (150:58..150:59)), + `]` (Brace (150:67..150:68)), + ), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_id` (Ident (150:59..150:67)))), + )), + ), + )), + ), + )), + )), + semicolon: `;` (Punct (150:68..150:69)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (151:5..151:8)), + name: `cascade_index` (Ident (151:9..151:22)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `get_cascade_index` (Function (151:25..151:42))), + arguments: (ArgumentList + brace_open: `(` (Brace (151:42..151:43)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_id` (Ident (151:43..151:51)))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `view_z` (Ident (151:53..151:59)))), + )), + ], + brace_close: `)` (Brace (151:59..151:60)), + ), + )), + )), + semicolon: `;` (Punct (151:60..151:61)), + )), + (Stmt::If (IfStmt + keyword: `if` (Keyword (153:5..153:7)), + condition: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (153:8..153:9)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `cascade_index` (Ident (153:9..153:22)))), + )), + op: `>=` (Operator (153:23..153:25)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (153:26..153:27)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (153:27..153:28)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (153:28..153:33)))), + )), + )), + brace_close: `)` (Brace (153:33..153:34)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (153:34..153:35))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `num_cascades` (Field (153:35..153:47)))), + )), + ), + )), + )), + brace_close: `)` (Brace (153:47..153:48)), + )), + )), + then_branch: (BlockStmt + brace_open: `{` (Brace (153:49..153:50)), + stmts: [ + (Stmt::Return (ReturnStmt + keyword: `return` (Keyword (154:9..154:15)), + value: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `1.0` (FloatLiteral (154:16..154:19))), + )), + semicolon: `;` (Punct (154:19..154:20)), + )), + ], + brace_close: `}` (Brace (155:5..155:6)), + ), + )), + (Stmt::Var (VarDecl + storage: `var` (Keyword (157:5..157:8)), + name: `shadow` (Ident (157:9..157:15)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `sample_directional_cascade` (Function (157:18..157:44))), + arguments: (ArgumentList + brace_open: `(` (Brace (157:44..157:45)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_id` (Ident (157:45..157:53)))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `cascade_index` (Ident (157:55..157:68)))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `frag_position` (Ident (157:70..157:83)))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `surface_normal` (Ident (157:85..157:99)))), + )), + ], + brace_close: `)` (Brace (157:99..157:100)), + ), + )), + )), + semicolon: `;` (Punct (157:100..157:101)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (160:5..160:8)), + name: `next_cascade_index` (Ident (160:9..160:27)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `cascade_index` (Ident (160:30..160:43)))), + )), + op: `+` (Operator (160:44..160:45)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `1u` (IntLiteral (160:46..160:48))), + )), + )), + semicolon: `;` (Punct (160:48..160:49)), + )), + (Stmt::If (IfStmt + keyword: `if` (Keyword (161:5..161:7)), + condition: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (161:8..161:9)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `next_cascade_index` (Ident (161:9..161:27)))), + )), + op: `<` (Operator (161:28..161:29)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (161:30..161:31)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (161:31..161:32)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (161:32..161:37)))), + )), + )), + brace_close: `)` (Brace (161:37..161:38)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (161:38..161:39))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `num_cascades` (Field (161:39..161:51)))), + )), + ), + )), + )), + brace_close: `)` (Brace (161:51..161:52)), + )), + )), + then_branch: (BlockStmt + brace_open: `{` (Brace (161:53..161:54)), + stmts: [ + (Stmt::Var (VarDecl + storage: `let` (Keyword (162:9..162:12)), + name: `this_far_bound` (Ident (162:13..162:27)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (162:30..162:31)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (162:31..162:32)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (162:32..162:37)))), + )), + )), + brace_close: `)` (Brace (162:37..162:38)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (162:38..162:39))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `cascades` (Field (162:39..162:47)))), + postfix: (PostfixExpr + accessor: (Accessor::Index + `[` (Brace (162:47..162:48)), + `]` (Brace (162:61..162:62)), + ), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `cascade_index` (Ident (162:48..162:61)))), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (162:62..162:63))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `far_bound` (Field (162:63..162:72)))), + )), + ), + ), + )), + ), + )), + semicolon: `;` (Punct (162:72..162:73)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (163:9..163:12)), + name: `next_near_bound` (Ident (163:13..163:28)), + assignment: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (163:31..163:32)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `1.0` (FloatLiteral (163:32..163:35))), + )), + op: `-` (Operator (163:36..163:37)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (163:38..163:39)), + expr: (Expr::UnaryPre (UnaryPreExpr + op: `*` (Operator (163:39..163:40)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light` (Ident (163:40..163:45)))), + )), + )), + brace_close: `)` (Brace (163:45..163:46)), + )), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (163:46..163:47))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `cascades_overlap_proportion` (Field (163:47..163:74)))), + )), + ), + )), + )), + brace_close: `)` (Brace (163:74..163:75)), + )), + )), + op: `*` (Operator (163:76..163:77)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `this_far_bound` (Ident (163:78..163:92)))), + )), + )), + semicolon: `;` (Punct (163:92..163:93)), + )), + (Stmt::If (IfStmt + keyword: `if` (Keyword (164:9..164:11)), + condition: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (164:12..164:13)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::UnaryPre (UnaryPreExpr + op: `-` (Operator (164:13..164:14)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `view_z` (Ident (164:14..164:20)))), + )), + )), + op: `>=` (Operator (164:21..164:23)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `next_near_bound` (Ident (164:24..164:39)))), + )), + )), + brace_close: `)` (Brace (164:39..164:40)), + )), + )), + then_branch: (BlockStmt + brace_open: `{` (Brace (164:41..164:42)), + stmts: [ + (Stmt::Var (VarDecl + storage: `let` (Keyword (165:13..165:16)), + name: `next_shadow` (Ident (165:17..165:28)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `sample_directional_cascade` (Function (165:31..165:57))), + arguments: (ArgumentList + brace_open: `(` (Brace (165:57..165:58)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_id` (Ident (165:58..165:66)))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `next_cascade_index` (Ident (165:68..165:86)))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `frag_position` (Ident (165:88..165:101)))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `surface_normal` (Ident (165:103..165:117)))), + )), + ], + brace_close: `)` (Brace (165:117..165:118)), + ), + )), + )), + semicolon: `;` (Punct (165:118..165:119)), + )), + (Stmt::Expr (ExprStmt + expr: (Expr::Assignment (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `shadow` (Ident (166:13..166:19)))), + )), + op: `=` (Operator (166:20..166:21)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `mix` (Function (166:22..166:25))), + arguments: (ArgumentList + brace_open: `(` (Brace (166:25..166:26)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `shadow` (Ident (166:26..166:32)))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `next_shadow` (Ident (166:34..166:45)))), + )), + (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (166:47..166:48)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::UnaryPre (UnaryPreExpr + op: `-` (Operator (166:48..166:49)), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `view_z` (Ident (166:49..166:55)))), + )), + )), + op: `-` (Operator (166:56..166:57)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `next_near_bound` (Ident (166:58..166:73)))), + )), + )), + brace_close: `)` (Brace (166:73..166:74)), + )), + )), + op: `/` (Operator (166:75..166:76)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (166:77..166:78)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `this_far_bound` (Ident (166:78..166:92)))), + )), + op: `-` (Operator (166:93..166:94)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `next_near_bound` (Ident (166:95..166:110)))), + )), + )), + brace_close: `)` (Brace (166:110..166:111)), + )), + )), + )), + ], + brace_close: `)` (Brace (166:111..166:112)), + ), + )), + )), + )), + semicolon: `;` (Punct (166:112..166:113)), + )), + ], + brace_close: `}` (Brace (167:9..167:10)), + ), + )), + ], + brace_close: `}` (Brace (168:5..168:6)), + ), + )), + (Stmt::Return (ReturnStmt + keyword: `return` (Keyword (169:5..169:11)), + value: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `shadow` (Ident (169:12..169:18)))), + )), + semicolon: `;` (Punct (169:18..169:19)), + )), + ], + brace_close: `}` (Brace (170:1..170:2)), + ), + )), + (Decl::Function (FunctionDecl + storage: `fn` (Keyword (172:1..172:3)), + name: `cascade_debug_visualization` (Function (172:4..172:31)), + params: [ + (Decl::Param (ParamDecl + name: `output_color` (Ident (173:5..173:17)), + ty: (TypeDecl + annotator: `:` (Punct (173:17..173:18)), + name: (IdentExpr::Leaf `vec3` (Type (173:19..173:23))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (173:24..173:27))), + ), + ), + )), + (Decl::Param (ParamDecl + name: `light_id` (Ident (174:5..174:13)), + ty: (TypeDecl + annotator: `:` (Punct (174:13..174:14)), + name: (IdentExpr::Leaf `u32` (Type (174:15..174:18))), + ), + )), + (Decl::Param (ParamDecl + name: `view_z` (Ident (175:5..175:11)), + ty: (TypeDecl + annotator: `:` (Punct (175:11..175:12)), + name: (IdentExpr::Leaf `f32` (Type (175:13..175:16))), + ), + )), + ], + return_ty: (TypeDecl + annotator: `->` (Operator (176:3..176:5)), + name: (IdentExpr::Leaf `vec3` (Type (176:6..176:10))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (176:11..176:14))), + ), + ), + body: (BlockStmt + brace_open: `{` (Brace (176:16..176:17)), + stmts: [ + (Stmt::Var (VarDecl + storage: `let` (Keyword (177:5..177:8)), + name: `overlay_alpha` (Ident (177:9..177:22)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0.95` (FloatLiteral (177:25..177:29))), + )), + semicolon: `;` (Punct (177:29..177:30)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (178:5..178:8)), + name: `cascade_index` (Ident (178:9..178:22)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `get_cascade_index` (Function (178:25..178:42))), + arguments: (ArgumentList + brace_open: `(` (Brace (178:42..178:43)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `light_id` (Ident (178:43..178:51)))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `view_z` (Ident (178:53..178:59)))), + )), + ], + brace_close: `)` (Brace (178:59..178:60)), + ), + )), + )), + semicolon: `;` (Punct (178:60..178:61)), + )), + (Stmt::Var (VarDecl + storage: `let` (Keyword (179:5..179:8)), + name: `cascade_color` (Ident (179:9..179:22)), + assignment: (Expr::Primary (PrimaryExpr + expr: (Expr::FnCall (FnCallExpr + ident: (IdentExpr::Leaf `hsv2rgb` (Function (179:25..179:32))), + arguments: (ArgumentList + brace_open: `(` (Brace (179:32..179:33)), + arguments: [ + (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (179:33..179:36))), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (179:36..179:37)), + arguments: [ + (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `cascade_index` (Ident (179:37..179:50)))), + )), + ], + brace_close: `)` (Brace (179:50..179:51)), + ), + )), + )), + op: `/` (Operator (179:52..179:53)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (179:54..179:57))), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (179:57..179:58)), + arguments: [ + (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `u` (Ident (179:83..179:84)))), + )), + op: `+` (Operator (179:85..179:86)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `1u` (IntLiteral (179:87..179:89))), + )), + )), + ], + brace_close: `)` (Brace (179:89..179:90)), + ), + )), + )), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `1.0` (FloatLiteral (179:92..179:95))), + )), + (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `0.5` (FloatLiteral (179:97..179:100))), + )), + ], + brace_close: `)` (Brace (179:100..179:101)), + ), + )), + )), + semicolon: `;` (Punct (179:101..179:102)), + )), + (Stmt::Return (ReturnStmt + keyword: `return` (Keyword (180:5..180:11)), + value: (Expr::Primary (PrimaryExpr + expr: (Expr::TypeCtor (TypeCtorExpr + ty: (TypeDecl + name: (IdentExpr::Leaf `vec3` (Type (180:12..180:16))), + child_ty: (TypeDecl + name: (IdentExpr::Leaf `f32` (Type (180:17..180:20))), + ), + ), + arguments: (ArgumentList + brace_open: `(` (Brace (180:21..180:22)), + arguments: [ + (Expr::Binary (BinaryExpr + lhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Group (GroupExpr + brace_open: `(` (Brace (181:9..181:10)), + expr: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Literal `1.0` (FloatLiteral (181:10..181:13))), + )), + op: `-` (Operator (181:14..181:15)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `overlay_alpha` (Ident (181:16..181:29)))), + )), + )), + brace_close: `)` (Brace (181:29..181:30)), + )), + )), + op: `*` (Operator (181:31..181:32)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `output_color` (Ident (181:33..181:45)))), + postfix: (PostfixExpr + accessor: (Accessor::Dot `.` (Punct (181:45..181:46))), + expr: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `rgb` (Field (181:46..181:49)))), + )), + ), + )), + )), + op: `+` (Operator (181:50..181:51)), + rhs: (Expr::Binary (BinaryExpr + lhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `overlay_alpha` (Ident (181:52..181:65)))), + )), + op: `*` (Operator (181:66..181:67)), + rhs: (Expr::Primary (PrimaryExpr + expr: (Expr::Ident (IdentExpr::Leaf `cascade_color` (Ident (181:68..181:81)))), + )), + )), + )), + ], + brace_close: `)` (Brace (182:5..182:6)), + ), + )), + )), + semicolon: `;` (Punct (182:6..182:7)), + )), + ], + brace_close: `}` (Brace (183:1..183:2)), + ), + )), + ], +) +--- Comments ------------------------------------------------------------------- +(Comment::Line (LineComment + start: `//` (CommentStart (15:5..15:7)), + text: (Text + `because the shadow maps align with the axes and the frustum planes are at 45 degrees` (15:8..15:92) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (16:5..16:7)), + text: (Text + `we can get the worldspace depth by taking the largest absolute axis` (16:8..16:75) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (21:5..21:7)), + text: (Text + `The normal bias here is already scaled by the texel size at 1 world unit from the light.` (21:8..21:96) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (22:5..22:7)), + text: (Text + `The texel size increases proportionally with distance from the light so multiplying by` (22:8..22:94) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (23:5..23:7)), + text: (Text + `distance to light scales the normal bias to the texel size at the fragment distance.` (23:8..23:92) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (28:5..28:7)), + text: (Text + `similar largest-absolute-axis trick as above, but now with the offset fragment position` (28:8..28:95) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (33:5..33:7)), + text: (Text + `NOTE: These simplifications come from multiplying:` (33:8..33:58) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (34:5..34:7)), + text: (Text + `projection * vec4(0, 0, -major_axis_magnitude, 1.0)` (34:8..34:59) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (35:5..35:7)), + text: (Text + `and keeping only the terms that have any impact on the depth.` (35:8..35:69) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (36:5..36:7)), + text: (Text + `Projection-agnostic approach:` (36:8..36:37) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (40:5..40:7)), + text: (Text + `Do the lookup, using HW PCF and comparison. Cubemaps assume a left-handed coordinate space,` (40:8..40:99) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (41:5..41:7)), + text: (Text + `so we have to flip the z-axis when sampling.` (41:8..41:52) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (42:5..42:7)), + text: (Text + `NOTE: Due to the non-uniform control flow above, we must use the Level variant of` (42:8..42:89) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (43:5..43:7)), + text: (Text + `textureSampleCompare to avoid undefined behavior due to some of the fragments in` (43:8..43:88) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (44:5..44:7)), + text: (Text + `a quad (2x2 fragments) being processed not being sampled, and this messing with` (44:8..44:87) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (45:5..45:7)), + text: (Text + `mip-mapping functionality. The shadow maps have no mipmaps so Level just samples` (45:8..45:88) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (46:5..46:7)), + text: (Text + `from LOD 0.` (46:8..46:19) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (59:5..59:7)), + text: (Text + `construct the light view matrix` (59:8..59:39) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (61:5..61:7)), + text: (Text + `reconstruct spot dir from x/z and y-direction flag` (61:8..61:58) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (67:5..67:7)), + text: (Text + `view matrix z_axis is the reverse of transform.forward()` (67:8..67:64) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (75:5..75:7)), + text: (Text + `the construction of the up and right vectors needs to precisely mirror the code` (75:8..75:87) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (76:5..76:7)), + text: (Text + `in render/light.rs:spot_light_view_matrix` (76:8..76:49) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (87:5..87:7)), + text: (Text + `because the matrix is a pure rotation matrix, the inverse is just the transpose, and to calculate` (87:8..87:105) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (88:5..88:7)), + text: (Text + `the product of the transpose with a vector we can just post-multiply instead of pre-multiplying.` (88:8..88:104) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (89:5..89:7)), + text: (Text + `this allows us to keep the matrix construction code identical between CPU and GPU.` (89:8..89:90) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (92:5..92:7)), + text: (Text + `divide xy by perspective matrix "f" and by -projected.z (projected.z is -projection matrix's w)` (92:8..92:103) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (93:5..93:7)), + text: (Text + `to get ndc coordinates` (93:8..93:30) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (96:5..96:7)), + text: (Text + `convert to uv coordinates` (96:8..96:33) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (99:5..99:7)), + text: (Text + `0.1 must match POINT_LIGHT_NEAR_Z` (99:8..99:41) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (102:6..102:8)), + text: (Text + `Number determined by trial and error that gave nice results.` (102:9..102:69) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (122:5..122:7)), + text: (Text + `The normal bias is scaled to the texel size.` (122:8..122:52) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (132:5..132:7)), + text: (Text + `No shadow outside the orthographic projection volume` (132:8..132:60) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (138:5..138:7)), + text: (Text + `compute texture coordinates for shadow lookup, compensating for the Y-flip difference` (138:8..138:93) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (139:5..139:7)), + text: (Text + `between the NDC and texture coordinates` (139:8..139:47) + ), +)) +(Comment::Line (LineComment + start: `//` (CommentStart (159:5..159:7)), + text: (Text + `Blend with the next cascade, if there is one.` (159:8..159:53) + ), +)) +--- Errors --------------------------------------------------------------------- + +ERROR: Expected expression + | +179 | let cascade_color = hsv2rgb(f32(cascade_index) / f32(#{MAX_CASCADES_PER_LIGHT}u + 1u), 1.0, 0.5); + | ^------------------------ + +--- Tokens --------------------------------------------------------------------- +`#define_import_path` (Directive (1:1..1:20)) +`bevy_pbr` (Module (1:21..1:29)) +`::` (Punct (1:29..1:31)) +`shadows` (Module (1:31..1:38)) +`#import` (Directive (3:1..3:8)) +`bevy_pbr` (Module (3:9..3:17)) +`::` (Punct (3:17..3:19)) +`{` (Brace (3:19..3:20)) +`mesh_view_types` (Module (4:5..4:20)) +`::` (Punct (4:20..4:22)) +`POINT_LIGHT_FLAGS_SPOT_LIGHT_Y_NEGATIVE` (Module (4:22..4:61)) +`,` (Punct (4:61..4:62)) +`mesh_view_bindings` (Module (5:5..5:23)) +`as` (Keyword (5:24..5:26)) +`view_bindings` (Module (5:27..5:40)) +`,` (Punct (5:40..5:41)) +`utils` (Module (6:5..6:10)) +`::` (Punct (6:10..6:12)) +`hsv2rgb` (Module (6:12..6:19)) +`,` (Punct (6:19..6:20)) +`shadow_sampling` (Module (7:5..7:20)) +`::` (Punct (7:20..7:22)) +`sample_shadow_map` (Module (7:22..7:39)) +`}` (Brace (8:1..8:2)) +`const` (Keyword (10:1..10:6)) +`flip_z` (Ident (10:7..10:13)) +`:` (Punct (10:13..10:14)) +`vec3` (Type (10:15..10:19)) +`<` (Operator (10:19..10:20)) +`f32` (Type (10:20..10:23)) +`>` (Operator (10:23..10:24)) +`=` (Operator (10:25..10:26)) +`vec3` (Type (10:27..10:31)) +`<` (Operator (10:31..10:32)) +`f32` (Type (10:32..10:35)) +`>` (Operator (10:35..10:36)) +`(` (Brace (10:36..10:37)) +`1.0` (FloatLiteral (10:37..10:40)) +`,` (Punct (10:40..10:41)) +`1.0` (FloatLiteral (10:42..10:45)) +`,` (Punct (10:45..10:46)) +`-1.0` (FloatLiteral (10:47..10:51)) +`)` (Brace (10:51..10:52)) +`;` (Punct (10:52..10:53)) +`fn` (Keyword (12:1..12:3)) +`fetch_point_shadow` (Function (12:4..12:22)) +`(` (Brace (12:22..12:23)) +`light_id` (Ident (12:23..12:31)) +`:` (Punct (12:31..12:32)) +`u32` (Type (12:33..12:36)) +`,` (Punct (12:36..12:37)) +`frag_position` (Ident (12:38..12:51)) +`:` (Punct (12:51..12:52)) +`vec4` (Type (12:53..12:57)) +`<` (Operator (12:57..12:58)) +`f32` (Type (12:58..12:61)) +`>` (Operator (12:61..12:62)) +`,` (Punct (12:62..12:63)) +`surface_normal` (Ident (12:64..12:78)) +`:` (Punct (12:78..12:79)) +`vec3` (Type (12:80..12:84)) +`<` (Operator (12:84..12:85)) +`f32` (Type (12:85..12:88)) +`>` (Operator (12:88..12:89)) +`)` (Brace (12:89..12:90)) +`->` (Operator (12:91..12:93)) +`f32` (Type (12:94..12:97)) +`{` (Brace (12:98..12:99)) +`let` (Keyword (13:5..13:8)) +`light` (Ident (13:9..13:14)) +`=` (Operator (13:15..13:16)) +`&` (Operator (13:17..13:18)) +`view_bindings` (Module (13:18..13:31)) +`::` (Punct (13:31..13:33)) +`point_lights` (Ident (13:33..13:45)) +`.` (Punct (13:45..13:46)) +`data` (Field (13:46..13:50)) +`[` (Brace (13:50..13:51)) +`light_id` (Ident (13:51..13:59)) +`]` (Brace (13:59..13:60)) +`;` (Punct (13:60..13:61)) +`//` (CommentStart (15:5..15:7)) +`because` (Plain (15:8..15:15)) +`the` (Plain (15:16..15:19)) +`shadow` (Plain (15:20..15:26)) +`maps` (Plain (15:27..15:31)) +`align` (Plain (15:32..15:37)) +`with` (Plain (15:38..15:42)) +`the` (Plain (15:43..15:46)) +`axes` (Plain (15:47..15:51)) +`and` (Plain (15:52..15:55)) +`the` (Plain (15:56..15:59)) +`frustum` (Plain (15:60..15:67)) +`planes` (Plain (15:68..15:74)) +`are` (Plain (15:75..15:78)) +`at` (Plain (15:79..15:81)) +`45` (Plain (15:82..15:84)) +`degrees` (Plain (15:85..15:92)) +`//` (CommentStart (16:5..16:7)) +`we` (Plain (16:8..16:10)) +`can` (Plain (16:11..16:14)) +`get` (Plain (16:15..16:18)) +`the` (Plain (16:19..16:22)) +`worldspace` (Plain (16:23..16:33)) +`depth` (Plain (16:34..16:39)) +`by` (Plain (16:40..16:42)) +`taking` (Plain (16:43..16:49)) +`the` (Plain (16:50..16:53)) +`largest` (Plain (16:54..16:61)) +`absolute` (Plain (16:62..16:70)) +`axis` (Plain (16:71..16:75)) +`let` (Keyword (17:5..17:8)) +`surface_to_light` (Ident (17:9..17:25)) +`=` (Operator (17:26..17:27)) +`(` (Brace (17:28..17:29)) +`*` (Operator (17:29..17:30)) +`light` (Ident (17:30..17:35)) +`)` (Brace (17:35..17:36)) +`.` (Punct (17:36..17:37)) +`position_radius` (Field (17:37..17:52)) +`.` (Punct (17:52..17:53)) +`xyz` (Field (17:53..17:56)) +`-` (Operator (17:57..17:58)) +`frag_position` (Ident (17:59..17:72)) +`.` (Punct (17:72..17:73)) +`xyz` (Field (17:73..17:76)) +`;` (Punct (17:76..17:77)) +`let` (Keyword (18:5..18:8)) +`surface_to_light_abs` (Ident (18:9..18:29)) +`=` (Operator (18:30..18:31)) +`abs` (Function (18:32..18:35)) +`(` (Brace (18:35..18:36)) +`surface_to_light` (Ident (18:36..18:52)) +`)` (Brace (18:52..18:53)) +`;` (Punct (18:53..18:54)) +`let` (Keyword (19:5..19:8)) +`distance_to_light` (Ident (19:9..19:26)) +`=` (Operator (19:27..19:28)) +`max` (Function (19:29..19:32)) +`(` (Brace (19:32..19:33)) +`surface_to_light_abs` (Ident (19:33..19:53)) +`.` (Punct (19:53..19:54)) +`x` (Field (19:54..19:55)) +`,` (Punct (19:55..19:56)) +`max` (Function (19:57..19:60)) +`(` (Brace (19:60..19:61)) +`surface_to_light_abs` (Ident (19:61..19:81)) +`.` (Punct (19:81..19:82)) +`y` (Field (19:82..19:83)) +`,` (Punct (19:83..19:84)) +`surface_to_light_abs` (Ident (19:85..19:105)) +`.` (Punct (19:105..19:106)) +`z` (Field (19:106..19:107)) +`)` (Brace (19:107..19:108)) +`)` (Brace (19:108..19:109)) +`;` (Punct (19:109..19:110)) +`//` (CommentStart (21:5..21:7)) +`The` (Plain (21:8..21:11)) +`normal` (Plain (21:12..21:18)) +`bias` (Plain (21:19..21:23)) +`here` (Plain (21:24..21:28)) +`is` (Plain (21:29..21:31)) +`already` (Plain (21:32..21:39)) +`scaled` (Plain (21:40..21:46)) +`by` (Plain (21:47..21:49)) +`the` (Plain (21:50..21:53)) +`texel` (Plain (21:54..21:59)) +`size` (Plain (21:60..21:64)) +`at` (Plain (21:65..21:67)) +`1` (Plain (21:68..21:69)) +`world` (Plain (21:70..21:75)) +`unit` (Plain (21:76..21:80)) +`from` (Plain (21:81..21:85)) +`the` (Plain (21:86..21:89)) +`light` (Plain (21:90..21:95)) +`.` (Plain (21:95..21:96)) +`//` (CommentStart (22:5..22:7)) +`The` (Plain (22:8..22:11)) +`texel` (Plain (22:12..22:17)) +`size` (Plain (22:18..22:22)) +`increases` (Plain (22:23..22:32)) +`proportionally` (Plain (22:33..22:47)) +`with` (Plain (22:48..22:52)) +`distance` (Plain (22:53..22:61)) +`from` (Plain (22:62..22:66)) +`the` (Plain (22:67..22:70)) +`light` (Plain (22:71..22:76)) +`so` (Plain (22:77..22:79)) +`multiplying` (Plain (22:80..22:91)) +`by` (Plain (22:92..22:94)) +`//` (CommentStart (23:5..23:7)) +`distance` (Plain (23:8..23:16)) +`to` (Plain (23:17..23:19)) +`light` (Plain (23:20..23:25)) +`scales` (Plain (23:26..23:32)) +`the` (Plain (23:33..23:36)) +`normal` (Plain (23:37..23:43)) +`bias` (Plain (23:44..23:48)) +`to` (Plain (23:49..23:51)) +`the` (Plain (23:52..23:55)) +`texel` (Plain (23:56..23:61)) +`size` (Plain (23:62..23:66)) +`at` (Plain (23:67..23:69)) +`the` (Plain (23:70..23:73)) +`fragment` (Plain (23:74..23:82)) +`distance` (Plain (23:83..23:91)) +`.` (Plain (23:91..23:92)) +`let` (Keyword (24:5..24:8)) +`normal_offset` (Ident (24:9..24:22)) +`=` (Operator (24:23..24:24)) +`(` (Brace (24:25..24:26)) +`*` (Operator (24:26..24:27)) +`light` (Ident (24:27..24:32)) +`)` (Brace (24:32..24:33)) +`.` (Punct (24:33..24:34)) +`shadow_normal_bias` (Field (24:34..24:52)) +`*` (Operator (24:53..24:54)) +`distance_to_light` (Ident (24:55..24:72)) +`*` (Operator (24:73..24:74)) +`surface_normal` (Ident (24:75..24:89)) +`.` (Punct (24:89..24:90)) +`xyz` (Field (24:90..24:93)) +`;` (Punct (24:93..24:94)) +`let` (Keyword (25:5..25:8)) +`depth_offset` (Ident (25:9..25:21)) +`=` (Operator (25:22..25:23)) +`(` (Brace (25:24..25:25)) +`*` (Operator (25:25..25:26)) +`light` (Ident (25:26..25:31)) +`)` (Brace (25:31..25:32)) +`.` (Punct (25:32..25:33)) +`shadow_depth_bias` (Field (25:33..25:50)) +`*` (Operator (25:51..25:52)) +`normalize` (Function (25:53..25:62)) +`(` (Brace (25:62..25:63)) +`surface_to_light` (Ident (25:63..25:79)) +`.` (Punct (25:79..25:80)) +`xyz` (Field (25:80..25:83)) +`)` (Brace (25:83..25:84)) +`;` (Punct (25:84..25:85)) +`let` (Keyword (26:5..26:8)) +`offset_position` (Ident (26:9..26:24)) +`=` (Operator (26:25..26:26)) +`frag_position` (Ident (26:27..26:40)) +`.` (Punct (26:40..26:41)) +`xyz` (Field (26:41..26:44)) +`+` (Operator (26:45..26:46)) +`normal_offset` (Ident (26:47..26:60)) +`+` (Operator (26:61..26:62)) +`depth_offset` (Ident (26:63..26:75)) +`;` (Punct (26:75..26:76)) +`//` (CommentStart (28:5..28:7)) +`similar` (Plain (28:8..28:15)) +`largest` (Plain (28:16..28:23)) +`-` (Plain (28:23..28:24)) +`absolute` (Plain (28:24..28:32)) +`-` (Plain (28:32..28:33)) +`axis` (Plain (28:33..28:37)) +`trick` (Plain (28:38..28:43)) +`as` (Plain (28:44..28:46)) +`above` (Plain (28:47..28:52)) +`,` (Plain (28:52..28:53)) +`but` (Plain (28:54..28:57)) +`now` (Plain (28:58..28:61)) +`with` (Plain (28:62..28:66)) +`the` (Plain (28:67..28:70)) +`offset` (Plain (28:71..28:77)) +`fragment` (Plain (28:78..28:86)) +`position` (Plain (28:87..28:95)) +`let` (Keyword (29:5..29:8)) +`frag_ls` (Ident (29:9..29:16)) +`=` (Operator (29:17..29:18)) +`offset_position` (Ident (29:19..29:34)) +`.` (Punct (29:34..29:35)) +`xyz` (Field (29:35..29:38)) +`-` (Operator (29:39..29:40)) +`(` (Brace (29:41..29:42)) +`*` (Operator (29:42..29:43)) +`light` (Ident (29:43..29:48)) +`)` (Brace (29:48..29:49)) +`.` (Punct (29:49..29:50)) +`position_radius` (Field (29:50..29:65)) +`.` (Punct (29:65..29:66)) +`xyz` (Field (29:66..29:69)) +`;` (Punct (29:70..29:71)) +`let` (Keyword (30:5..30:8)) +`abs_position_ls` (Ident (30:9..30:24)) +`=` (Operator (30:25..30:26)) +`abs` (Function (30:27..30:30)) +`(` (Brace (30:30..30:31)) +`frag_ls` (Ident (30:31..30:38)) +`)` (Brace (30:38..30:39)) +`;` (Punct (30:39..30:40)) +`let` (Keyword (31:5..31:8)) +`major_axis_magnitude` (Ident (31:9..31:29)) +`=` (Operator (31:30..31:31)) +`max` (Function (31:32..31:35)) +`(` (Brace (31:35..31:36)) +`abs_position_ls` (Ident (31:36..31:51)) +`.` (Punct (31:51..31:52)) +`x` (Field (31:52..31:53)) +`,` (Punct (31:53..31:54)) +`max` (Function (31:55..31:58)) +`(` (Brace (31:58..31:59)) +`abs_position_ls` (Ident (31:59..31:74)) +`.` (Punct (31:74..31:75)) +`y` (Field (31:75..31:76)) +`,` (Punct (31:76..31:77)) +`abs_position_ls` (Ident (31:78..31:93)) +`.` (Punct (31:93..31:94)) +`z` (Field (31:94..31:95)) +`)` (Brace (31:95..31:96)) +`)` (Brace (31:96..31:97)) +`;` (Punct (31:97..31:98)) +`//` (CommentStart (33:5..33:7)) +`NOTE` (Plain (33:8..33:12)) +`:` (Plain (33:12..33:13)) +`These` (Plain (33:14..33:19)) +`simplifications` (Plain (33:20..33:35)) +`come` (Plain (33:36..33:40)) +`from` (Plain (33:41..33:45)) +`multiplying` (Plain (33:46..33:57)) +`:` (Plain (33:57..33:58)) +`//` (CommentStart (34:5..34:7)) +`projection` (Plain (34:8..34:18)) +`*` (Plain (34:19..34:20)) +`vec4` (Plain (34:21..34:25)) +`(` (Plain (34:25..34:26)) +`0` (Plain (34:26..34:27)) +`,` (Plain (34:27..34:28)) +`0` (Plain (34:29..34:30)) +`,` (Plain (34:30..34:31)) +`-` (Plain (34:32..34:33)) +`major_axis_magnitude` (Plain (34:33..34:53)) +`,` (Plain (34:53..34:54)) +`1.0` (Plain (34:55..34:58)) +`)` (Plain (34:58..34:59)) +`//` (CommentStart (35:5..35:7)) +`and` (Plain (35:8..35:11)) +`keeping` (Plain (35:12..35:19)) +`only` (Plain (35:20..35:24)) +`the` (Plain (35:25..35:28)) +`terms` (Plain (35:29..35:34)) +`that` (Plain (35:35..35:39)) +`have` (Plain (35:40..35:44)) +`any` (Plain (35:45..35:48)) +`impact` (Plain (35:49..35:55)) +`on` (Plain (35:56..35:58)) +`the` (Plain (35:59..35:62)) +`depth` (Plain (35:63..35:68)) +`.` (Plain (35:68..35:69)) +`//` (CommentStart (36:5..36:7)) +`Projection` (Plain (36:8..36:18)) +`-` (Plain (36:18..36:19)) +`agnostic` (Plain (36:19..36:27)) +`approach` (Plain (36:28..36:36)) +`:` (Plain (36:36..36:37)) +`let` (Keyword (37:5..37:8)) +`zw` (Ident (37:9..37:11)) +`=` (Operator (37:12..37:13)) +`-` (Operator (37:14..37:15)) +`major_axis_magnitude` (Ident (37:15..37:35)) +`*` (Operator (37:36..37:37)) +`(` (Brace (37:38..37:39)) +`*` (Operator (37:39..37:40)) +`light` (Ident (37:40..37:45)) +`)` (Brace (37:45..37:46)) +`.` (Punct (37:46..37:47)) +`light_custom_data` (Field (37:47..37:64)) +`.` (Punct (37:64..37:65)) +`xy` (Field (37:65..37:67)) +`+` (Operator (37:68..37:69)) +`(` (Brace (37:70..37:71)) +`*` (Operator (37:71..37:72)) +`light` (Ident (37:72..37:77)) +`)` (Brace (37:77..37:78)) +`.` (Punct (37:78..37:79)) +`light_custom_data` (Field (37:79..37:96)) +`.` (Punct (37:96..37:97)) +`zw` (Field (37:97..37:99)) +`;` (Punct (37:99..37:100)) +`let` (Keyword (38:5..38:8)) +`depth` (Ident (38:9..38:14)) +`=` (Operator (38:15..38:16)) +`zw` (Ident (38:17..38:19)) +`.` (Punct (38:19..38:20)) +`x` (Field (38:20..38:21)) +`/` (Operator (38:22..38:23)) +`zw` (Ident (38:24..38:26)) +`.` (Punct (38:26..38:27)) +`y` (Field (38:27..38:28)) +`;` (Punct (38:28..38:29)) +`//` (CommentStart (40:5..40:7)) +`Do` (Plain (40:8..40:10)) +`the` (Plain (40:11..40:14)) +`lookup` (Plain (40:15..40:21)) +`,` (Plain (40:21..40:22)) +`using` (Plain (40:23..40:28)) +`HW` (Plain (40:29..40:31)) +`PCF` (Plain (40:32..40:35)) +`and` (Plain (40:36..40:39)) +`comparison` (Plain (40:40..40:50)) +`.` (Plain (40:50..40:51)) +`Cubemaps` (Plain (40:52..40:60)) +`assume` (Plain (40:61..40:67)) +`a` (Plain (40:68..40:69)) +`left` (Plain (40:70..40:74)) +`-` (Plain (40:74..40:75)) +`handed` (Plain (40:75..40:81)) +`coordinate` (Plain (40:82..40:92)) +`space` (Plain (40:93..40:98)) +`,` (Plain (40:98..40:99)) +`//` (CommentStart (41:5..41:7)) +`so` (Plain (41:8..41:10)) +`we` (Plain (41:11..41:13)) +`have` (Plain (41:14..41:18)) +`to` (Plain (41:19..41:21)) +`flip` (Plain (41:22..41:26)) +`the` (Plain (41:27..41:30)) +`z` (Plain (41:31..41:32)) +`-` (Plain (41:32..41:33)) +`axis` (Plain (41:33..41:37)) +`when` (Plain (41:38..41:42)) +`sampling` (Plain (41:43..41:51)) +`.` (Plain (41:51..41:52)) +`//` (CommentStart (42:5..42:7)) +`NOTE` (Plain (42:8..42:12)) +`:` (Plain (42:12..42:13)) +`Due` (Plain (42:14..42:17)) +`to` (Plain (42:18..42:20)) +`the` (Plain (42:21..42:24)) +`non` (Plain (42:25..42:28)) +`-` (Plain (42:28..42:29)) +`uniform` (Plain (42:29..42:36)) +`control` (Plain (42:37..42:44)) +`flow` (Plain (42:45..42:49)) +`above` (Plain (42:50..42:55)) +`,` (Plain (42:55..42:56)) +`we` (Plain (42:57..42:59)) +`must` (Plain (42:60..42:64)) +`use` (Plain (42:65..42:68)) +`the` (Plain (42:69..42:72)) +`Level` (Plain (42:73..42:78)) +`variant` (Plain (42:79..42:86)) +`of` (Plain (42:87..42:89)) +`//` (CommentStart (43:5..43:7)) +`textureSampleCompare` (Plain (43:8..43:28)) +`to` (Plain (43:29..43:31)) +`avoid` (Plain (43:32..43:37)) +`undefined` (Plain (43:38..43:47)) +`behavior` (Plain (43:48..43:56)) +`due` (Plain (43:57..43:60)) +`to` (Plain (43:61..43:63)) +`some` (Plain (43:64..43:68)) +`of` (Plain (43:69..43:71)) +`the` (Plain (43:72..43:75)) +`fragments` (Plain (43:76..43:85)) +`in` (Plain (43:86..43:88)) +`//` (CommentStart (44:5..44:7)) +`a` (Plain (44:8..44:9)) +`quad` (Plain (44:10..44:14)) +`(` (Plain (44:15..44:16)) +`2` (Plain (44:16..44:17)) +`x2` (Plain (44:17..44:19)) +`fragments` (Plain (44:20..44:29)) +`)` (Plain (44:29..44:30)) +`being` (Plain (44:31..44:36)) +`processed` (Plain (44:37..44:46)) +`not` (Plain (44:47..44:50)) +`being` (Plain (44:51..44:56)) +`sampled` (Plain (44:57..44:64)) +`,` (Plain (44:64..44:65)) +`and` (Plain (44:66..44:69)) +`this` (Plain (44:70..44:74)) +`messing` (Plain (44:75..44:82)) +`with` (Plain (44:83..44:87)) +`//` (CommentStart (45:5..45:7)) +`mip` (Plain (45:8..45:11)) +`-` (Plain (45:11..45:12)) +`mapping` (Plain (45:12..45:19)) +`functionality` (Plain (45:20..45:33)) +`.` (Plain (45:33..45:34)) +`The` (Plain (45:35..45:38)) +`shadow` (Plain (45:39..45:45)) +`maps` (Plain (45:46..45:50)) +`have` (Plain (45:51..45:55)) +`no` (Plain (45:56..45:58)) +`mipmaps` (Plain (45:59..45:66)) +`so` (Plain (45:67..45:69)) +`Level` (Plain (45:70..45:75)) +`just` (Plain (45:76..45:80)) +`samples` (Plain (45:81..45:88)) +`//` (CommentStart (46:5..46:7)) +`from` (Plain (46:8..46:12)) +`LOD` (Plain (46:13..46:16)) +`0.` (Plain (46:17..46:19)) +`return` (Keyword (48:5..48:11)) +`textureSampleCompare` (Function (48:12..48:32)) +`(` (Brace (48:32..48:33)) +`view_bindings` (Module (48:33..48:46)) +`::` (Punct (48:46..48:48)) +`point_shadow_textures` (Ident (48:48..48:69)) +`,` (Punct (48:69..48:70)) +`view_bindings` (Module (48:71..48:84)) +`::` (Punct (48:84..48:86)) +`point_shadow_textures_sampler` (Ident (48:86..48:115)) +`,` (Punct (48:115..48:116)) +`frag_ls` (Ident (48:117..48:124)) +`*` (Operator (48:125..48:126)) +`flip_z` (Ident (48:127..48:133)) +`,` (Punct (48:133..48:134)) +`depth` (Ident (48:135..48:140)) +`)` (Brace (48:140..48:141)) +`;` (Punct (48:141..48:142)) +`return` (Keyword (50:5..50:11)) +`textureSampleCompareLevel` (Function (50:12..50:37)) +`(` (Brace (50:37..50:38)) +`view_bindings` (Module (50:38..50:51)) +`::` (Punct (50:51..50:53)) +`point_shadow_textures` (Ident (50:53..50:74)) +`,` (Punct (50:74..50:75)) +`view_bindings` (Module (50:76..50:89)) +`::` (Punct (50:89..50:91)) +`point_shadow_textures_sampler` (Ident (50:91..50:120)) +`,` (Punct (50:120..50:121)) +`frag_ls` (Ident (50:122..50:129)) +`*` (Operator (50:130..50:131)) +`flip_z` (Ident (50:132..50:138)) +`,` (Punct (50:138..50:139)) +`i32` (Type (50:140..50:143)) +`(` (Brace (50:143..50:144)) +`light_id` (Ident (50:144..50:152)) +`)` (Brace (50:152..50:153)) +`,` (Punct (50:153..50:154)) +`depth` (Ident (50:155..50:160)) +`)` (Brace (50:160..50:161)) +`;` (Punct (50:161..50:162)) +`}` (Brace (52:1..52:2)) +`fn` (Keyword (54:1..54:3)) +`fetch_spot_shadow` (Function (54:4..54:21)) +`(` (Brace (54:21..54:22)) +`light_id` (Ident (54:22..54:30)) +`:` (Punct (54:30..54:31)) +`u32` (Type (54:32..54:35)) +`,` (Punct (54:35..54:36)) +`frag_position` (Ident (54:37..54:50)) +`:` (Punct (54:50..54:51)) +`vec4` (Type (54:52..54:56)) +`<` (Operator (54:56..54:57)) +`f32` (Type (54:57..54:60)) +`>` (Operator (54:60..54:61)) +`,` (Punct (54:61..54:62)) +`surface_normal` (Ident (54:63..54:77)) +`:` (Punct (54:77..54:78)) +`vec3` (Type (54:79..54:83)) +`<` (Operator (54:83..54:84)) +`f32` (Type (54:84..54:87)) +`>` (Operator (54:87..54:88)) +`)` (Brace (54:88..54:89)) +`->` (Operator (54:90..54:92)) +`f32` (Type (54:93..54:96)) +`{` (Brace (54:97..54:98)) +`let` (Keyword (55:5..55:8)) +`light` (Ident (55:9..55:14)) +`=` (Operator (55:15..55:16)) +`&` (Operator (55:17..55:18)) +`view_bindings` (Module (55:18..55:31)) +`::` (Punct (55:31..55:33)) +`point_lights` (Ident (55:33..55:45)) +`.` (Punct (55:45..55:46)) +`data` (Field (55:46..55:50)) +`[` (Brace (55:50..55:51)) +`light_id` (Ident (55:51..55:59)) +`]` (Brace (55:59..55:60)) +`;` (Punct (55:60..55:61)) +`let` (Keyword (57:5..57:8)) +`surface_to_light` (Ident (57:9..57:25)) +`=` (Operator (57:26..57:27)) +`(` (Brace (57:28..57:29)) +`*` (Operator (57:29..57:30)) +`light` (Ident (57:30..57:35)) +`)` (Brace (57:35..57:36)) +`.` (Punct (57:36..57:37)) +`position_radius` (Field (57:37..57:52)) +`.` (Punct (57:52..57:53)) +`xyz` (Field (57:53..57:56)) +`-` (Operator (57:57..57:58)) +`frag_position` (Ident (57:59..57:72)) +`.` (Punct (57:72..57:73)) +`xyz` (Field (57:73..57:76)) +`;` (Punct (57:76..57:77)) +`//` (CommentStart (59:5..59:7)) +`construct` (Plain (59:8..59:17)) +`the` (Plain (59:18..59:21)) +`light` (Plain (59:22..59:27)) +`view` (Plain (59:28..59:32)) +`matrix` (Plain (59:33..59:39)) +`var` (Keyword (60:5..60:8)) +`spot_dir` (Ident (60:9..60:17)) +`=` (Operator (60:18..60:19)) +`vec3` (Type (60:20..60:24)) +`<` (Operator (60:24..60:25)) +`f32` (Type (60:25..60:28)) +`>` (Operator (60:28..60:29)) +`(` (Brace (60:29..60:30)) +`(` (Brace (60:30..60:31)) +`*` (Operator (60:31..60:32)) +`light` (Ident (60:32..60:37)) +`)` (Brace (60:37..60:38)) +`.` (Punct (60:38..60:39)) +`light_custom_data` (Field (60:39..60:56)) +`.` (Punct (60:56..60:57)) +`x` (Field (60:57..60:58)) +`,` (Punct (60:58..60:59)) +`0.0` (FloatLiteral (60:60..60:63)) +`,` (Punct (60:63..60:64)) +`(` (Brace (60:65..60:66)) +`*` (Operator (60:66..60:67)) +`light` (Ident (60:67..60:72)) +`)` (Brace (60:72..60:73)) +`.` (Punct (60:73..60:74)) +`light_custom_data` (Field (60:74..60:91)) +`.` (Punct (60:91..60:92)) +`y` (Field (60:92..60:93)) +`)` (Brace (60:93..60:94)) +`;` (Punct (60:94..60:95)) +`//` (CommentStart (61:5..61:7)) +`reconstruct` (Plain (61:8..61:19)) +`spot` (Plain (61:20..61:24)) +`dir` (Plain (61:25..61:28)) +`from` (Plain (61:29..61:33)) +`x` (Plain (61:34..61:35)) +`/` (Plain (61:35..61:36)) +`z` (Plain (61:36..61:37)) +`and` (Plain (61:38..61:41)) +`y` (Plain (61:42..61:43)) +`-` (Plain (61:43..61:44)) +`direction` (Plain (61:44..61:53)) +`flag` (Plain (61:54..61:58)) +`spot_dir` (Ident (62:5..62:13)) +`.` (Punct (62:13..62:14)) +`y` (Field (62:14..62:15)) +`=` (Operator (62:16..62:17)) +`sqrt` (Function (62:18..62:22)) +`(` (Brace (62:22..62:23)) +`max` (Function (62:23..62:26)) +`(` (Brace (62:26..62:27)) +`0.0` (FloatLiteral (62:27..62:30)) +`,` (Punct (62:30..62:31)) +`1.0` (FloatLiteral (62:32..62:35)) +`-` (Operator (62:36..62:37)) +`spot_dir` (Ident (62:38..62:46)) +`.` (Punct (62:46..62:47)) +`x` (Field (62:47..62:48)) +`*` (Operator (62:49..62:50)) +`spot_dir` (Ident (62:51..62:59)) +`.` (Punct (62:59..62:60)) +`x` (Field (62:60..62:61)) +`-` (Operator (62:62..62:63)) +`spot_dir` (Ident (62:64..62:72)) +`.` (Punct (62:72..62:73)) +`z` (Field (62:73..62:74)) +`*` (Operator (62:75..62:76)) +`spot_dir` (Ident (62:77..62:85)) +`.` (Punct (62:85..62:86)) +`z` (Field (62:86..62:87)) +`)` (Brace (62:87..62:88)) +`)` (Brace (62:88..62:89)) +`;` (Punct (62:89..62:90)) +`if` (Keyword (63:5..63:7)) +`(` (Brace (63:8..63:9)) +`(` (Brace (63:9..63:10)) +`(` (Brace (63:10..63:11)) +`*` (Operator (63:11..63:12)) +`light` (Ident (63:12..63:17)) +`)` (Brace (63:17..63:18)) +`.` (Punct (63:18..63:19)) +`flags` (Field (63:19..63:24)) +`&` (Operator (63:25..63:26)) +`POINT_LIGHT_FLAGS_SPOT_LIGHT_Y_NEGATIVE` (Ident (63:27..63:66)) +`)` (Brace (63:66..63:67)) +`!=` (Operator (63:68..63:70)) +`0u` (IntLiteral (63:71..63:73)) +`)` (Brace (63:73..63:74)) +`{` (Brace (63:75..63:76)) +`spot_dir` (Ident (64:9..64:17)) +`.` (Punct (64:17..64:18)) +`y` (Field (64:18..64:19)) +`=` (Operator (64:20..64:21)) +`-` (Operator (64:22..64:23)) +`spot_dir` (Ident (64:23..64:31)) +`.` (Punct (64:31..64:32)) +`y` (Field (64:32..64:33)) +`;` (Punct (64:33..64:34)) +`}` (Brace (65:5..65:6)) +`//` (CommentStart (67:5..67:7)) +`view` (Plain (67:8..67:12)) +`matrix` (Plain (67:13..67:19)) +`z_axis` (Plain (67:20..67:26)) +`is` (Plain (67:27..67:29)) +`the` (Plain (67:30..67:33)) +`reverse` (Plain (67:34..67:41)) +`of` (Plain (67:42..67:44)) +`transform` (Plain (67:45..67:54)) +`.` (Plain (67:54..67:55)) +`forward` (Plain (67:55..67:62)) +`(` (Plain (67:62..67:63)) +`)` (Plain (67:63..67:64)) +`let` (Keyword (68:5..68:8)) +`fwd` (Ident (68:9..68:12)) +`=` (Operator (68:13..68:14)) +`-` (Operator (68:15..68:16)) +`spot_dir` (Ident (68:16..68:24)) +`;` (Punct (68:24..68:25)) +`let` (Keyword (69:5..69:8)) +`distance_to_light` (Ident (69:9..69:26)) +`=` (Operator (69:27..69:28)) +`dot` (Function (69:29..69:32)) +`(` (Brace (69:32..69:33)) +`fwd` (Ident (69:33..69:36)) +`,` (Punct (69:36..69:37)) +`surface_to_light` (Ident (69:38..69:54)) +`)` (Brace (69:54..69:55)) +`;` (Punct (69:55..69:56)) +`let` (Keyword (70:5..70:8)) +`offset_position` (Ident (70:9..70:24)) +`=` (Operator (70:25..70:26)) +`-` (Operator (71:9..71:10)) +`surface_to_light` (Ident (71:10..71:26)) +`+` (Operator (72:9..72:10)) +`(` (Brace (72:11..72:12)) +`(` (Brace (72:12..72:13)) +`*` (Operator (72:13..72:14)) +`light` (Ident (72:14..72:19)) +`)` (Brace (72:19..72:20)) +`.` (Punct (72:20..72:21)) +`shadow_depth_bias` (Field (72:21..72:38)) +`*` (Operator (72:39..72:40)) +`normalize` (Function (72:41..72:50)) +`(` (Brace (72:50..72:51)) +`surface_to_light` (Ident (72:51..72:67)) +`)` (Brace (72:67..72:68)) +`)` (Brace (72:68..72:69)) +`+` (Operator (73:9..73:10)) +`(` (Brace (73:11..73:12)) +`surface_normal` (Ident (73:12..73:26)) +`.` (Punct (73:26..73:27)) +`xyz` (Field (73:27..73:30)) +`*` (Operator (73:31..73:32)) +`(` (Brace (73:33..73:34)) +`*` (Operator (73:34..73:35)) +`light` (Ident (73:35..73:40)) +`)` (Brace (73:40..73:41)) +`.` (Punct (73:41..73:42)) +`shadow_normal_bias` (Field (73:42..73:60)) +`)` (Brace (73:60..73:61)) +`*` (Operator (73:62..73:63)) +`distance_to_light` (Ident (73:64..73:81)) +`;` (Punct (73:81..73:82)) +`//` (CommentStart (75:5..75:7)) +`the` (Plain (75:8..75:11)) +`construction` (Plain (75:12..75:24)) +`of` (Plain (75:25..75:27)) +`the` (Plain (75:28..75:31)) +`up` (Plain (75:32..75:34)) +`and` (Plain (75:35..75:38)) +`right` (Plain (75:39..75:44)) +`vectors` (Plain (75:45..75:52)) +`needs` (Plain (75:53..75:58)) +`to` (Plain (75:59..75:61)) +`precisely` (Plain (75:62..75:71)) +`mirror` (Plain (75:72..75:78)) +`the` (Plain (75:79..75:82)) +`code` (Plain (75:83..75:87)) +`//` (CommentStart (76:5..76:7)) +`in` (Plain (76:8..76:10)) +`render` (Plain (76:11..76:17)) +`/` (Plain (76:17..76:18)) +`light` (Plain (76:18..76:23)) +`.` (Plain (76:23..76:24)) +`rs` (Plain (76:24..76:26)) +`:` (Plain (76:26..76:27)) +`spot_light_view_matrix` (Plain (76:27..76:49)) +`var` (Keyword (77:5..77:8)) +`sign` (Ident (77:9..77:13)) +`=` (Operator (77:14..77:15)) +`-1.0` (FloatLiteral (77:16..77:20)) +`;` (Punct (77:20..77:21)) +`if` (Keyword (78:5..78:7)) +`(` (Brace (78:8..78:9)) +`fwd` (Ident (78:9..78:12)) +`.` (Punct (78:12..78:13)) +`z` (Field (78:13..78:14)) +`>=` (Operator (78:15..78:17)) +`0.0` (FloatLiteral (78:18..78:21)) +`)` (Brace (78:21..78:22)) +`{` (Brace (78:23..78:24)) +`sign` (Ident (79:9..79:13)) +`=` (Operator (79:14..79:15)) +`1.0` (FloatLiteral (79:16..79:19)) +`;` (Punct (79:19..79:20)) +`}` (Brace (80:5..80:6)) +`let` (Keyword (81:5..81:8)) +`a` (Ident (81:9..81:10)) +`=` (Operator (81:11..81:12)) +`-1.0` (FloatLiteral (81:13..81:17)) +`/` (Operator (81:18..81:19)) +`(` (Brace (81:20..81:21)) +`fwd` (Ident (81:21..81:24)) +`.` (Punct (81:24..81:25)) +`z` (Field (81:25..81:26)) +`+` (Operator (81:27..81:28)) +`sign` (Ident (81:29..81:33)) +`)` (Brace (81:33..81:34)) +`;` (Punct (81:34..81:35)) +`let` (Keyword (82:5..82:8)) +`b` (Ident (82:9..82:10)) +`=` (Operator (82:11..82:12)) +`fwd` (Ident (82:13..82:16)) +`.` (Punct (82:16..82:17)) +`x` (Field (82:17..82:18)) +`*` (Operator (82:19..82:20)) +`fwd` (Ident (82:21..82:24)) +`.` (Punct (82:24..82:25)) +`y` (Field (82:25..82:26)) +`*` (Operator (82:27..82:28)) +`a` (Ident (82:29..82:30)) +`;` (Punct (82:30..82:31)) +`let` (Keyword (83:5..83:8)) +`up_dir` (Ident (83:9..83:15)) +`=` (Operator (83:16..83:17)) +`vec3` (Type (83:18..83:22)) +`<` (Operator (83:22..83:23)) +`f32` (Type (83:23..83:26)) +`>` (Operator (83:26..83:27)) +`(` (Brace (83:27..83:28)) +`1.0` (FloatLiteral (83:28..83:31)) +`+` (Operator (83:32..83:33)) +`sign` (Ident (83:34..83:38)) +`*` (Operator (83:39..83:40)) +`fwd` (Ident (83:41..83:44)) +`.` (Punct (83:44..83:45)) +`x` (Field (83:45..83:46)) +`*` (Operator (83:47..83:48)) +`fwd` (Ident (83:49..83:52)) +`.` (Punct (83:52..83:53)) +`x` (Field (83:53..83:54)) +`*` (Operator (83:55..83:56)) +`a` (Ident (83:57..83:58)) +`,` (Punct (83:58..83:59)) +`sign` (Ident (83:60..83:64)) +`*` (Operator (83:65..83:66)) +`b` (Ident (83:67..83:68)) +`,` (Punct (83:68..83:69)) +`-` (Operator (83:70..83:71)) +`sign` (Ident (83:71..83:75)) +`*` (Operator (83:76..83:77)) +`fwd` (Ident (83:78..83:81)) +`.` (Punct (83:81..83:82)) +`x` (Field (83:82..83:83)) +`)` (Brace (83:83..83:84)) +`;` (Punct (83:84..83:85)) +`let` (Keyword (84:5..84:8)) +`right_dir` (Ident (84:9..84:18)) +`=` (Operator (84:19..84:20)) +`vec3` (Type (84:21..84:25)) +`<` (Operator (84:25..84:26)) +`f32` (Type (84:26..84:29)) +`>` (Operator (84:29..84:30)) +`(` (Brace (84:30..84:31)) +`-` (Operator (84:31..84:32)) +`b` (Ident (84:32..84:33)) +`,` (Punct (84:33..84:34)) +`-` (Operator (84:35..84:36)) +`sign` (Ident (84:36..84:40)) +`-` (Operator (84:41..84:42)) +`fwd` (Ident (84:43..84:46)) +`.` (Punct (84:46..84:47)) +`y` (Field (84:47..84:48)) +`*` (Operator (84:49..84:50)) +`fwd` (Ident (84:51..84:54)) +`.` (Punct (84:54..84:55)) +`y` (Field (84:55..84:56)) +`*` (Operator (84:57..84:58)) +`a` (Ident (84:59..84:60)) +`,` (Punct (84:60..84:61)) +`fwd` (Ident (84:62..84:65)) +`.` (Punct (84:65..84:66)) +`y` (Field (84:66..84:67)) +`)` (Brace (84:67..84:68)) +`;` (Punct (84:68..84:69)) +`let` (Keyword (85:5..85:8)) +`light_inv_rot` (Ident (85:9..85:22)) +`=` (Operator (85:23..85:24)) +`mat3x3` (Type (85:25..85:31)) +`<` (Operator (85:31..85:32)) +`f32` (Type (85:32..85:35)) +`>` (Operator (85:35..85:36)) +`(` (Brace (85:36..85:37)) +`right_dir` (Ident (85:37..85:46)) +`,` (Punct (85:46..85:47)) +`up_dir` (Ident (85:48..85:54)) +`,` (Punct (85:54..85:55)) +`fwd` (Ident (85:56..85:59)) +`)` (Brace (85:59..85:60)) +`;` (Punct (85:60..85:61)) +`//` (CommentStart (87:5..87:7)) +`because` (Plain (87:8..87:15)) +`the` (Plain (87:16..87:19)) +`matrix` (Plain (87:20..87:26)) +`is` (Plain (87:27..87:29)) +`a` (Plain (87:30..87:31)) +`pure` (Plain (87:32..87:36)) +`rotation` (Plain (87:37..87:45)) +`matrix` (Plain (87:46..87:52)) +`,` (Plain (87:52..87:53)) +`the` (Plain (87:54..87:57)) +`inverse` (Plain (87:58..87:65)) +`is` (Plain (87:66..87:68)) +`just` (Plain (87:69..87:73)) +`the` (Plain (87:74..87:77)) +`transpose` (Plain (87:78..87:87)) +`,` (Plain (87:87..87:88)) +`and` (Plain (87:89..87:92)) +`to` (Plain (87:93..87:95)) +`calculate` (Plain (87:96..87:105)) +`//` (CommentStart (88:5..88:7)) +`the` (Plain (88:8..88:11)) +`product` (Plain (88:12..88:19)) +`of` (Plain (88:20..88:22)) +`the` (Plain (88:23..88:26)) +`transpose` (Plain (88:27..88:36)) +`with` (Plain (88:37..88:41)) +`a` (Plain (88:42..88:43)) +`vector` (Plain (88:44..88:50)) +`we` (Plain (88:51..88:53)) +`can` (Plain (88:54..88:57)) +`just` (Plain (88:58..88:62)) +`post` (Plain (88:63..88:67)) +`-` (Plain (88:67..88:68)) +`multiply` (Plain (88:68..88:76)) +`instead` (Plain (88:77..88:84)) +`of` (Plain (88:85..88:87)) +`pre` (Plain (88:88..88:91)) +`-` (Plain (88:91..88:92)) +`multiplying` (Plain (88:92..88:103)) +`.` (Plain (88:103..88:104)) +`//` (CommentStart (89:5..89:7)) +`this` (Plain (89:8..89:12)) +`allows` (Plain (89:13..89:19)) +`us` (Plain (89:20..89:22)) +`to` (Plain (89:23..89:25)) +`keep` (Plain (89:26..89:30)) +`the` (Plain (89:31..89:34)) +`matrix` (Plain (89:35..89:41)) +`construction` (Plain (89:42..89:54)) +`code` (Plain (89:55..89:59)) +`identical` (Plain (89:60..89:69)) +`between` (Plain (89:70..89:77)) +`CPU` (Plain (89:78..89:81)) +`and` (Plain (89:82..89:85)) +`GPU` (Plain (89:86..89:89)) +`.` (Plain (89:89..89:90)) +`let` (Keyword (90:5..90:8)) +`projected_position` (Ident (90:9..90:27)) +`=` (Operator (90:28..90:29)) +`offset_position` (Ident (90:30..90:45)) +`*` (Operator (90:46..90:47)) +`light_inv_rot` (Ident (90:48..90:61)) +`;` (Punct (90:61..90:62)) +`//` (CommentStart (92:5..92:7)) +`divide` (Plain (92:8..92:14)) +`xy` (Plain (92:15..92:17)) +`by` (Plain (92:18..92:20)) +`perspective` (Plain (92:21..92:32)) +`matrix` (Plain (92:33..92:39)) +`"f"` (Plain (92:40..92:43)) +`and` (Plain (92:44..92:47)) +`by` (Plain (92:48..92:50)) +`-` (Plain (92:51..92:52)) +`projected` (Plain (92:52..92:61)) +`.` (Plain (92:61..92:62)) +`z` (Plain (92:62..92:63)) +`(` (Plain (92:64..92:65)) +`projected` (Plain (92:65..92:74)) +`.` (Plain (92:74..92:75)) +`z` (Plain (92:75..92:76)) +`is` (Plain (92:77..92:79)) +`-` (Plain (92:80..92:81)) +`projection` (Plain (92:81..92:91)) +`matrix` (Plain (92:92..92:98)) +`'s` (Plain (92:98..92:100)) +`w` (Plain (92:101..92:102)) +`)` (Plain (92:102..92:103)) +`//` (CommentStart (93:5..93:7)) +`to` (Plain (93:8..93:10)) +`get` (Plain (93:11..93:14)) +`ndc` (Plain (93:15..93:18)) +`coordinates` (Plain (93:19..93:30)) +`let` (Keyword (94:5..94:8)) +`f_div_minus_z` (Ident (94:9..94:22)) +`=` (Operator (94:23..94:24)) +`1.0` (FloatLiteral (94:25..94:28)) +`/` (Operator (94:29..94:30)) +`(` (Brace (94:31..94:32)) +`(` (Brace (94:32..94:33)) +`*` (Operator (94:33..94:34)) +`light` (Ident (94:34..94:39)) +`)` (Brace (94:39..94:40)) +`.` (Punct (94:40..94:41)) +`spot_light_tan_angle` (Field (94:41..94:61)) +`*` (Operator (94:62..94:63)) +`-` (Operator (94:64..94:65)) +`projected_position` (Ident (94:65..94:83)) +`.` (Punct (94:83..94:84)) +`z` (Field (94:84..94:85)) +`)` (Brace (94:85..94:86)) +`;` (Punct (94:86..94:87)) +`let` (Keyword (95:5..95:8)) +`shadow_xy_ndc` (Ident (95:9..95:22)) +`=` (Operator (95:23..95:24)) +`projected_position` (Ident (95:25..95:43)) +`.` (Punct (95:43..95:44)) +`xy` (Field (95:44..95:46)) +`*` (Operator (95:47..95:48)) +`f_div_minus_z` (Ident (95:49..95:62)) +`;` (Punct (95:62..95:63)) +`//` (CommentStart (96:5..96:7)) +`convert` (Plain (96:8..96:15)) +`to` (Plain (96:16..96:18)) +`uv` (Plain (96:19..96:21)) +`coordinates` (Plain (96:22..96:33)) +`let` (Keyword (97:5..97:8)) +`shadow_uv` (Ident (97:9..97:18)) +`=` (Operator (97:19..97:20)) +`shadow_xy_ndc` (Ident (97:21..97:34)) +`*` (Operator (97:35..97:36)) +`vec2` (Type (97:37..97:41)) +`<` (Operator (97:41..97:42)) +`f32` (Type (97:42..97:45)) +`>` (Operator (97:45..97:46)) +`(` (Brace (97:46..97:47)) +`0.5` (FloatLiteral (97:47..97:50)) +`,` (Punct (97:50..97:51)) +`-0.5` (FloatLiteral (97:52..97:56)) +`)` (Brace (97:56..97:57)) +`+` (Operator (97:58..97:59)) +`vec2` (Type (97:60..97:64)) +`<` (Operator (97:64..97:65)) +`f32` (Type (97:65..97:68)) +`>` (Operator (97:68..97:69)) +`(` (Brace (97:69..97:70)) +`0.5` (FloatLiteral (97:70..97:73)) +`,` (Punct (97:73..97:74)) +`0.5` (FloatLiteral (97:75..97:78)) +`)` (Brace (97:78..97:79)) +`;` (Punct (97:79..97:80)) +`//` (CommentStart (99:5..99:7)) +`0.1` (Plain (99:8..99:11)) +`must` (Plain (99:12..99:16)) +`match` (Plain (99:17..99:22)) +`POINT_LIGHT_NEAR_Z` (Plain (99:23..99:41)) +`let` (Keyword (100:5..100:8)) +`depth` (Ident (100:9..100:14)) +`=` (Operator (100:15..100:16)) +`0.1` (FloatLiteral (100:17..100:20)) +`/` (Operator (100:21..100:22)) +`-` (Operator (100:23..100:24)) +`projected_position` (Ident (100:24..100:42)) +`.` (Punct (100:42..100:43)) +`z` (Field (100:43..100:44)) +`;` (Punct (100:44..100:45)) +`//` (CommentStart (102:6..102:8)) +`Number` (Plain (102:9..102:15)) +`determined` (Plain (102:16..102:26)) +`by` (Plain (102:27..102:29)) +`trial` (Plain (102:30..102:35)) +`and` (Plain (102:36..102:39)) +`error` (Plain (102:40..102:45)) +`that` (Plain (102:46..102:50)) +`gave` (Plain (102:51..102:55)) +`nice` (Plain (102:56..102:60)) +`results` (Plain (102:61..102:68)) +`.` (Plain (102:68..102:69)) +`let` (Keyword (103:6..103:9)) +`texel_size` (Ident (103:10..103:20)) +`=` (Operator (103:21..103:22)) +`0.0134277345` (FloatLiteral (103:23..103:35)) +`;` (Punct (103:35..103:36)) +`return` (Keyword (104:5..104:11)) +`sample_shadow_map` (Function (104:12..104:29)) +`(` (Brace (104:29..104:30)) +`shadow_uv` (Ident (104:30..104:39)) +`,` (Punct (104:39..104:40)) +`depth` (Ident (104:41..104:46)) +`,` (Punct (104:46..104:47)) +`i32` (Type (104:48..104:51)) +`(` (Brace (104:51..104:52)) +`light_id` (Ident (104:52..104:60)) +`)` (Brace (104:60..104:61)) +`+` (Operator (104:62..104:63)) +`view_bindings` (Module (104:64..104:77)) +`::` (Punct (104:77..104:79)) +`lights` (Ident (104:79..104:85)) +`.` (Punct (104:85..104:86)) +`spot_light_shadowmap_offset` (Field (104:86..104:113)) +`,` (Punct (104:113..104:114)) +`texel_size` (Ident (104:115..104:125)) +`)` (Brace (104:125..104:126)) +`;` (Punct (104:126..104:127)) +`}` (Brace (105:1..105:2)) +`fn` (Keyword (107:1..107:3)) +`get_cascade_index` (Function (107:4..107:21)) +`(` (Brace (107:21..107:22)) +`light_id` (Ident (107:22..107:30)) +`:` (Punct (107:30..107:31)) +`u32` (Type (107:32..107:35)) +`,` (Punct (107:35..107:36)) +`view_z` (Ident (107:37..107:43)) +`:` (Punct (107:43..107:44)) +`f32` (Type (107:45..107:48)) +`)` (Brace (107:48..107:49)) +`->` (Operator (107:50..107:52)) +`u32` (Type (107:53..107:56)) +`{` (Brace (107:57..107:58)) +`let` (Keyword (108:5..108:8)) +`light` (Ident (108:9..108:14)) +`=` (Operator (108:15..108:16)) +`&` (Operator (108:17..108:18)) +`view_bindings` (Module (108:18..108:31)) +`::` (Punct (108:31..108:33)) +`lights` (Ident (108:33..108:39)) +`.` (Punct (108:39..108:40)) +`directional_lights` (Field (108:40..108:58)) +`[` (Brace (108:58..108:59)) +`light_id` (Ident (108:59..108:67)) +`]` (Brace (108:67..108:68)) +`;` (Punct (108:68..108:69)) +`for` (Keyword (110:5..110:8)) +`(` (Brace (110:9..110:10)) +`var` (Keyword (110:10..110:13)) +`i` (Ident (110:14..110:15)) +`:` (Punct (110:15..110:16)) +`u32` (Type (110:17..110:20)) +`=` (Operator (110:21..110:22)) +`0u` (IntLiteral (110:23..110:25)) +`;` (Punct (110:25..110:26)) +`i` (Ident (110:27..110:28)) +`<` (Operator (110:29..110:30)) +`(` (Brace (110:31..110:32)) +`*` (Operator (110:32..110:33)) +`light` (Ident (110:33..110:38)) +`)` (Brace (110:38..110:39)) +`.` (Punct (110:39..110:40)) +`num_cascades` (Field (110:40..110:52)) +`;` (Punct (110:52..110:53)) +`i` (Ident (110:54..110:55)) +`=` (Operator (110:56..110:57)) +`i` (Ident (110:58..110:59)) +`+` (Operator (110:60..110:61)) +`1u` (IntLiteral (110:62..110:64)) +`)` (Brace (110:64..110:65)) +`{` (Brace (110:66..110:67)) +`if` (Keyword (111:9..111:11)) +`(` (Brace (111:12..111:13)) +`-` (Operator (111:13..111:14)) +`view_z` (Ident (111:14..111:20)) +`<` (Operator (111:21..111:22)) +`(` (Brace (111:23..111:24)) +`*` (Operator (111:24..111:25)) +`light` (Ident (111:25..111:30)) +`)` (Brace (111:30..111:31)) +`.` (Punct (111:31..111:32)) +`cascades` (Field (111:32..111:40)) +`[` (Brace (111:40..111:41)) +`i` (Ident (111:41..111:42)) +`]` (Brace (111:42..111:43)) +`.` (Punct (111:43..111:44)) +`far_bound` (Field (111:44..111:53)) +`)` (Brace (111:53..111:54)) +`{` (Brace (111:55..111:56)) +`return` (Keyword (112:13..112:19)) +`i` (Ident (112:20..112:21)) +`;` (Punct (112:21..112:22)) +`}` (Brace (113:9..113:10)) +`}` (Brace (114:5..114:6)) +`return` (Keyword (115:5..115:11)) +`(` (Brace (115:12..115:13)) +`*` (Operator (115:13..115:14)) +`light` (Ident (115:14..115:19)) +`)` (Brace (115:19..115:20)) +`.` (Punct (115:20..115:21)) +`num_cascades` (Field (115:21..115:33)) +`;` (Punct (115:33..115:34)) +`}` (Brace (116:1..116:2)) +`fn` (Keyword (118:1..118:3)) +`sample_directional_cascade` (Function (118:4..118:30)) +`(` (Brace (118:30..118:31)) +`light_id` (Ident (118:31..118:39)) +`:` (Punct (118:39..118:40)) +`u32` (Type (118:41..118:44)) +`,` (Punct (118:44..118:45)) +`cascade_index` (Ident (118:46..118:59)) +`:` (Punct (118:59..118:60)) +`u32` (Type (118:61..118:64)) +`,` (Punct (118:64..118:65)) +`frag_position` (Ident (118:66..118:79)) +`:` (Punct (118:79..118:80)) +`vec4` (Type (118:81..118:85)) +`<` (Operator (118:85..118:86)) +`f32` (Type (118:86..118:89)) +`>` (Operator (118:89..118:90)) +`,` (Punct (118:90..118:91)) +`surface_normal` (Ident (118:92..118:106)) +`:` (Punct (118:106..118:107)) +`vec3` (Type (118:108..118:112)) +`<` (Operator (118:112..118:113)) +`f32` (Type (118:113..118:116)) +`>` (Operator (118:116..118:117)) +`)` (Brace (118:117..118:118)) +`->` (Operator (118:119..118:121)) +`f32` (Type (118:122..118:125)) +`{` (Brace (118:126..118:127)) +`let` (Keyword (119:5..119:8)) +`light` (Ident (119:9..119:14)) +`=` (Operator (119:15..119:16)) +`&` (Operator (119:17..119:18)) +`view_bindings` (Module (119:18..119:31)) +`::` (Punct (119:31..119:33)) +`lights` (Ident (119:33..119:39)) +`.` (Punct (119:39..119:40)) +`directional_lights` (Field (119:40..119:58)) +`[` (Brace (119:58..119:59)) +`light_id` (Ident (119:59..119:67)) +`]` (Brace (119:67..119:68)) +`;` (Punct (119:68..119:69)) +`let` (Keyword (120:5..120:8)) +`cascade` (Ident (120:9..120:16)) +`=` (Operator (120:17..120:18)) +`&` (Operator (120:19..120:20)) +`(` (Brace (120:20..120:21)) +`*` (Operator (120:21..120:22)) +`light` (Ident (120:22..120:27)) +`)` (Brace (120:27..120:28)) +`.` (Punct (120:28..120:29)) +`cascades` (Field (120:29..120:37)) +`[` (Brace (120:37..120:38)) +`cascade_index` (Ident (120:38..120:51)) +`]` (Brace (120:51..120:52)) +`;` (Punct (120:52..120:53)) +`//` (CommentStart (122:5..122:7)) +`The` (Plain (122:8..122:11)) +`normal` (Plain (122:12..122:18)) +`bias` (Plain (122:19..122:23)) +`is` (Plain (122:24..122:26)) +`scaled` (Plain (122:27..122:33)) +`to` (Plain (122:34..122:36)) +`the` (Plain (122:37..122:40)) +`texel` (Plain (122:41..122:46)) +`size` (Plain (122:47..122:51)) +`.` (Plain (122:51..122:52)) +`let` (Keyword (123:5..123:8)) +`normal_offset` (Ident (123:9..123:22)) +`=` (Operator (123:23..123:24)) +`(` (Brace (123:25..123:26)) +`*` (Operator (123:26..123:27)) +`light` (Ident (123:27..123:32)) +`)` (Brace (123:32..123:33)) +`.` (Punct (123:33..123:34)) +`shadow_normal_bias` (Field (123:34..123:52)) +`*` (Operator (123:53..123:54)) +`(` (Brace (123:55..123:56)) +`*` (Operator (123:56..123:57)) +`cascade` (Ident (123:57..123:64)) +`)` (Brace (123:64..123:65)) +`.` (Punct (123:65..123:66)) +`texel_size` (Field (123:66..123:76)) +`*` (Operator (123:77..123:78)) +`surface_normal` (Ident (123:79..123:93)) +`.` (Punct (123:93..123:94)) +`xyz` (Field (123:94..123:97)) +`;` (Punct (123:97..123:98)) +`let` (Keyword (124:5..124:8)) +`depth_offset` (Ident (124:9..124:21)) +`=` (Operator (124:22..124:23)) +`(` (Brace (124:24..124:25)) +`*` (Operator (124:25..124:26)) +`light` (Ident (124:26..124:31)) +`)` (Brace (124:31..124:32)) +`.` (Punct (124:32..124:33)) +`shadow_depth_bias` (Field (124:33..124:50)) +`*` (Operator (124:51..124:52)) +`(` (Brace (124:53..124:54)) +`*` (Operator (124:54..124:55)) +`light` (Ident (124:55..124:60)) +`)` (Brace (124:60..124:61)) +`.` (Punct (124:61..124:62)) +`direction_to_light` (Field (124:62..124:80)) +`.` (Punct (124:80..124:81)) +`xyz` (Field (124:81..124:84)) +`;` (Punct (124:84..124:85)) +`let` (Keyword (125:5..125:8)) +`offset_position` (Ident (125:9..125:24)) +`=` (Operator (125:25..125:26)) +`vec4` (Type (125:27..125:31)) +`<` (Operator (125:31..125:32)) +`f32` (Type (125:32..125:35)) +`>` (Operator (125:35..125:36)) +`(` (Brace (125:36..125:37)) +`frag_position` (Ident (125:37..125:50)) +`.` (Punct (125:50..125:51)) +`xyz` (Field (125:51..125:54)) +`+` (Operator (125:55..125:56)) +`normal_offset` (Ident (125:57..125:70)) +`+` (Operator (125:71..125:72)) +`depth_offset` (Ident (125:73..125:85)) +`,` (Punct (125:85..125:86)) +`frag_position` (Ident (125:87..125:100)) +`.` (Punct (125:100..125:101)) +`w` (Field (125:101..125:102)) +`)` (Brace (125:102..125:103)) +`;` (Punct (125:103..125:104)) +`let` (Keyword (127:5..127:8)) +`offset_position_clip` (Ident (127:9..127:29)) +`=` (Operator (127:30..127:31)) +`(` (Brace (127:32..127:33)) +`*` (Operator (127:33..127:34)) +`cascade` (Ident (127:34..127:41)) +`)` (Brace (127:41..127:42)) +`.` (Punct (127:42..127:43)) +`view_projection` (Field (127:43..127:58)) +`*` (Operator (127:59..127:60)) +`offset_position` (Ident (127:61..127:76)) +`;` (Punct (127:76..127:77)) +`if` (Keyword (128:5..128:7)) +`(` (Brace (128:8..128:9)) +`offset_position_clip` (Ident (128:9..128:29)) +`.` (Punct (128:29..128:30)) +`w` (Field (128:30..128:31)) +`<=` (Operator (128:32..128:34)) +`0.0` (FloatLiteral (128:35..128:38)) +`)` (Brace (128:38..128:39)) +`{` (Brace (128:40..128:41)) +`return` (Keyword (129:9..129:15)) +`1.0` (FloatLiteral (129:16..129:19)) +`;` (Punct (129:19..129:20)) +`}` (Brace (130:5..130:6)) +`let` (Keyword (131:5..131:8)) +`offset_position_ndc` (Ident (131:9..131:28)) +`=` (Operator (131:29..131:30)) +`offset_position_clip` (Ident (131:31..131:51)) +`.` (Punct (131:51..131:52)) +`xyz` (Field (131:52..131:55)) +`/` (Operator (131:56..131:57)) +`offset_position_clip` (Ident (131:58..131:78)) +`.` (Punct (131:78..131:79)) +`w` (Field (131:79..131:80)) +`;` (Punct (131:80..131:81)) +`//` (CommentStart (132:5..132:7)) +`No` (Plain (132:8..132:10)) +`shadow` (Plain (132:11..132:17)) +`outside` (Plain (132:18..132:25)) +`the` (Plain (132:26..132:29)) +`orthographic` (Plain (132:30..132:42)) +`projection` (Plain (132:43..132:53)) +`volume` (Plain (132:54..132:60)) +`if` (Keyword (133:5..133:7)) +`(` (Brace (133:8..133:9)) +`any` (Function (133:9..133:12)) +`(` (Brace (133:12..133:13)) +`offset_position_ndc` (Ident (133:13..133:32)) +`.` (Punct (133:32..133:33)) +`xy` (Field (133:33..133:35)) +`<` (Operator (133:36..133:37)) +`vec2` (Type (133:38..133:42)) +`<` (Operator (133:42..133:43)) +`f32` (Type (133:43..133:46)) +`>` (Operator (133:46..133:47)) +`(` (Brace (133:47..133:48)) +`-1.0` (FloatLiteral (133:48..133:52)) +`)` (Brace (133:52..133:53)) +`)` (Brace (133:53..133:54)) +`||` (Operator (133:55..133:57)) +`offset_position_ndc` (Ident (133:58..133:77)) +`.` (Punct (133:77..133:78)) +`z` (Field (133:78..133:79)) +`<` (Operator (133:80..133:81)) +`0.0` (FloatLiteral (133:82..133:85)) +`||` (Operator (134:13..134:15)) +`any` (Function (134:16..134:19)) +`(` (Brace (134:19..134:20)) +`offset_position_ndc` (Ident (134:20..134:39)) +`>` (Operator (134:40..134:41)) +`vec3` (Type (134:42..134:46)) +`<` (Operator (134:46..134:47)) +`f32` (Type (134:47..134:50)) +`>` (Operator (134:50..134:51)) +`(` (Brace (134:51..134:52)) +`1.0` (FloatLiteral (134:52..134:55)) +`)` (Brace (134:55..134:56)) +`)` (Brace (134:56..134:57)) +`)` (Brace (134:57..134:58)) +`{` (Brace (134:59..134:60)) +`return` (Keyword (135:9..135:15)) +`1.0` (FloatLiteral (135:16..135:19)) +`;` (Punct (135:19..135:20)) +`}` (Brace (136:5..136:6)) +`//` (CommentStart (138:5..138:7)) +`compute` (Plain (138:8..138:15)) +`texture` (Plain (138:16..138:23)) +`coordinates` (Plain (138:24..138:35)) +`for` (Plain (138:36..138:39)) +`shadow` (Plain (138:40..138:46)) +`lookup` (Plain (138:47..138:53)) +`,` (Plain (138:53..138:54)) +`compensating` (Plain (138:55..138:67)) +`for` (Plain (138:68..138:71)) +`the` (Plain (138:72..138:75)) +`Y` (Plain (138:76..138:77)) +`-` (Plain (138:77..138:78)) +`flip` (Plain (138:78..138:82)) +`difference` (Plain (138:83..138:93)) +`//` (CommentStart (139:5..139:7)) +`between` (Plain (139:8..139:15)) +`the` (Plain (139:16..139:19)) +`NDC` (Plain (139:20..139:23)) +`and` (Plain (139:24..139:27)) +`texture` (Plain (139:28..139:35)) +`coordinates` (Plain (139:36..139:47)) +`let` (Keyword (140:5..140:8)) +`flip_correction` (Ident (140:9..140:24)) +`=` (Operator (140:25..140:26)) +`vec2` (Type (140:27..140:31)) +`<` (Operator (140:31..140:32)) +`f32` (Type (140:32..140:35)) +`>` (Operator (140:35..140:36)) +`(` (Brace (140:36..140:37)) +`0.5` (FloatLiteral (140:37..140:40)) +`,` (Punct (140:40..140:41)) +`-0.5` (FloatLiteral (140:42..140:46)) +`)` (Brace (140:46..140:47)) +`;` (Punct (140:47..140:48)) +`let` (Keyword (141:5..141:8)) +`light_local` (Ident (141:9..141:20)) +`=` (Operator (141:21..141:22)) +`offset_position_ndc` (Ident (141:23..141:42)) +`.` (Punct (141:42..141:43)) +`xy` (Field (141:43..141:45)) +`*` (Operator (141:46..141:47)) +`flip_correction` (Ident (141:48..141:63)) +`+` (Operator (141:64..141:65)) +`vec2` (Type (141:66..141:70)) +`<` (Operator (141:70..141:71)) +`f32` (Type (141:71..141:74)) +`>` (Operator (141:74..141:75)) +`(` (Brace (141:75..141:76)) +`0.5` (FloatLiteral (141:76..141:79)) +`,` (Punct (141:79..141:80)) +`0.5` (FloatLiteral (141:81..141:84)) +`)` (Brace (141:84..141:85)) +`;` (Punct (141:85..141:86)) +`let` (Keyword (143:5..143:8)) +`depth` (Ident (143:9..143:14)) +`=` (Operator (143:15..143:16)) +`offset_position_ndc` (Ident (143:17..143:36)) +`.` (Punct (143:36..143:37)) +`z` (Field (143:37..143:38)) +`;` (Punct (143:38..143:39)) +`let` (Keyword (145:5..145:8)) +`array_index` (Ident (145:9..145:20)) +`=` (Operator (145:21..145:22)) +`i32` (Type (145:23..145:26)) +`(` (Brace (145:26..145:27)) +`(` (Brace (145:27..145:28)) +`*` (Operator (145:28..145:29)) +`light` (Ident (145:29..145:34)) +`)` (Brace (145:34..145:35)) +`.` (Punct (145:35..145:36)) +`depth_texture_base_index` (Field (145:36..145:60)) +`+` (Operator (145:61..145:62)) +`cascade_index` (Ident (145:63..145:76)) +`)` (Brace (145:76..145:77)) +`;` (Punct (145:77..145:78)) +`return` (Keyword (146:5..146:11)) +`sample_shadow_map` (Function (146:12..146:29)) +`(` (Brace (146:29..146:30)) +`light_local` (Ident (146:30..146:41)) +`,` (Punct (146:41..146:42)) +`depth` (Ident (146:43..146:48)) +`,` (Punct (146:48..146:49)) +`array_index` (Ident (146:50..146:61)) +`,` (Punct (146:61..146:62)) +`(` (Brace (146:63..146:64)) +`*` (Operator (146:64..146:65)) +`cascade` (Ident (146:65..146:72)) +`)` (Brace (146:72..146:73)) +`.` (Punct (146:73..146:74)) +`texel_size` (Field (146:74..146:84)) +`)` (Brace (146:84..146:85)) +`;` (Punct (146:85..146:86)) +`}` (Brace (147:1..147:2)) +`fn` (Keyword (149:1..149:3)) +`fetch_directional_shadow` (Function (149:4..149:28)) +`(` (Brace (149:28..149:29)) +`light_id` (Ident (149:29..149:37)) +`:` (Punct (149:37..149:38)) +`u32` (Type (149:39..149:42)) +`,` (Punct (149:42..149:43)) +`frag_position` (Ident (149:44..149:57)) +`:` (Punct (149:57..149:58)) +`vec4` (Type (149:59..149:63)) +`<` (Operator (149:63..149:64)) +`f32` (Type (149:64..149:67)) +`>` (Operator (149:67..149:68)) +`,` (Punct (149:68..149:69)) +`surface_normal` (Ident (149:70..149:84)) +`:` (Punct (149:84..149:85)) +`vec3` (Type (149:86..149:90)) +`<` (Operator (149:90..149:91)) +`f32` (Type (149:91..149:94)) +`>` (Operator (149:94..149:95)) +`,` (Punct (149:95..149:96)) +`view_z` (Ident (149:97..149:103)) +`:` (Punct (149:103..149:104)) +`f32` (Type (149:105..149:108)) +`)` (Brace (149:108..149:109)) +`->` (Operator (149:110..149:112)) +`f32` (Type (149:113..149:116)) +`{` (Brace (149:117..149:118)) +`let` (Keyword (150:5..150:8)) +`light` (Ident (150:9..150:14)) +`=` (Operator (150:15..150:16)) +`&` (Operator (150:17..150:18)) +`view_bindings` (Module (150:18..150:31)) +`::` (Punct (150:31..150:33)) +`lights` (Ident (150:33..150:39)) +`.` (Punct (150:39..150:40)) +`directional_lights` (Field (150:40..150:58)) +`[` (Brace (150:58..150:59)) +`light_id` (Ident (150:59..150:67)) +`]` (Brace (150:67..150:68)) +`;` (Punct (150:68..150:69)) +`let` (Keyword (151:5..151:8)) +`cascade_index` (Ident (151:9..151:22)) +`=` (Operator (151:23..151:24)) +`get_cascade_index` (Function (151:25..151:42)) +`(` (Brace (151:42..151:43)) +`light_id` (Ident (151:43..151:51)) +`,` (Punct (151:51..151:52)) +`view_z` (Ident (151:53..151:59)) +`)` (Brace (151:59..151:60)) +`;` (Punct (151:60..151:61)) +`if` (Keyword (153:5..153:7)) +`(` (Brace (153:8..153:9)) +`cascade_index` (Ident (153:9..153:22)) +`>=` (Operator (153:23..153:25)) +`(` (Brace (153:26..153:27)) +`*` (Operator (153:27..153:28)) +`light` (Ident (153:28..153:33)) +`)` (Brace (153:33..153:34)) +`.` (Punct (153:34..153:35)) +`num_cascades` (Field (153:35..153:47)) +`)` (Brace (153:47..153:48)) +`{` (Brace (153:49..153:50)) +`return` (Keyword (154:9..154:15)) +`1.0` (FloatLiteral (154:16..154:19)) +`;` (Punct (154:19..154:20)) +`}` (Brace (155:5..155:6)) +`var` (Keyword (157:5..157:8)) +`shadow` (Ident (157:9..157:15)) +`=` (Operator (157:16..157:17)) +`sample_directional_cascade` (Function (157:18..157:44)) +`(` (Brace (157:44..157:45)) +`light_id` (Ident (157:45..157:53)) +`,` (Punct (157:53..157:54)) +`cascade_index` (Ident (157:55..157:68)) +`,` (Punct (157:68..157:69)) +`frag_position` (Ident (157:70..157:83)) +`,` (Punct (157:83..157:84)) +`surface_normal` (Ident (157:85..157:99)) +`)` (Brace (157:99..157:100)) +`;` (Punct (157:100..157:101)) +`//` (CommentStart (159:5..159:7)) +`Blend` (Plain (159:8..159:13)) +`with` (Plain (159:14..159:18)) +`the` (Plain (159:19..159:22)) +`next` (Plain (159:23..159:27)) +`cascade` (Plain (159:28..159:35)) +`,` (Plain (159:35..159:36)) +`if` (Plain (159:37..159:39)) +`there` (Plain (159:40..159:45)) +`is` (Plain (159:46..159:48)) +`one` (Plain (159:49..159:52)) +`.` (Plain (159:52..159:53)) +`let` (Keyword (160:5..160:8)) +`next_cascade_index` (Ident (160:9..160:27)) +`=` (Operator (160:28..160:29)) +`cascade_index` (Ident (160:30..160:43)) +`+` (Operator (160:44..160:45)) +`1u` (IntLiteral (160:46..160:48)) +`;` (Punct (160:48..160:49)) +`if` (Keyword (161:5..161:7)) +`(` (Brace (161:8..161:9)) +`next_cascade_index` (Ident (161:9..161:27)) +`<` (Operator (161:28..161:29)) +`(` (Brace (161:30..161:31)) +`*` (Operator (161:31..161:32)) +`light` (Ident (161:32..161:37)) +`)` (Brace (161:37..161:38)) +`.` (Punct (161:38..161:39)) +`num_cascades` (Field (161:39..161:51)) +`)` (Brace (161:51..161:52)) +`{` (Brace (161:53..161:54)) +`let` (Keyword (162:9..162:12)) +`this_far_bound` (Ident (162:13..162:27)) +`=` (Operator (162:28..162:29)) +`(` (Brace (162:30..162:31)) +`*` (Operator (162:31..162:32)) +`light` (Ident (162:32..162:37)) +`)` (Brace (162:37..162:38)) +`.` (Punct (162:38..162:39)) +`cascades` (Field (162:39..162:47)) +`[` (Brace (162:47..162:48)) +`cascade_index` (Ident (162:48..162:61)) +`]` (Brace (162:61..162:62)) +`.` (Punct (162:62..162:63)) +`far_bound` (Field (162:63..162:72)) +`;` (Punct (162:72..162:73)) +`let` (Keyword (163:9..163:12)) +`next_near_bound` (Ident (163:13..163:28)) +`=` (Operator (163:29..163:30)) +`(` (Brace (163:31..163:32)) +`1.0` (FloatLiteral (163:32..163:35)) +`-` (Operator (163:36..163:37)) +`(` (Brace (163:38..163:39)) +`*` (Operator (163:39..163:40)) +`light` (Ident (163:40..163:45)) +`)` (Brace (163:45..163:46)) +`.` (Punct (163:46..163:47)) +`cascades_overlap_proportion` (Field (163:47..163:74)) +`)` (Brace (163:74..163:75)) +`*` (Operator (163:76..163:77)) +`this_far_bound` (Ident (163:78..163:92)) +`;` (Punct (163:92..163:93)) +`if` (Keyword (164:9..164:11)) +`(` (Brace (164:12..164:13)) +`-` (Operator (164:13..164:14)) +`view_z` (Ident (164:14..164:20)) +`>=` (Operator (164:21..164:23)) +`next_near_bound` (Ident (164:24..164:39)) +`)` (Brace (164:39..164:40)) +`{` (Brace (164:41..164:42)) +`let` (Keyword (165:13..165:16)) +`next_shadow` (Ident (165:17..165:28)) +`=` (Operator (165:29..165:30)) +`sample_directional_cascade` (Function (165:31..165:57)) +`(` (Brace (165:57..165:58)) +`light_id` (Ident (165:58..165:66)) +`,` (Punct (165:66..165:67)) +`next_cascade_index` (Ident (165:68..165:86)) +`,` (Punct (165:86..165:87)) +`frag_position` (Ident (165:88..165:101)) +`,` (Punct (165:101..165:102)) +`surface_normal` (Ident (165:103..165:117)) +`)` (Brace (165:117..165:118)) +`;` (Punct (165:118..165:119)) +`shadow` (Ident (166:13..166:19)) +`=` (Operator (166:20..166:21)) +`mix` (Function (166:22..166:25)) +`(` (Brace (166:25..166:26)) +`shadow` (Ident (166:26..166:32)) +`,` (Punct (166:32..166:33)) +`next_shadow` (Ident (166:34..166:45)) +`,` (Punct (166:45..166:46)) +`(` (Brace (166:47..166:48)) +`-` (Operator (166:48..166:49)) +`view_z` (Ident (166:49..166:55)) +`-` (Operator (166:56..166:57)) +`next_near_bound` (Ident (166:58..166:73)) +`)` (Brace (166:73..166:74)) +`/` (Operator (166:75..166:76)) +`(` (Brace (166:77..166:78)) +`this_far_bound` (Ident (166:78..166:92)) +`-` (Operator (166:93..166:94)) +`next_near_bound` (Ident (166:95..166:110)) +`)` (Brace (166:110..166:111)) +`)` (Brace (166:111..166:112)) +`;` (Punct (166:112..166:113)) +`}` (Brace (167:9..167:10)) +`}` (Brace (168:5..168:6)) +`return` (Keyword (169:5..169:11)) +`shadow` (Ident (169:12..169:18)) +`;` (Punct (169:18..169:19)) +`}` (Brace (170:1..170:2)) +`fn` (Keyword (172:1..172:3)) +`cascade_debug_visualization` (Function (172:4..172:31)) +`(` (Brace (172:31..172:32)) +`output_color` (Ident (173:5..173:17)) +`:` (Punct (173:17..173:18)) +`vec3` (Type (173:19..173:23)) +`<` (Operator (173:23..173:24)) +`f32` (Type (173:24..173:27)) +`>` (Operator (173:27..173:28)) +`,` (Punct (173:28..173:29)) +`light_id` (Ident (174:5..174:13)) +`:` (Punct (174:13..174:14)) +`u32` (Type (174:15..174:18)) +`,` (Punct (174:18..174:19)) +`view_z` (Ident (175:5..175:11)) +`:` (Punct (175:11..175:12)) +`f32` (Type (175:13..175:16)) +`,` (Punct (175:16..175:17)) +`)` (Brace (176:1..176:2)) +`->` (Operator (176:3..176:5)) +`vec3` (Type (176:6..176:10)) +`<` (Operator (176:10..176:11)) +`f32` (Type (176:11..176:14)) +`>` (Operator (176:14..176:15)) +`{` (Brace (176:16..176:17)) +`let` (Keyword (177:5..177:8)) +`overlay_alpha` (Ident (177:9..177:22)) +`=` (Operator (177:23..177:24)) +`0.95` (FloatLiteral (177:25..177:29)) +`;` (Punct (177:29..177:30)) +`let` (Keyword (178:5..178:8)) +`cascade_index` (Ident (178:9..178:22)) +`=` (Operator (178:23..178:24)) +`get_cascade_index` (Function (178:25..178:42)) +`(` (Brace (178:42..178:43)) +`light_id` (Ident (178:43..178:51)) +`,` (Punct (178:51..178:52)) +`view_z` (Ident (178:53..178:59)) +`)` (Brace (178:59..178:60)) +`;` (Punct (178:60..178:61)) +`let` (Keyword (179:5..179:8)) +`cascade_color` (Ident (179:9..179:22)) +`=` (Operator (179:23..179:24)) +`hsv2rgb` (Function (179:25..179:32)) +`(` (Brace (179:32..179:33)) +`f32` (Type (179:33..179:36)) +`(` (Brace (179:36..179:37)) +`cascade_index` (Ident (179:37..179:50)) +`)` (Brace (179:50..179:51)) +`/` (Operator (179:52..179:53)) +`f32` (Type (179:54..179:57)) +`(` (Brace (179:57..179:58)) +`#{MAX_CASCADES_PER_LIGHT}` (PreprocessorInsertion (179:58..179:83)) +`u` (Ident (179:83..179:84)) +`+` (Operator (179:85..179:86)) +`1u` (IntLiteral (179:87..179:89)) +`)` (Brace (179:89..179:90)) +`,` (Punct (179:90..179:91)) +`1.0` (FloatLiteral (179:92..179:95)) +`,` (Punct (179:95..179:96)) +`0.5` (FloatLiteral (179:97..179:100)) +`)` (Brace (179:100..179:101)) +`;` (Punct (179:101..179:102)) +`return` (Keyword (180:5..180:11)) +`vec3` (Type (180:12..180:16)) +`<` (Operator (180:16..180:17)) +`f32` (Type (180:17..180:20)) +`>` (Operator (180:20..180:21)) +`(` (Brace (180:21..180:22)) +`(` (Brace (181:9..181:10)) +`1.0` (FloatLiteral (181:10..181:13)) +`-` (Operator (181:14..181:15)) +`overlay_alpha` (Ident (181:16..181:29)) +`)` (Brace (181:29..181:30)) +`*` (Operator (181:31..181:32)) +`output_color` (Ident (181:33..181:45)) +`.` (Punct (181:45..181:46)) +`rgb` (Field (181:46..181:49)) +`+` (Operator (181:50..181:51)) +`overlay_alpha` (Ident (181:52..181:65)) +`*` (Operator (181:66..181:67)) +`cascade_color` (Ident (181:68..181:81)) +`)` (Brace (182:5..182:6)) +`;` (Punct (182:6..182:7)) +`}` (Brace (183:1..183:2)) +================================================================================ diff --git a/packages/parser/src/common.rs b/packages/parser/src/common.rs index f0913e17..0c8006a6 100644 --- a/packages/parser/src/common.rs +++ b/packages/parser/src/common.rs @@ -60,10 +60,7 @@ impl Parse for AttributeList { type Stream = ParseStream; fn parse(input: &mut Self::Stream) -> gramatika::Result { - let mut attributes = vec![]; - while input.check(punct!["@"]) { - attributes.push(input.parse()?); - } + let attributes = input.parse_seq(|input| input.check(punct!["@"]))?; Ok(Self { attributes: attributes.into(), @@ -279,23 +276,8 @@ impl Parse for ArgumentList { type Stream = ParseStream; fn parse(input: &mut Self::Stream) -> gramatika::Result { - use Token::*; - let brace_open = input.consume(brace!["("])?; - let mut arguments = vec![]; - while !input.check(brace![")"]) { - match input.peek() { - Some(Punct(lex, _)) if lex == "," => input.discard(), - Some(_) => arguments.push(input.parse::()?), - None => { - return Err(SpannedError { - message: "Unexpected end of input".into(), - source: input.source(), - span: None, - }) - } - }; - } + let arguments = input.parse_seq_separated(punct![,], |input| !input.check(brace![")"]))?; let brace_close = input.consume(brace![")"])?; Ok(Self { diff --git a/packages/parser/src/decl/func.rs b/packages/parser/src/decl/func.rs index 184ea666..77903f81 100644 --- a/packages/parser/src/decl/func.rs +++ b/packages/parser/src/decl/func.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use gramatika::{Parse, ParseStreamer, Span, Spanned, SpannedError, Token as _}; +use gramatika::{Parse, ParseStreamer, Span, Spanned}; use crate::{ common::{AttributeList, TypeDecl}, @@ -33,8 +33,6 @@ impl Parse for FunctionDecl { type Stream = ParseStream; fn parse(input: &mut Self::Stream) -> gramatika::Result { - use TokenKind::*; - let storage = input.consume(keyword![fn])?; let storage_modifier = if input.check(operator![<]) { input.consume(operator![<])?; @@ -48,32 +46,15 @@ impl Parse for FunctionDecl { let name = input.consume_as(TokenKind::Ident, Token::function)?; input.consume(brace!["("])?; - let mut params = vec![]; - while !input.check(brace![")"]) { - match input.peek() { - Some(token) => match token.as_matchable() { - (Punct, "@", _) | (Ident, _, _) => { - let param = input.parse::()?; - params.push(Decl::Param(param)); - } - (Punct, ",", _) => input.discard(), - (_, _, span) => { - return Err(SpannedError { - message: "Expected parameter, `,`, or `)`".into(), - span: Some(span), - source: input.source(), - }) - } - }, - None => { - return Err(SpannedError { - message: "Unexpected end of input".into(), - source: input.source(), - span: None, - }) + let params = input.parse_seq_with_finisher( + |input| !input.check(brace![")"]), + |input, param| { + if !input.check(brace![")"]) { + input.consume(punct![,])?; } - }; - } + Ok(Decl::Param(param)) + }, + )?; input.consume(brace![")"])?; let return_ty = if input.check(operator![->]) { diff --git a/packages/parser/src/decl/import.rs b/packages/parser/src/decl/import.rs index 191f3260..3c96aa68 100644 --- a/packages/parser/src/decl/import.rs +++ b/packages/parser/src/decl/import.rs @@ -191,14 +191,8 @@ impl Parse for ImportPath { (Brace, "{", _) => { let brace_open = next; - let mut paths = vec![]; - while !input.check(brace!("}")) { - paths.push(input.parse()?); - - if !input.check(brace!("}")) { - input.consume(punct![,])?; - } - } + let paths = + input.parse_seq_separated(punct![,], |input| !input.check(brace!("}")))?; let brace_close = input.consume(brace!("}"))?; diff --git a/packages/parser/src/decl/struc.rs b/packages/parser/src/decl/struc.rs index 4f5fdb3e..d9504a63 100644 --- a/packages/parser/src/decl/struc.rs +++ b/packages/parser/src/decl/struc.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use gramatika::{Parse, ParseStreamer, Span, Spanned, SpannedError, Token as _}; +use gramatika::{Parse, ParseStreamer, Span, Spanned}; use crate::{ common::{AttributeList, TypeDecl}, @@ -73,36 +73,11 @@ impl Parse for StructBody { type Stream = ParseStream; fn parse(input: &mut Self::Stream) -> gramatika::Result { - use TokenKind::*; - let open_brace = input.consume(brace!["{"])?; - - let mut fields = vec![]; - while !input.check(brace!["}"]) { - match input.peek() { - Some(token) => match token.as_matchable() { - (Punct, "@", _) | (Ident, _, _) => { - let field = input.parse::()?; - fields.push(Decl::Field(field)); - } - (_, _, span) => { - return Err(SpannedError { - message: "Expected field declaration".into(), - span: Some(span), - source: input.source(), - }) - } - }, - None => { - return Err(SpannedError { - message: "Unexpected end of input".into(), - source: input.source(), - span: None, - }) - } - }; - } - + let fields = input.parse_seq_with_finisher::( + |input| !input.check(brace!["}"]), + |_, field| Ok(Decl::Field(field)), + )?; let close_brace = input.consume(brace!["}"])?; Ok(Self { diff --git a/packages/parser/src/lib.rs b/packages/parser/src/lib.rs index cced26e8..4c327b66 100644 --- a/packages/parser/src/lib.rs +++ b/packages/parser/src/lib.rs @@ -249,33 +249,12 @@ impl Parse for SyntaxTree { type Stream = ParseStream; fn parse(input: &mut Self::Stream) -> gramatika::Result { - // TODO: With errors now stored on the `ParseStream`, it should be - // possible to do more comprehensive error-recovery, e.g. in our - // `::parse` implementation - let mut inner = vec![]; - let mut recovering = false; - - while let Some(token) = input.peek() { - match token { - Token::Punct(lexeme, _) if lexeme == ";" => input.discard(), - _ => match input.parse::() { - Ok(decl) => { - if recovering { - recovering = false; - } - inner.push(decl); - } - Err(err) => { - if recovering { - input.discard(); - } else { - input.errors.push(err); - recovering = true; - } - } - }, + let inner = input.parse_seq::(|input| { + while input.check(token::punct![;]) { + input.discard(); } - } + !input.is_empty() + })?; Ok(Self { inner }) } diff --git a/packages/parser/src/parser.rs b/packages/parser/src/parser.rs index 27bd2e70..b7d2fd2f 100644 --- a/packages/parser/src/parser.rs +++ b/packages/parser/src/parser.rs @@ -1,4 +1,4 @@ -use gramatika::{ArcStr, ParseStreamer, SpannedError, Token as _, TokenCtor}; +use gramatika::{ArcStr, ParseStreamer, Spanned, SpannedError, Token as _, TokenCtor}; use crate::{ comment::Comment, @@ -43,6 +43,88 @@ impl ParseStream { self.inner.split_next(split_at, ctors) } + pub fn parse_seq_separated

( + &mut self, + separator: Token, + loop_condition: impl Fn(&mut Self) -> bool, + ) -> gramatika::Result> + where + P: gramatika::Parse, + { + self.parse_seq_impl(&loop_condition, |input, parsed| { + if loop_condition(input) { + input.consume(separator.clone())?; + } + Ok(parsed) + }) + } + + pub fn parse_seq_with_finisher( + &mut self, + loop_condition: impl Fn(&mut Self) -> bool, + finish: impl Fn(&mut Self, P) -> gramatika::Result, + ) -> gramatika::Result> + where + P: gramatika::Parse, + { + self.parse_seq_impl(&loop_condition, finish) + } + + pub fn parse_seq

( + &mut self, + loop_condition: impl Fn(&mut Self) -> bool, + ) -> gramatika::Result> + where + P: gramatika::Parse, + { + self.parse_seq_impl(&loop_condition, |_, parsed| Ok(parsed)) + } + + #[inline] + #[allow(clippy::type_complexity)] + fn parse_seq_impl( + &mut self, + loop_condition: &impl Fn(&mut Self) -> bool, + finish: impl Fn(&mut Self, P) -> gramatika::Result, + ) -> gramatika::Result> + where + P: gramatika::Parse, + { + let mut results = vec![]; + let mut recovering = false; + + while loop_condition(self) { + match self.parse::

() { + Ok(parsed) => { + if recovering { + recovering = false; + } + + results.push(finish(self, parsed)?); + } + Err(err) => { + if recovering { + let needs_discard = self + .peek() + .and_then(|next_token| { + err.span.map(|err_span| (err_span, next_token.span())) + }) + .map(|(err_span, next_token_span)| err_span.contains(next_token_span)); + + if matches!(needs_discard, Some(true)) { + self.discard(); + } + } else { + self.errors.push(err); + recovering = true; + } + } + } + } + + Ok(results) + } + fn did_parse_comment(&mut self) -> bool { let Some(token) = self.inner.peek() else { return false; @@ -87,7 +169,7 @@ impl ParseStreamer for ParseStream { type Token = Token; fn is_empty(&mut self) -> bool { - self.inner.is_empty() + self.peek().is_none() } fn peek(&mut self) -> Option<&Token> { diff --git a/packages/parser/src/stmt.rs b/packages/parser/src/stmt.rs index 80c7e507..ba09eb67 100644 --- a/packages/parser/src/stmt.rs +++ b/packages/parser/src/stmt.rs @@ -177,12 +177,7 @@ impl Parse for BlockStmt { fn parse(input: &mut Self::Stream) -> gramatika::Result { let brace_open = input.consume(brace!["{"])?; - - let mut stmts = vec![]; - while !input.check(brace!["}"]) { - stmts.push(input.parse::()?); - } - + let stmts = input.parse_seq(|input| !input.check(brace!["}"]))?; let brace_close = input.consume(brace!["}"])?; Ok(Self { diff --git a/packages/parser/src/tests/e2e.rs b/packages/parser/src/tests/e2e.rs index e3f67219..ac20df2e 100644 --- a/packages/parser/src/tests/e2e.rs +++ b/packages/parser/src/tests/e2e.rs @@ -8,3 +8,8 @@ begin_snapshots!(); fn bevy_mesh_expanded() { snapshot!(SyntaxTree include_str!("../../test-files/mesh.wgsl")); } + +#[snapshot_test] +fn bevy_pbr_shadows() { + snapshot!(SyntaxTree include_str!("../../test-files/modules/pbr_shadows.wgsl")); +} diff --git a/packages/parser/test-files/modules/pbr_shadows.wgsl b/packages/parser/test-files/modules/pbr_shadows.wgsl new file mode 100644 index 00000000..1b2d526c --- /dev/null +++ b/packages/parser/test-files/modules/pbr_shadows.wgsl @@ -0,0 +1,183 @@ +#define_import_path bevy_pbr::shadows + +#import bevy_pbr::{ + mesh_view_types::POINT_LIGHT_FLAGS_SPOT_LIGHT_Y_NEGATIVE, + mesh_view_bindings as view_bindings, + utils::hsv2rgb, + shadow_sampling::sample_shadow_map +} + +const flip_z: vec3 = vec3(1.0, 1.0, -1.0); + +fn fetch_point_shadow(light_id: u32, frag_position: vec4, surface_normal: vec3) -> f32 { + let light = &view_bindings::point_lights.data[light_id]; + + // because the shadow maps align with the axes and the frustum planes are at 45 degrees + // we can get the worldspace depth by taking the largest absolute axis + let surface_to_light = (*light).position_radius.xyz - frag_position.xyz; + let surface_to_light_abs = abs(surface_to_light); + let distance_to_light = max(surface_to_light_abs.x, max(surface_to_light_abs.y, surface_to_light_abs.z)); + + // The normal bias here is already scaled by the texel size at 1 world unit from the light. + // The texel size increases proportionally with distance from the light so multiplying by + // distance to light scales the normal bias to the texel size at the fragment distance. + let normal_offset = (*light).shadow_normal_bias * distance_to_light * surface_normal.xyz; + let depth_offset = (*light).shadow_depth_bias * normalize(surface_to_light.xyz); + let offset_position = frag_position.xyz + normal_offset + depth_offset; + + // similar largest-absolute-axis trick as above, but now with the offset fragment position + let frag_ls = offset_position.xyz - (*light).position_radius.xyz ; + let abs_position_ls = abs(frag_ls); + let major_axis_magnitude = max(abs_position_ls.x, max(abs_position_ls.y, abs_position_ls.z)); + + // NOTE: These simplifications come from multiplying: + // projection * vec4(0, 0, -major_axis_magnitude, 1.0) + // and keeping only the terms that have any impact on the depth. + // Projection-agnostic approach: + let zw = -major_axis_magnitude * (*light).light_custom_data.xy + (*light).light_custom_data.zw; + let depth = zw.x / zw.y; + + // Do the lookup, using HW PCF and comparison. Cubemaps assume a left-handed coordinate space, + // so we have to flip the z-axis when sampling. + // NOTE: Due to the non-uniform control flow above, we must use the Level variant of + // textureSampleCompare to avoid undefined behavior due to some of the fragments in + // a quad (2x2 fragments) being processed not being sampled, and this messing with + // mip-mapping functionality. The shadow maps have no mipmaps so Level just samples + // from LOD 0. +#ifdef NO_CUBE_ARRAY_TEXTURES_SUPPORT + return textureSampleCompare(view_bindings::point_shadow_textures, view_bindings::point_shadow_textures_sampler, frag_ls * flip_z, depth); +#else + return textureSampleCompareLevel(view_bindings::point_shadow_textures, view_bindings::point_shadow_textures_sampler, frag_ls * flip_z, i32(light_id), depth); +#endif +} + +fn fetch_spot_shadow(light_id: u32, frag_position: vec4, surface_normal: vec3) -> f32 { + let light = &view_bindings::point_lights.data[light_id]; + + let surface_to_light = (*light).position_radius.xyz - frag_position.xyz; + + // construct the light view matrix + var spot_dir = vec3((*light).light_custom_data.x, 0.0, (*light).light_custom_data.y); + // reconstruct spot dir from x/z and y-direction flag + spot_dir.y = sqrt(max(0.0, 1.0 - spot_dir.x * spot_dir.x - spot_dir.z * spot_dir.z)); + if (((*light).flags & POINT_LIGHT_FLAGS_SPOT_LIGHT_Y_NEGATIVE) != 0u) { + spot_dir.y = -spot_dir.y; + } + + // view matrix z_axis is the reverse of transform.forward() + let fwd = -spot_dir; + let distance_to_light = dot(fwd, surface_to_light); + let offset_position = + -surface_to_light + + ((*light).shadow_depth_bias * normalize(surface_to_light)) + + (surface_normal.xyz * (*light).shadow_normal_bias) * distance_to_light; + + // the construction of the up and right vectors needs to precisely mirror the code + // in render/light.rs:spot_light_view_matrix + var sign = -1.0; + if (fwd.z >= 0.0) { + sign = 1.0; + } + let a = -1.0 / (fwd.z + sign); + let b = fwd.x * fwd.y * a; + let up_dir = vec3(1.0 + sign * fwd.x * fwd.x * a, sign * b, -sign * fwd.x); + let right_dir = vec3(-b, -sign - fwd.y * fwd.y * a, fwd.y); + let light_inv_rot = mat3x3(right_dir, up_dir, fwd); + + // because the matrix is a pure rotation matrix, the inverse is just the transpose, and to calculate + // the product of the transpose with a vector we can just post-multiply instead of pre-multiplying. + // this allows us to keep the matrix construction code identical between CPU and GPU. + let projected_position = offset_position * light_inv_rot; + + // divide xy by perspective matrix "f" and by -projected.z (projected.z is -projection matrix's w) + // to get ndc coordinates + let f_div_minus_z = 1.0 / ((*light).spot_light_tan_angle * -projected_position.z); + let shadow_xy_ndc = projected_position.xy * f_div_minus_z; + // convert to uv coordinates + let shadow_uv = shadow_xy_ndc * vec2(0.5, -0.5) + vec2(0.5, 0.5); + + // 0.1 must match POINT_LIGHT_NEAR_Z + let depth = 0.1 / -projected_position.z; + + // Number determined by trial and error that gave nice results. + let texel_size = 0.0134277345; + return sample_shadow_map(shadow_uv, depth, i32(light_id) + view_bindings::lights.spot_light_shadowmap_offset, texel_size); +} + +fn get_cascade_index(light_id: u32, view_z: f32) -> u32 { + let light = &view_bindings::lights.directional_lights[light_id]; + + for (var i: u32 = 0u; i < (*light).num_cascades; i = i + 1u) { + if (-view_z < (*light).cascades[i].far_bound) { + return i; + } + } + return (*light).num_cascades; +} + +fn sample_directional_cascade(light_id: u32, cascade_index: u32, frag_position: vec4, surface_normal: vec3) -> f32 { + let light = &view_bindings::lights.directional_lights[light_id]; + let cascade = &(*light).cascades[cascade_index]; + + // The normal bias is scaled to the texel size. + let normal_offset = (*light).shadow_normal_bias * (*cascade).texel_size * surface_normal.xyz; + let depth_offset = (*light).shadow_depth_bias * (*light).direction_to_light.xyz; + let offset_position = vec4(frag_position.xyz + normal_offset + depth_offset, frag_position.w); + + let offset_position_clip = (*cascade).view_projection * offset_position; + if (offset_position_clip.w <= 0.0) { + return 1.0; + } + let offset_position_ndc = offset_position_clip.xyz / offset_position_clip.w; + // No shadow outside the orthographic projection volume + if (any(offset_position_ndc.xy < vec2(-1.0)) || offset_position_ndc.z < 0.0 + || any(offset_position_ndc > vec3(1.0))) { + return 1.0; + } + + // compute texture coordinates for shadow lookup, compensating for the Y-flip difference + // between the NDC and texture coordinates + let flip_correction = vec2(0.5, -0.5); + let light_local = offset_position_ndc.xy * flip_correction + vec2(0.5, 0.5); + + let depth = offset_position_ndc.z; + + let array_index = i32((*light).depth_texture_base_index + cascade_index); + return sample_shadow_map(light_local, depth, array_index, (*cascade).texel_size); +} + +fn fetch_directional_shadow(light_id: u32, frag_position: vec4, surface_normal: vec3, view_z: f32) -> f32 { + let light = &view_bindings::lights.directional_lights[light_id]; + let cascade_index = get_cascade_index(light_id, view_z); + + if (cascade_index >= (*light).num_cascades) { + return 1.0; + } + + var shadow = sample_directional_cascade(light_id, cascade_index, frag_position, surface_normal); + + // Blend with the next cascade, if there is one. + let next_cascade_index = cascade_index + 1u; + if (next_cascade_index < (*light).num_cascades) { + let this_far_bound = (*light).cascades[cascade_index].far_bound; + let next_near_bound = (1.0 - (*light).cascades_overlap_proportion) * this_far_bound; + if (-view_z >= next_near_bound) { + let next_shadow = sample_directional_cascade(light_id, next_cascade_index, frag_position, surface_normal); + shadow = mix(shadow, next_shadow, (-view_z - next_near_bound) / (this_far_bound - next_near_bound)); + } + } + return shadow; +} + +fn cascade_debug_visualization( + output_color: vec3, + light_id: u32, + view_z: f32, +) -> vec3 { + let overlay_alpha = 0.95; + let cascade_index = get_cascade_index(light_id, view_z); + let cascade_color = hsv2rgb(f32(cascade_index) / f32(#{MAX_CASCADES_PER_LIGHT}u + 1u), 1.0, 0.5); + return vec3( + (1.0 - overlay_alpha) * output_color.rgb + overlay_alpha * cascade_color + ); +}