fix(engine): предохранители упаковки лайтмап

Повреждённый BSP с огромным lightmap_size больше не может переполнить
арифметику упаковки или зациклить сборку: блок ограничен 4096 текселями и
1 МиБ площади, иначе грань остаётся без атласа (вершинный/белый путь).
This commit is contained in:
Niko Marmeladkov 2026-10-23 14:17:48 +03:00
parent 1a34203d64
commit 74db5f50f1

View file

@ -251,7 +251,17 @@ impl LightmapAtlas {
if extent[0] <= 0 || extent[1] <= 0 {
continue;
}
sizes.push((index, extent[0] as u32, extent[1] as u32));
let width = extent[0] as u32;
let height = extent[1] as u32;
// Лимиты на случай повреждённого BSP: без них `width + 2` может
// переполниться, а упаковка — уйти в многочасовой цикл. Такая
// грань просто останется без атласа (белый свет), а не уронит клиент.
const MAX_BLOCK: u32 = 4096;
const MAX_BLOCK_AREA: u32 = 1024 * 1024;
if width > MAX_BLOCK || height > MAX_BLOCK || width * height > MAX_BLOCK_AREA {
continue;
}
sizes.push((index, width, height));
}
if sizes.is_empty() {
return None;