Pin the engine at 6a53a626c (API 30) and show render.camera-status: the calling run's set-views cameras, whether the last noted frame was a world frame, the request's world generation, each camera's reason and the run's own main-view selection. As the other lines, this is a host milestone: availability, request, preparation and why, not a GPU frame or a visible picture. A unit test pins the line: readiness stays per camera and apart from the run's main-view selection. docs/ENGINE.md, the 4 November continuation and the status table now say what prepared means (a picture encoded into the camera's target, or a world frame drawn from it as this run's screen view, only for the run whose selection the screen used), the per-run/per-world resets, and what remains: GPU acceptance. Verified: python3 tools/airdef.py check (gitlink, packer, mod needs 30, fork 30, game 30); test-wasm 27 steps; airdef-mod 65 unit, 1 boundary and 5 scenarios; python3 -m unittest discover -s tools 28 tests. Co-Authored-By: Kimi Code <noreply@moonshot.cn>
13 KiB
Продолжение 4 ноября: #115, #87, #91, #102, #96
Рабочая ветка kimi-work. Все issues оставлены открытыми. Работа выполнена Codex с GPT-6.1 Terra.
Движок опубликован в horizon-airdef:airdef, текущий pin
57f8b2853c4443f7e3ff5701600cbb262b53118f, API 29.
Изменения
- #115: authored-модели «Ланцета» и Х-101: сегментные стреловидные крылья,
детали носа/корпуса. Элементы 17→49 и 22→30 соответственно; игровые параметры не менялись.
5366988,cfae0c1,914f723. Кадры и ограничения.tools/model-previewвоспроизводит реальныйset-models,glow=false; установленный stone-template блок не подходит для оценки света динамической модели. Полосы яркости на наклонных сегментах вынесены в #123. - #87:
375fdf2,cb73cb7,0c870c1: типизированныйBatteryStatus, отчёт кэша мира и причины повреждений отделены от русского форматирования. Команда/карта/монитор используют адаптерыbattery_view,world_view,why_view. Порядок и тексты сохранены. Это постепенное разделение:CheckReason::Text, сообщенияOutи часть представления в ядре остаются. - #91:
eea1b36,1553976,daa9ed7:catalog/content.json— идентичности техники, предметы и метаданные иконок;catalog/sounds.json— звуковые события, дальности и far-варианты.gen_catalog.pyсоздаёт Rust-константы, Python-регистрации читают тот же источник; CI проверяет актуальность. Сохранены порядок позиционных сейвов, все 35 звуковых событий, OGG и порядок общего RNG синтезатора. ЧисловыеDroneSpec/SamSpecостаются типизированным источником в Rust; полного переноса всех характеристик в JSON не было. Продолжение переноса чисел — ниже. - #102:
63aefc7:test-budgetsвключает настоящий--fuel-profileи сохраняетmeasured_fuel.callbacks, включая ошибки. Отсутствие запрошенных счётчиков запрещает success. В движке6230ec703/d8fa77b00добавлены API28 point-lights-status и API29 sound-sources-status. Свет: заявка → cache → обработка main-view HD списка; звук: заявка → фактический apply source manager при live/offline output. Отдельные run/world/source epochs, clear/reload и отсутствие output проверены настоящими Wasmtime-гостями. Это не обещание пикселя/слышимости./airdef capabilitiesпоказывает оба состояния (c1a595b).57f8b2853также устраняет коллизию камер: texture targets, scheduler, HUD/canvas/corner и main-view адресуются(run_serial, local_id). Проверены два настоящих гостя с одинаковым ID, поиск target и scheduler, компиляция клиента.efe017ffb/278f356aaдобавляют API30camera-status:prepared— закодированный в target кадр камеры или кадр мира с её main-view, причём milestone получает только тот запуск, чей выбор экран реально использовал (чужой тот же local ID и чужая картинка его не готовят).enabled— последний отмеченный кадр был кадром мира, не заголовком. Пустаяset-viewsи смена мира очищают заявку/выбор/готовность, reload начинает заново; главный вид теряет picture target до нового кадра. Проверено настоящими Wasmtime-гостями; GPU-приёмка не выполнялась. - #96: engine
e44ad82a9: opt-inaudio::tests::export_moving_mass_raidпроводит 100 движущихся двигателей и 16 импульсных источников через настоящиеAudio::tick_acousticsиfilm_mix: эхо/реверб, камера, инвалидация и смена epoch, новый capture без старого хвоста. Два 6-секундных прогона дают одинаковые float-сэмплы; ненулевая дорожка, finite/peak и reset проверяются assertions. Сэмплы и геометрия синтетические, устройство звука не открывается. Release на Apple M5: step+mix на 50 мс аудио — p50 3.55 мс, p95 4.30 мс, max 5.57 мс. Отчёт и SHA дорожки. Это не замер полного игрового CPU/GPU, не Windows FPS и не готовый MP4.
Продолжение #91: один источник чисел
catalog/specs.json теперь единственная копия числовых строк симуляции: 13 дронов
(DroneKind::spec), 9 ракет (включая seeker, звук пуска и голос мотора), 15 комплексов
(SamKind::spec, включая части моделей и именованные наборы), общие константы гравитации,
высоты раскрытия «Орешника», приводов и логистики. tools/gen_catalog.py генерирует
airdef-mod/src/sim/specs_generated.rs и unit_specs_generated.rs; include! встраивает их в
mod.rs и units.rs, поэтому мод и airdef-core компилируют одни и те же строки. Прежние
match-литералы удалены; DroneKind::spec, MissileKind::spec, SamKind::spec и их производные
(RCS, seeker, звуки, голос) читают сгенерированные константы.
load_specs проверяет схему, звуковые ссылки, совпадение набора kinds с content.json, ссылки на
именованные части и то, что каждая строка кем-то используется; gen_catalog.py --check уже в
CI-шаге «Проверка generated assets», поэтому расхождение JSON и Rust валит сборку.
Сверка перед переносом: JSON сравнивался с литералами 632061d по всем полям. Голос P1-SUN —
тонкое место: фактически играет ранний возврат flame == 0 в старом voices.rs
((DRONE_LANCET, 0.8, 1.6)), а P1sun => 1.7 в match недостижим. Первая версия сверки ошибочно
приняла недостижимую ветку за факт и поставила в JSON 1.7 — это меняло звук перехватчика; fixup
вернул 1.6 и добавил регрессию missile_engine_voices_keep_their_played_values (P1-SUN и M48N6).
После генерации строки сверены с прежними литералами поле-в-поле (включая части моделей и
именованные refs) — расхождений нет. Порядок raid/save, ключи sam/дронов, RNG и тексты не менялись.
Проверки этого этапа: cargo test --release ядра — 194 passed, 7 ignored + 8 сценариев;
адаптер — 64 unit, 1 boundary, 5 сценариев; gen_catalog.py --check, gen_models.py --check,
тесты генераторов/звука/границ моделей; настоящий WASM test-wasm — 27 шагов, 1 скрипт.
GUI/MP4 и варианты комплексов (разные ракеты/профили по батареям) в этот этап не входили.
Проверки и продолжение
Объединённый core release: 193 unit, 7 ignored, 8 сценариев; адаптер: 64 unit,
1 boundary, 5 сценариев. Генераторы catalog/models, asset pipeline, sound references,
границы моделей и 6 тестов provenance/failure отчёта проверяются отдельно. Лёгкий WASM — 27 шагов.
Тяжёлый default fixture — 271 шаг с двумя принятыми налётами; его текущий отчёт пишет
python tools/airdef.py test-budgets в .horizon-cache/wasm-budget-report.json.
Чистый финальный прогон 56339b0 с API29 сохранён в
api29-wasm-budget.json: tick max 106132646/300000000,
command max 1013387/1000000000, ошибок 0, build identity совпал.
Не завершены: субъективное прослушивание, настоящий MP4 с акустикой, полный 10-минутный replay/export, расширенная модельная/ночная/FPS приёмка, GPU-приёмка camera-ready картинки и полные query/voice/peak-memory бюджеты. Старый допуск broadband RT60 35% не ужесточался до 15%. Попытка живого MP4 в этом проходе не дала проверенного файла и за приёмку не считается; изолированные процессы закрыты. Продолжать с текущего pin, не с временных пакетов агентов.
Обновление Windows прежнее: git switch kimi-work, git pull --ff-only,
python tools/airdef.py all, python tools/airdef.py play.
Обновление #89 (4 ноября, после этого прохода)
Живой короткий MP4 получен и проверен на pin 57f8b2853 (API 29) на scratch HORIZON_HOME/мире:
h264 + AAC, отчёт мода совпадает с ffprobe nb_frames, отмена/ошибка SDK/ошибка энкодера/повторный
запуск проходят. Найден и исправлен дефект: выход в заголовок во время экспорта оставлял захват
записывать заголовок (запрос sec=10 дал 3898 кадров); теперь показ завершается по кадровому хуку.
Подробности и проверенные ограничения — HD-RENDERER (раздел про кинорежиссёра)
и ENGINE (раздел про захват). Очистка временных файлов при ошибке энкодера
исправлена в движке 73b9d3070: лог удаляется, его последние строки входят в текст ошибки, а
готовый MP4 прежнего экспорта с тем же именем сохраняется. Акустика проверена отдельно в настоящем
MP4 (пары on/off одного повтора, статусы ready, диффузный wet-остаток в каменном дворе); чистый
хвост/RT60 и прослушивание остаются — ACOUSTICS. 10-минутный экспорт и Windows/Linux
по-прежнему не проверены.
Обновление #123
Engine 45b43f00d: dynamic block models используют геометрическую нормаль квада вместо осевого
facing; для вырожденных вершин сохранён прежний fallback. Unit-тест покрывает ±45°, другие
наклоны, осевые и вырожденные квады. На реальном Lancet-инстансе через set-models, glow=false
и HD получены парные кадры до/после в одном мире и ракурсе, а также вид сверху и ночью; полосы
осевого освещения устранены. Кадры и ограничения. Массовый FPS и полёт не
измерялись.