fix(engine): предохранители упаковки лайтмап
Повреждённый BSP с огромным lightmap_size больше не может переполнить арифметику упаковки или зациклить сборку: блок ограничен 4096 текселями и 1 МиБ площади, иначе грань остаётся без атласа (вершинный/белый путь).
This commit is contained in:
parent
1a34203d64
commit
74db5f50f1
1 changed files with 11 additions and 1 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue