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 блоков), декодер кадров