Commit graph

11 commits

Author SHA1 Message Date
3de8b8945f Слияние feat/anim: RAW-дорожки, анимации по состоянию, вьюмодель
Some checks are pending
CI / checks (push) Waiting to run
Из ветки feat/anim (d42d646):
- распаковка постоянных дорожек: Quaternion48 (RAWROT), Quaternion64
  (RAWROT2), Vector48 (RAWPOS) — раньше такие кости застревали в позе покоя
  (в @taunt_muscle_base 24 дорожки из 53);
- engine::animation — выбор секвенции по состоянию: стоя/шаг/бег/присед/
  воздух, 8 направлений относительно взгляда, сохранение фазы walk↔run;
- клиент: покачивание вьюмодели при ходьбе, инерция взгляда, одиночный
  выстрел fire по ЛКМ, компенсация RAWPOS-сдвига корня (у v_pistol 68 юнитов).

Разрешение конфликтов: вьюмодель осталась в камерном базисе (мои правки —
смещения через up камеры, доворот model_yaw), анимации и покачивание взяты
из ветки; play_model_animation с шестым аргументом model_yaw во всех вызовах.

Проверено: 23 сьюта, 29 картовых тестов, 15 тестов world_real — зелёные.
2026-10-23 14:08:03 +03:00
a491010aa6 Вьюмодель: доворот в координатах модели и камерный базис; коллизия из меша
Some checks are pending
CI / checks (push) Waiting to run
Вьюмодель (жалобы пользователя):
- доворот ствола (-90°) теперь применяется в координатах модели, до поворота
  камеры: прибавка к мировому yaw при взгляде вниз превращалась в крен;
- смещения (вправо/вниз) задаются в базисе камеры, а не мировым (0,0,-12) —
  иначе при наклоне камеры вьюмодель уезжала к центру экрана («ось ниже»);
- play_model_animation принимает model_yaw (доворот модели), rewrite_instance
  тоже — путь без скелета больше не теряет ориентацию.

Коллизия пропов из настоящего меша:
- Physics::add_prop_hull — выпуклая оболочка вершин модели для динамических
  пропов (как vcollide в Source), вместо коробки с выступами;
- Physics::add_static_mesh — тримеш из треугольников модели для prop_static:
  раньше у статических пропов коллизии не было вовсе, игрок проходил сквозь
  мебель;
- PropMesh хранит индексы модели; оба места создания тел используют оболочку
  (с откатом на коробку, если вершин < 4).

Все сьюты и 29 картовых тестов зелёные.
2026-10-23 14:03:45 +03:00
d42d6464f6 A26: постоянные дорожки RAW и выбор анимации по состоянию
- formats: Quaternion48/Quaternion64/Vector48 (RAWROT, RAWROT2, RAWPOS),
  приоритет постоянных значений в frame_pose;
- engine::animation: выбор idle/walk/run/crouch/jump по скорости, приседу,
  земле и восьми направлениям относительно взгляда, сохранение фазы walk↔run;
- клиент: модель игрока играет выбранное имя, вьюмодель качается на ходу,
  отстаёт при повороте и проигрывает fire по ЛКМ; центр анимированной позы
  компенсирует RAWPOS корня;
- тесты: RAW на v_pistol/m_anm, имена и проигрывание секвенций, чистый выбор
  и фаза; docs A26 обновлены.
2026-10-23 14:02:05 +03:00
b52da2ed2e Коллизия пропов: смещение коллайдера от центра модели
Some checks are pending
CI / checks (push) Waiting to run
Коробка-коллайдер ставилась от нуля модели, хотя геометрия часто смещена
(у куклы центр AABB на 13,5 юнита выше нуля, у стола — 9,5 вбок по X). Из-за
этого предметы висели на невидимых выступах: их держала коробка, сдвинутая
относительно меша (жалоба пользователя, кадр с парящими столом и куклой).

- Physics::add_prop_offset — смещение коллайдера в координатах модели,
  поворачивается вместе с телом (Rapier ColliderBuilder::translation);
- оба места создания тел (пропы карты и spawn_prop) передают bounds_center;
- World::prop_collision_boxes — коробки для коллизии игрока с учётом центра и
  поворота (AABB описанной коробки по модулю матрицы поворота); клиент больше
  не собирает их вручную;
- тест physics::prop_collider_honours_model_center_offset — без смещения проп
  висит на 30+ юнитов выше пола, со смещением низ ложится на пол;
- тест real_map_props_rest_on_ground — после 10 с физики низ коробки каждого
  пропа на опоре (кукла лежит краем на столе, центровой луч этого не видит).

Все сьюты зелёные.
2026-10-23 13:46:39 +03:00
7490ef3798 Тесты моделей оружия: структура, VVD, скиннинг вьюмодели
Some checks are pending
CI / checks (push) Waiting to run
Замеры на реальных ассетах, которые пригодятся для дальнейших правок:
- v_pistol: 1 бодипарт, 2 меша (1169/4356 и 988/2448), 2157 вершин, 2167 в
  VVD (10 не используются), кадры лежат внутри MDL, флаги дорожек
  2/3/8/12 (RAWROT/RAWPOS/ANIMROT/ANIMPOS);
- скиннинг вьюмодели не разваливает меш: между позой покоя и кадром idle01
  максимальный сдвиг 4 юнита, габарит 20×23×13;
- v_pistol рисуется «лепестком» даже в позе покоя (до скиннинга) — проблема
  загрузки геометрии именно этой модели, отложена; по умолчанию w_pistol.

Все сьюты зелёные.
2026-10-23 13:28:49 +03:00
c1b35b6263 Дневник: сессия по жалобам — вьюмодель, спавн, HDR/Android/анимации в работе 2026-10-23 13:23:59 +03:00
f58eafeb46 Клиент: спавн не падает, вьюмодель на глазах, HUD без отладки
Some checks are pending
CI / checks (push) Waiting to run
Падение wgpu на втором спавне («Copy at offset ... overrunning the bounds»):
буферы GPU создавались под размер мира при загрузке и не росли. Появился
WorldRenderer::ensure_capacity (рост вдвое + перезаливка) и refresh_materials
(bind group для материалов, появившихся после спавна, — иначе новые батчи
молча не рисуются).

Вьюмодель:
- обновляется после player.update и camera.pos, а не до них: раньше она
  отставала на кадр при ходьбе и «плыла» при повороте (жалоба пользователя);
- по умолчанию w_pistol.mdl вместо v_pistol.mdl: v_pistol у нас рисуется
  развёрнутым полотном (2157 вершин, 2 меша — разбираться отдельно), а w_pistol
  выглядит пистолетом;
- курс -90°: у модели ствол смотрит вдоль +Y (влево), а не +X — без доворота
  пистолет лежал поперёк кадра;
- дистанция 26, сдвиг вправо/вниз, анимация idle01 (у w_pistol свои кадры
  в MDL).

bone_world_transforms теперь обходит кости рекурсивно: порядок «родитель
раньше ребёнка» в файлах не гарантирован.

HUD: журнал и отладочные строки скрыты по умолчанию (клавиша `), строка
verts/tris убрана.

Плюс тесты на реальных ассетах: кости вьюмодели не разваливаются при
скиннинге (макс. сдвиг 4 юнита), структура моделей оружия, встроенные кадры.

Все сьюты зелёные, clippy чистый.
2026-10-23 13:20:03 +03:00
8a5f43dcd2 A26: кадры анимации играют — модель игрока и вьюмодель
Some checks failed
CI / checks (push) Has been cancelled
Спека декодера взята из настоящего bone_setup.cpp (Mapbase-зеркало SDK 2013).
Прошлые догадки были неверны, и это зафиксировано в docs/PARITY.md: каналы
дорожек — не компоненты кватерниона, а углы Эйлера (raw · rotscale + поза
покоя, затем AngleQuaternion); позиции — raw · posscale + bone.pos; значения
блоков не накапливаются дельтами (ExtractAnimValue идёт по блокам valid+1
записей, внутри блока value[k], дальше повтор последнего); флаг DELTA означает
относительные каналы без позы покоя.

Замеры на живых данных, три теста в tests/world_real.rs:
- @taunt_muscle_base (451 кадр, 53 дорожки): углы ≤ 4,75 рад, сдвиги позиций
  ≤ 28,5 юнитов, кватернионы единичные — при новой спеке нарушений нет;
- кости локальны родителю (цепочка 4,0 / 3,5 / 8,9), корень — таз на 38,6;
- police.mdl: 57 костей, своя анимация @ragdoll лежит в самом MDL
  (anim_block == 0); m_anm.mdl: 1563 анимации в models/m_anm.ani (7,1 МБ);
- модель игрока, idle_all_01: из 3147 вершин 1101 сдвинулась между кадрами 0 и
  30, высота тела 61 юнит и в покое, и в анимации — не схлопывается.

Движок: AnimData (буферы кадров под Arc), frame_pose, play_model_animation
(мировые позы через родителей, A·B⁻¹ по костям, скиннинг весами вершин);
кости меша ищутся в скелете анимации по именам — скелеты совпадают по именам,
но не по числу костей. Кадры читаются и из .ani, и из самого MDL.

Клиент: вьюмодель играет idle, модель игрока — idle_all_01; добавлен вид со
стороны --third-person (иначе свою модель не увидеть: в первом лице камера
внутри неё). Map(Box<MapArgs>) — против clippy::large_enum_variant.

Все 23 сьюта и 29 картовых тестов зелёные.
2026-10-17 12:37:45 +03:00
44b0ece2ab render: вода (SURF_WARP), area-скайбокс с правильным порядком глубины, лайтмапы диспов по UV
- Вода: детект Water-шейдера (/), отдельный полупрозрачный
  проход с френелем; поверхность/изнанка по нормали. Белая дыра на месте воды
  (2D-скайбокс «вниз») устранена.
- 3D-скайбокс: выбор граней по area листа sky_camera (движок: area bits), а не по
  AABB. Disp-грани не попадают в leaf_faces — выбор по листу центра грани; теперь
  в скайбоксе есть большая плоскость flatgrass_2 (пропадала — торчала «стена»
  бетонного пола). Защита >30% граней = скайбокс не выделяем (gm_flatgrass).
- Порядок: 2D-скайбокс фоном -> 3D-меш (depth Always, без записи) -> мир ->
  вода. Скайбокс больше не проступает сквозь дальние стены карты.
- Лайтмапы: блок грани (size+1)^2 с индексом v*width+u; для displacement'ов —
  плотная сетка по UV поверхности (CalcDispSurfCoords), а не проекция мира:
  убрана «шахматка» теней на рельефе. Скайбокс-меш тоже сэмплит лайтмапы.
- Тесты: gm_flatgrass-диспы живут в скайбоксе (z≈-16000), пороги обновлены.
- docs/RECON.md §12: форматы листьев/граней, лайтмапы, скайбокс, вода.
2026-10-12 08:28:28 +03:00
2aeee1ac0a engine/render: модели энтити (prop_static/prop_dynamic/prop_physics) и 3D-скайбокс
- engine::model: сборка мешей MDL+VVD+VTX (bind pose, LOD 0), материалы через
  cd-каталоги модели, поворот углами Source
- build_world: экземпляры prop_* моделей в общий меш мира (9 инстансов на
  gm_construct), кэш моделей и текстур
- 3D-скайбокс: выделение скайбокс-граней (AABB вокруг sky_camera, <30% карты),
  сжатие 1/scale вокруг камеры, отдельный пайплайн с глубиной у дальней
  плоскости; 2D-скайбокс рисуется только в незакрытых пикселях
- тесты: sky_mesh на gm_construct, пороги дисплейсментов обновлены
2026-10-12 02:42:12 +03:00
b8b5a4c328 engine/render: M3 v0 — рендер мира BSP со скайбоксом
- crates/engine: сборка мира (браши, displacement'ы, лайтмапы в вершинах,
  материалы через VMT/patch/include, кэш текстур, пропуск прозрачных материалов),
  загрузка скайбокса из skyname
- crates/render: wgpu-рендерер мира (VB/IB, батчи, глубина), скайбокс-куб,
  камера-полёт, capture PNG с учётом BGRA, debug-режимы материалов
- client: команда map (диск/VPK, pakfile карты, WASD+мышь, --pos/--angles/--screenshot)
- тесты: gm_construct/gm_flatgrass собираются, 0 заглушек, 41 324 треугольника
- docs: прогресс M3 и заметки (BGRA, pak-VMT, z=w клиппинг)
2026-10-12 00:06:26 +03:00