From 100f656b089898e4ffef48871f5ed5ea068d54b6 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Sun, 11 Oct 2026 17:37:48 +0400 Subject: Fix terrain height and native frame capture Use raw world-space terrain heights throughout mesh, camera-floor, shadow, and sun-ray paths while preserving the projection far-plane conversion. Complete the verified selected-camera readback flow with frozen phase sampling, capture tooling, and documentation. --- docs/tomes/05-render.md | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) (limited to 'docs/tomes') diff --git a/docs/tomes/05-render.md b/docs/tomes/05-render.md index 71cad1d..16dd94f 100644 --- a/docs/tomes/05-render.md +++ b/docs/tomes/05-render.md @@ -871,9 +871,12 @@ RVA `0x36610` строит `Rz(z) * Ry(y) * Rx(x)` с переносом в по Повороты и переносы узлов модели применяются до размещения объекта в миссии. Горизонтальная плоскость карты — XY, высота — Z. У GOG AutoDemo диапазон XY -ландшафта составляет `0..1190.6976`. Высоты, сохранённые в `Land.msh`, переводятся -в единицы мира делением на 32. Это отдельное преобразование ландшафта; -применять его к координатам размещённых объектов нельзя. +ландшафта составляет `0..1190.6976`, а исходный диапазон Z в `Land.msh` — +`0..94.50981`. Проверенный native frame с той же камерой совпадает с силуэтом +ландшафта при прямом использовании исходного Z; деление на 32 опускало бы этот +горизонт примерно на 185 пикселей. Terrain, camera floor, shadow receivers и +sun-ray queries поэтому используют исходные координаты `Land.msh` без +преобразования Z. `Ngi32!niGet3DRender` (RVA `0x5640`) возвращает графический интерфейс. Вызов Direct3D7 `SetTransform` устанавливает projection из RVA `0x7030` @@ -946,7 +949,23 @@ projected shadows и audio events обновляются вместе с кам `--atmosphere-seconds` задаёт старт времени, `--frames 0` оставляет цикл бесконечным, а `--preview-roots` служит только диагностическим ограничителем. `--legacy-camera-capture` выбирает воспроизводимую камеру без free-flight -управления. +управления: запись selector 0 задаёт D3D7 transform, clip параметры и native +viewport RECT `[left, top, right, bottom]`. Путь сохраняет оси basis из view +matrix вместе с roll, переносит полученный `clip_from_world` в preview camera, +переводит RECT в физический drawable размер `(right - left) × (bottom - top)` +и отклоняет несовпадение размера при +создании или resize вместо растягивания кадра. Результат нужно сравнивать с +тем же crop исходного PNG `[left, top, right, bottom]`. Контроллер +`FreeFlightCamera` в этом режиме не создаётся, но redraw продолжает обновлять +environment и projected shadows от captured camera. Перед environment update и +его audio events listener получает position, forward и up captured camera; +начальная сортировка world draw использует её же position. Phase capture может +содержать наблюдаемый mission path и проверенный `atmosphere_seconds`; viewer +использует эту абсолютную фазу по умолчанию, если не указан явный CLI override, +и удерживает sample атмосферы на ней через readback frames. FX по-прежнему +получает реальный frame time. Это не полное simulation time: `weather`, RNG и +остальное mission state остаются неизвестными, поэтому совпадение камеры и +фазы не доказывает visual parity с native frame. Для сохранения кадра surface должен поддерживать `TRANSFER_SRC`. Renderer копирует последний отправленный swapchain image в host-visible buffer и -- cgit v1.2.3