From c1b35b6263a92a42ce3f5b3ac2b4ff5597a04496 Mon Sep 17 00:00:00 2001 From: Niko Marmeladkov Date: Fri, 23 Oct 2026 13:23:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BD=D0=B5=D0=B2=D0=BD=D0=B8=D0=BA:=20?= =?UTF-8?q?=D1=81=D0=B5=D1=81=D1=81=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D0=B6?= =?UTF-8?q?=D0=B0=D0=BB=D0=BE=D0=B1=D0=B0=D0=BC=20=E2=80=94=20=D0=B2=D1=8C?= =?UTF-8?q?=D1=8E=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D1=8C,=20=D1=81=D0=BF?= =?UTF-8?q?=D0=B0=D0=B2=D0=BD,=20HDR/Android/=D0=B0=D0=BD=D0=B8=D0=BC?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/engine/tests/world_real.rs | 15 +++++++++++++-- docs/DIARY.md | 23 +++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/crates/engine/tests/world_real.rs b/crates/engine/tests/world_real.rs index b5f49be..671b7ea 100644 --- a/crates/engine/tests/world_real.rs +++ b/crates/engine/tests/world_real.rs @@ -479,7 +479,11 @@ fn real_weapon_model_structure() { return; }; let vfs = mount_game(&root); - for name in ["models/weapons/v_pistol.mdl", "models/weapons/w_pistol.mdl"] { + for name in [ + "models/weapons/v_pistol.mdl", + "models/weapons/w_pistol.mdl", + "models/props_c17/oildrum001.mdl", + ] { let Ok(data) = vfs.read(name) else { continue }; let mdl = formats::mdl::Mdl::parse(&data).expect("разбор"); let base = name.trim_end_matches(".mdl"); @@ -507,7 +511,14 @@ fn real_weapon_model_structure() { mesh.strip_groups.iter().map(|g| g.vertices.len()).sum(); let idx: usize = mesh.strip_groups.iter().map(|g| g.indices.len()).sum(); - format!("({verts}в/{idx}и)",) + format!( + "({verts}в/{idx}и, flags {:#x}, группы {:?})", + mesh.flags, + mesh.strip_groups + .iter() + .map(|g| (g.flags, g.strips.len(), g.indices.len())) + .collect::>() + ) }) .collect(); eprintln!(" парт {p} модель {m} lod {l}: {}", summary.join(" ")); diff --git a/docs/DIARY.md b/docs/DIARY.md index e960553..1a1a053 100644 --- a/docs/DIARY.md +++ b/docs/DIARY.md @@ -124,6 +124,29 @@ origin. Посадка: глаз + 20 вперёд + 6 вправо − 10 вн `batch.material` с позицией материала в `world.materials` (дедупликация по имени); (3) `--only-material` фильтрует батчи, но не мешает ли ему что-то ещё. +**2026-10-23, сессия по жалобам пользователя.** Закрыто коммитом `f58eafe`: + +- падение wgpu на втором спавне («Copy at offset … overrunning the bounds»): + буферы GPU не росли — добавлены `ensure_capacity` (рост вдвое с перезаливкой) + и `refresh_materials` (bind group для новых материалов, иначе новые батчи + молча не рисовались); +- вьюмодель: обновляется после `player.update` и `camera.pos` (раньше + отставала на кадр — «плывёт при повороте»), по умолчанию `w_pistol.mdl`, + курс −90° (у модели ствол вдоль +Y, а не +X), дистанция 26, анимация `idle01`; +- `bone_world_transforms` обходит кости рекурсивно (порядок в файле не + гарантирован); +- HUD: отладочные строки (verts/tris, лог Lua) скрыты по умолчанию, клавиша `. + +**Известная проблема:** `v_pistol.mdl` рисуется плоским «листом» (2157 вершин, +2 меша, 1 материал, скиннинг при этом цел — тест `real_view_model_skin_stays_coherent` +даёт максимальный сдвиг 4 юнита). Похоже на проблему загрузки геометрии именно +этой модели; до выяснения по умолчанию стоит `w_pistol.mdl`. + +**Запущены параллельно (воркдеревья от `f58eafe`):** `feat/android` — APK под +Android 12+; `feat/hdr` — HDR, тонмаппинг, bloom и мягкие тени/свет; `feat/anim` — +RAWROT/RAWPOS/RAWROT2, выбор анимации по состоянию (идёт/бежит/приседает/ +прыжок), покачивание вьюмодели. + **A26, состояние на 2026-10-17:** сделаны секвенции (с определением шага записи по данным), кости и веса вершин, слияние включённых моделей (у игрока 465 секвенций), чтение `.ani` (7,1 МБ, 1563 анимации, 247 блоков), декодер кадров