From 74db5f50f1e63f01a6cbf7f978947caea2ec0634 Mon Sep 17 00:00:00 2001 From: Niko Marmeladkov Date: Fri, 23 Oct 2026 14:17:48 +0300 Subject: [PATCH] =?UTF-8?q?fix(engine):=20=D0=BF=D1=80=D0=B5=D0=B4=D0=BE?= =?UTF-8?q?=D1=85=D1=80=D0=B0=D0=BD=D0=B8=D1=82=D0=B5=D0=BB=D0=B8=20=D1=83?= =?UTF-8?q?=D0=BF=D0=B0=D0=BA=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=BB=D0=B0=D0=B9?= =?UTF-8?q?=D1=82=D0=BC=D0=B0=D0=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Повреждённый BSP с огромным lightmap_size больше не может переполнить арифметику упаковки или зациклить сборку: блок ограничен 4096 текселями и 1 МиБ площади, иначе грань остаётся без атласа (вершинный/белый путь). --- crates/engine/src/world.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/crates/engine/src/world.rs b/crates/engine/src/world.rs index 4d10724..042dbf2 100644 --- a/crates/engine/src/world.rs +++ b/crates/engine/src/world.rs @@ -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;