Fix terrain height and native frame capture
Docs Deploy / Build and Deploy MkDocs (push) Successful in 40s

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.
This commit is contained in:
2026-10-11 17:37:48 +04:00
parent 7b7324a413
commit 100f656b08
9 changed files with 5409 additions and 196 deletions
+23 -4
View File
@@ -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 и