From 3c0bef51692f8445f7775f663e22b6e6301b58ba Mon Sep 17 00:00:00 2001 From: Niko Marmeladkov Date: Sat, 17 Oct 2026 11:32:37 +0300 Subject: [PATCH] =?UTF-8?q?A26:=20=D1=81=D0=BB=D0=B8=D1=8F=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B2=D0=BA=D0=BB=D1=8E=D1=87=D1=91=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B5=D0=B9=20=E2=80=94?= =?UTF-8?q?=20=D1=83=20=D0=B8=D0=B3=D1=80=D0=BE=D0=BA=D0=B0=20465=20=D1=81?= =?UTF-8?q?=D0=B5=D0=BA=D0=B2=D0=B5=D0=BD=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit police.mdl включает models/m_anm.mdl (библиотека анимаций GMod). Включённая модель грузится лёгким путём: Mdl::parse + секвенции, без геометрии и текстур — у анимационной библиотеки их нет. Замеры: у m_anm.mdl numlocalseq=464, numlocalanim=1563, 56 костей; после слияния у модели игрока 465 секвенций (была одна «ragdoll»). Находка по пути: у «единичных» (unified) моделей GMod запись секвенции длиннее, чем у моделей карты, и мой первый набор кандидатов (184..208) не подошёл — разбор молча возвращал ноль. Перебор расширен до 176..320 с обязательной проверкой имён ВСЕХ секвенций: иначе шаг не принимается. Все 23 сьюта зелёные; docs/PARITY.md A26 обновлён. --- crates/engine/src/model.rs | 40 ++++++++++++++++++++++++++++++++++++++ crates/formats/src/mdl.rs | 5 ++++- docs/PARITY.md | 16 ++++++++++++--- 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/crates/engine/src/model.rs b/crates/engine/src/model.rs index faa2fef..695277e 100644 --- a/crates/engine/src/model.rs +++ b/crates/engine/src/model.rs @@ -118,6 +118,46 @@ pub fn load_model(vfs: &VirtualFs, name: &str, budget: &mut usize) -> Result Mdl<'a> { } let start = h.localseqindex.max(0) as usize; let mut chosen: Option<(usize, Vec)> = None; - for stride in [184usize, 188, 192, 196, 200, 204, 208] { + // Перебор широкий: у «единичных» (unified) моделей GMod запись + // секвенции длиннее, чем у моделей карты, и угадывать нельзя — берём + // только тот шаг, при котором читаются имена ВСЕХ секвенций. + for stride in (176..=320).step_by(4) { let mut out = Vec::with_capacity(count); let mut ok = true; for i in 0..count { diff --git a/docs/PARITY.md b/docs/PARITY.md index 55248af..436fa8a 100644 --- a/docs/PARITY.md +++ b/docs/PARITY.md @@ -3192,9 +3192,19 @@ Sandbox. GPU» работает целиком. Пока это не анимация: настоящие кадры из `.ani` следующим шагом. -**Порядок работ:** (а) секвенции сделаны; дальше `.ani` (кадры) и слияние -включённых моделей; (б) привязка вершин сделана; (в) CPU-скиннинг сделан; -(г) проигрывание одной секвенции с циклом; (д) выбор по состоянию и блендинг. +**Сделано (слияние включённых моделей).** Разбор `include_models()` и лёгкая +загрузка включённой модели (без геометрии и текстур: `Mdl::parse` + секвенции). +Замеры: `police.mdl` включает `models/m_anm.mdl` — библиотеку анимаций GMod; +у неё `numlocalseq=464`, `numlocalanim=1563`, 56 костей. После слияния у модели +игрока **465 секвенций** (была одна «ragdoll»). + +Важная находка: у «единичных» (unified) моделей GMod запись секвенции длиннее +176…208 байт, поэтому перебор шага расширен до 176…320 с обязательной проверкой +имён ВСЕХ секвенций — иначе разбор молча возвращал ноль. + +**Порядок работ:** (а) секвенции и включённые модели сделаны; дальше `.ani` +(кадры); (б) привязка вершин сделана; (в) CPU-скиннинг сделан; (г) проигрывание +одной секвенции с циклом; (д) выбор по состоянию и блендинг. **Приёмка:** модель игрока/оружия двигается в кадре, ходьба переходит в бег и присед по скорости, прыжок показывается отдельной секвенцией.