[
  {"type":"CommentPreproc","value":"#include"},
  {"type":"Text","value":" "},
  {"type":"CommentPreprocFile","value":"\u003cmetal_stdlib\u003e"},
  {"type":"CommentPreproc","value":"\n"},
  {"type":"Text","value":"\n"},
  {"type":"Keyword","value":"using"},
  {"type":"Text","value":" "},
  {"type":"Keyword","value":"namespace"},
  {"type":"Text","value":" "},
  {"type":"Name","value":"metal"},
  {"type":"Punctuation","value":";"},
  {"type":"Text","value":"\n\n"},
  {"type":"CommentSingle","value":"// Include header shared between C code and .metal files.\n"},
  {"type":"CommentPreproc","value":"#include"},
  {"type":"Text","value":" "},
  {"type":"CommentPreprocFile","value":"\"AAPLShaderTypes.h\""},
  {"type":"CommentPreproc","value":"\n"},
  {"type":"Text","value":"\n"},
  {"type":"CommentSingle","value":"// Include header shared between all .metal files.\n"},
  {"type":"CommentPreproc","value":"#include"},
  {"type":"Text","value":" "},
  {"type":"CommentPreprocFile","value":"\"AAPLShaderCommon.h\""},
  {"type":"CommentPreproc","value":"\n"},
  {"type":"Text","value":"\n"},
  {"type":"Keyword","value":"struct"},
  {"type":"Text","value":" "},
  {"type":"NameClass","value":"VertexOutput"},
  {"type":"Text","value":"\n"},
  {"type":"Punctuation","value":"{"},
  {"type":"Text","value":"\n    "},
  {"type":"KeywordType","value":"float4"},
  {"type":"Text","value":" "},
  {"type":"Name","value":"position"},
  {"type":"Text","value":" "},
  {"type":"NameAttribute","value":"[[position]]"},
  {"type":"Punctuation","value":";"},
  {"type":"Text","value":"\n"},
  {"type":"Punctuation","value":"};"},
  {"type":"Text","value":"\n\n"},
  {"type":"CommentSingle","value":"// A depth pre-pass is necessary in forward plus rendering to produce\n// minimum and maximum depth bounds for light culling.\n"},
  {"type":"Keyword","value":"vertex"},
  {"type":"Text","value":" "},
  {"type":"Name","value":"VertexOutput"},
  {"type":"Text","value":" "},
  {"type":"NameFunction","value":"depth_pre_pass_vertex"},
  {"type":"Punctuation","value":"("},
  {"type":"Name","value":"Vertex"},
  {"type":"Text","value":" "},
  {"type":"Name","value":"in"},
  {"type":"Text","value":" "},
  {"type":"NameAttribute","value":"[[ stage_in ]]"},
  {"type":"Punctuation","value":","},
  {"type":"Text","value":"\n                                          "},
  {"type":"Keyword","value":"constant"},
  {"type":"Text","value":" "},
  {"type":"Name","value":"AAPLFrameData"},
  {"type":"Text","value":" "},
  {"type":"Operator","value":"\u0026"},
  {"type":"Text","value":" "},
  {"type":"Name","value":"frameData"},
  {"type":"Text","value":" "},
  {"type":"Punctuation","value":"[["},
  {"type":"Text","value":" "},
  {"type":"Name","value":"buffer"},
  {"type":"Punctuation","value":"("},
  {"type":"Name","value":"AAPLBufferIndexFrameData"},
  {"type":"Punctuation","value":")"},
  {"type":"Text","value":" "},
  {"type":"Punctuation","value":"]])"},
  {"type":"Text","value":"\n"},
  {"type":"Punctuation","value":"{"},
  {"type":"Text","value":"\n    "},
  {"type":"CommentSingle","value":"// Make the position a float4 to perform 4x4 matrix math on it.\n"},
  {"type":"Text","value":"    "},
  {"type":"Name","value":"VertexOutput"},
  {"type":"Text","value":" "},
  {"type":"Name","value":"out"},
  {"type":"Punctuation","value":";"},
  {"type":"Text","value":"\n    "},
  {"type":"KeywordType","value":"float4"},
  {"type":"Text","value":" "},
  {"type":"Name","value":"position"},
  {"type":"Text","value":" "},
  {"type":"Operator","value":"="},
  {"type":"Text","value":" "},
  {"type":"KeywordType","value":"float4"},
  {"type":"Punctuation","value":"("},
  {"type":"Name","value":"in"},
  {"type":"Punctuation","value":"."},
  {"type":"Name","value":"position"},
  {"type":"Punctuation","value":","},
  {"type":"Text","value":" "},
  {"type":"LiteralNumberFloat","value":"1.0"},
  {"type":"Punctuation","value":");"},
  {"type":"Text","value":"\n\n    "},
  {"type":"CommentSingle","value":"// Calculate the position in clip space.\n"},
  {"type":"Text","value":"    "},
  {"type":"Name","value":"out"},
  {"type":"Punctuation","value":"."},
  {"type":"Name","value":"position"},
  {"type":"Text","value":" "},
  {"type":"Operator","value":"="},
  {"type":"Text","value":" "},
  {"type":"Name","value":"frameData"},
  {"type":"Punctuation","value":"."},
  {"type":"Name","value":"projectionMatrix"},
  {"type":"Text","value":" "},
  {"type":"Operator","value":"*"},
  {"type":"Text","value":" "},
  {"type":"Name","value":"frameData"},
  {"type":"Punctuation","value":"."},
  {"type":"Name","value":"modelViewMatrix"},
  {"type":"Text","value":" "},
  {"type":"Operator","value":"*"},
  {"type":"Text","value":" "},
  {"type":"Name","value":"position"},
  {"type":"Punctuation","value":";"},
  {"type":"Text","value":"\n\n    "},
  {"type":"Keyword","value":"return"},
  {"type":"Text","value":" "},
  {"type":"Name","value":"out"},
  {"type":"Punctuation","value":";"},
  {"type":"Text","value":"\n"},
  {"type":"Punctuation","value":"}"},
  {"type":"Text","value":"\n\n"},
  {"type":"Keyword","value":"fragment"},
  {"type":"Text","value":" "},
  {"type":"Name","value":"ColorData"},
  {"type":"Text","value":" "},
  {"type":"NameFunction","value":"depth_pre_pass_fragment"},
  {"type":"Punctuation","value":"("},
  {"type":"Name","value":"VertexOutput"},
  {"type":"Text","value":" "},
  {"type":"Name","value":"in"},
  {"type":"Text","value":" "},
  {"type":"NameAttribute","value":"[[ stage_in ]]"},
  {"type":"Punctuation","value":")"},
  {"type":"Text","value":"\n"},
  {"type":"Punctuation","value":"{"},
  {"type":"Text","value":"\n    "},
  {"type":"CommentSingle","value":"// Populate on-tile geometry buffer data.\n"},
  {"type":"Text","value":"    "},
  {"type":"Name","value":"ColorData"},
  {"type":"Text","value":" "},
  {"type":"Name","value":"f"},
  {"type":"Punctuation","value":";"},
  {"type":"Text","value":"\n\n    "},
  {"type":"CommentSingle","value":"// Setting color in the depth pre-pass is unnecessary, but may make debugging easier.\n"},
  {"type":"Text","value":"    "},
  {"type":"CommentSingle","value":"// f.lighting = half4(0, 0, 0, 1);\n"},
  {"type":"Text","value":"\n    "},
  {"type":"CommentSingle","value":"// Set the depth in clip space, which you use in `AAPLCulling` to perform per-tile light culling.\n"},
  {"type":"Text","value":"    "},
  {"type":"Name","value":"f"},
  {"type":"Punctuation","value":"."},
  {"type":"Name","value":"depth"},
  {"type":"Text","value":" "},
  {"type":"Operator","value":"="},
  {"type":"Text","value":" "},
  {"type":"Name","value":"in"},
  {"type":"Punctuation","value":"."},
  {"type":"Name","value":"position"},
  {"type":"Punctuation","value":"."},
  {"type":"Name","value":"z"},
  {"type":"Punctuation","value":";"},
  {"type":"Text","value":"\n\n    "},
  {"type":"Keyword","value":"return"},
  {"type":"Text","value":" "},
  {"type":"Name","value":"f"},
  {"type":"Punctuation","value":";"},
  {"type":"Text","value":"\n"},
  {"type":"Punctuation","value":"}"},
  {"type":"Text","value":"\n"}
]