//! **Masked** (alpha-tested) shadow caster resources — the B2 hole-shaped-shadow
//! infrastructure.
//!
//! Held on [`RenderPasses`](crate::render_passes::RenderPasses) rather than on
//! `Shadows`: the augmented group-0 bind group reads the same material / mesh /
//! texture buffers the masked geometry pass does (via `BindGroupRecreateContext`),
//! plus the shadow subsystem's stable `shadow_view` buffer — owning it here lets
//! it fold into the unified bind-group recreate dispatch without a `&mut Shadows`
//! borrow conflict (the recreate context already holds `&Shadows`). The shadow
//! render pass reaches it through `ctx.render_passes.shadow_masked`.
//!
//! The shader + cache key live under `crate::shadows::shader::masked_*` (the
//! shadow subsystem's askama dir); only the bind group + lazy pipeline pool live
//! here.
use ShadowMaskedBindGroup;
use ShadowMaskedPipelines;
/// Masked-shadow caster bind group + lazy pipeline pool.