1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//! Shader cache key for the **custom-vertex** shadow caster — the displaced-
//! shadow path that keeps a custom-vertex material's shadow glued to its lit
//! geometry (no detached / smooth shadow).
//!
//! A material that declared a `wgsl_vertex` displacement body gets its own
//! shadow-generation pipeline: the (depth-only) shadow VERTEX shader compiles
//! the gated `custom_displace_vertex` hook with the SAME inputs the geometry
//! custom-vertex pass uses, so the silhouette matches exactly. Because the hook's
//! `material_data_load` reads the renderer's `materials` storage buffer (and the
//! generated texture helpers sample the texture pool), the variant reuses the
//! **masked-shadow** bind group — augmented to give those bindings VERTEX
//! visibility (mirrors how the geometry custom-vertex variant reuses the masked
//! geometry bind group). The plain shadow bind groups declare none of that.
//!
//! Specialized per `shader_id` (like the masked-shadow variant) because the
//! assembled module embeds the material's auto-generated `MaterialData`
//! struct/loader + the author's vertex body — an edit recompiles only the
//! affected pipeline. The shadow atlas is single-sampled, so there is no MSAA /
//! sample_mask field.
use MaterialShaderId;
use crate::;
/// Cache key for the custom-vertex shadow-generation shader.