aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-07-04 00:54:25 +0300
committerValentin Popov <valentin@popov.link>2026-07-04 00:54:25 +0300
commitff7993223fa4d5264ec0e8d4ac9938fa3ec34a9d (patch)
tree56a19429889969fc4bdbd09d4fac5f3618ebe785
parent08550849c7f293f3c49abb0ba5c47c65b68bee0d (diff)
downloadfparkan-ff7993223fa4d5264ec0e8d4ac9938fa3ec34a9d.tar.xz
fparkan-ff7993223fa4d5264ec0e8d4ac9938fa3ec34a9d.zip
docs: align renderer and evidence statusdevel
-rw-r--r--README.md12
-rw-r--r--docs/evidence/original_engine_hashes.md56
-rw-r--r--docs/evidence/stage4_capture_schema.md107
-rw-r--r--docs/rendering/renderer_truth_table.md39
-rw-r--r--docs/tomes/07-implementation.md14
-rw-r--r--docs/tomes/08-evidence.md7
-rw-r--r--mkdocs.yml3
7 files changed, 237 insertions, 1 deletions
diff --git a/README.md b/README.md
index 4bf8627..5a8eccc 100644
--- a/README.md
+++ b/README.md
@@ -24,7 +24,17 @@ Open source проект с реализацией компонентов игр
- [crates/fparkan-rsli](crates/fparkan-rsli) — чтение, lookup и lossless roundtrip архивов RsLi.
- [crates/fparkan-msh](crates/fparkan-msh) — validated static MSH geometry.
- [crates/fparkan-runtime](crates/fparkan-runtime) — transactional mission loading и headless runtime foundation.
-- [apps/fparkan-cli](apps/fparkan-cli), [apps/fparkan-viewer](apps/fparkan-viewer), [apps/fparkan-headless](apps/fparkan-headless), [apps/fparkan-game](apps/fparkan-game) — composition roots.
+- [apps/fparkan-cli](apps/fparkan-cli) — CLI для архивов, графов и acceptance-отчетов.
+- [apps/fparkan-viewer](apps/fparkan-viewer) — inspection-only CLI для archive/model/texture/map без live Vulkan draw path.
+- [apps/fparkan-headless](apps/fparkan-headless) — headless runtime composition root.
+- [apps/fparkan-game](apps/fparkan-game) — render-planning composition root; сейчас выдает planning report, а не живой отрисованный кадр.
+
+## Текущий статус рендера
+
+- `fparkan-vulkan-smoke` доказывает живой Stage 0 Vulkan triangle path с native window, swapchain и validation telemetry.
+- `VulkanPlanningBackend` и `fparkan-game` подтверждают только deterministic command planning/capture, а не draw пикселей.
+- `fparkan-viewer` пока является инспектором ассетов. Stage 3 GPU vertical slice для оригинального `MSH`/`Texm`/`WEAR`/`MAT0`/terrain еще не закрыт.
+- Truth table и evidence-артефакты вынесены в [`docs/rendering/renderer_truth_table.md`](docs/rendering/renderer_truth_table.md) и [`docs/evidence/`](docs/evidence).
## Тестирование
diff --git a/docs/evidence/original_engine_hashes.md b/docs/evidence/original_engine_hashes.md
new file mode 100644
index 0000000..938aa54
--- /dev/null
+++ b/docs/evidence/original_engine_hashes.md
@@ -0,0 +1,56 @@
+# Original Engine Hashes
+
+Страница фиксирует минимальный статический baseline, на который должны
+ссылаться capture fixtures и Stage 4 evidence.
+
+## Scope
+
+- Источник: локальная статическая сверка Part 1 (`IS`) и Part 2 (`IS2`).
+- Метод: SHA-256, export/import tables, `objdump -p`, `strings`.
+- Эта страница не заменяет динамические traces: она задаёт only-if-match
+ binary baseline для дальнейших runtime captures.
+
+## Stable binaries across Part 1 / Part 2
+
+| Binary | SHA-256 | Size | Notes |
+| --- | --- | ---: | --- |
+| `Ngi32.dll` | `bab9840d94f4e4e74ffc26677724fa896cf4823845504d09a9e025f80016edf5` | 253952 | Shared low-level render/resource/audio boundary |
+| `World3D.dll` | `17e4a3089b2583a8cf2356c9db0390b1aba138356a09130d79b4e7e4791da61e` | 208896 | Shared gameplay/world/render lifecycle baseline |
+| `Terrain.dll` | `6d3e68f0e15b297f6c184af3113baf1f31e19c3326c18f0150dec659242ed667` | 708608 | Shared terrain/shade/world baseline |
+| `iron_3d.exe` / `iron_3d_p2.exe` | `f476af85c034a4b4f34f49d0806e4dff397b5da0ee26d382a7674231144979f7` | 36864 | Shared launcher binary |
+
+## Divergent binaries across Part 1 / Part 2
+
+Эти модули нельзя автоматически считать behavior-compatible между частями:
+
+- `AniMesh.dll`
+- `Effect.dll`
+- `iron3d.dll`
+- `services.dll`
+- `Control.dll`
+- `ArealMap.dll`
+
+## Practical use
+
+1. Frame-order traces для `World3D.dll`, `Terrain.dll` и `Ngi32.dll` можно
+ привязывать к shared profile, пока hash совпадает.
+2. Animation and FX captures обязаны храниться раздельно для Part 1 и Part 2,
+ потому что `AniMesh.dll` и `Effect.dll` отличаются.
+3. Любой runtime fixture должен записывать минимум:
+ - `game_part`
+ - `module_name`
+ - `module_sha256`
+ - `mission`
+ - `frame_or_tick`
+ - `schema_version`
+
+## Export / import focus for Stage 4
+
+- `World3D.dll`: `stdCalculateGame`, `stdRenderGame`, `sendEndOfRender`
+- `Terrain.dll`: `GetShade`, `GetWorld`, `stdSetCurrentCamera2`
+- `AniMesh.dll`: `LoadAgent`, `LoadAniMesh`
+- `Effect.dll`: `CreateFxManager`, `InitializeSettings`
+- `Ngi32.dll`: `niGet3DRender`, `n3dPrimitive`, `n3dEndScene`, `rsLoadTexture`, `rsLoadMultiTexture`
+
+Если будущий capture fixture не указывает, к какому hash он относится, такой
+fixture нельзя считать acceptance evidence.
diff --git a/docs/evidence/stage4_capture_schema.md b/docs/evidence/stage4_capture_schema.md
new file mode 100644
index 0000000..18efd91
--- /dev/null
+++ b/docs/evidence/stage4_capture_schema.md
@@ -0,0 +1,107 @@
+# Stage 4 Capture Schema
+
+Stage 4 нельзя закрывать набором ad-hoc логов. Нужна схема, по которой
+animation, FX и rendered frame captures сравниваются между Part 1, Part 2 и
+современной реализацией.
+
+## Goals
+
+- сделать captures пригодными для автоматического diff;
+- не хранить host-specific пути, временные каталоги и нестабильные handles;
+- связывать frame traces, command captures и pixel artifacts общим identity.
+
+## Common envelope
+
+```json
+{
+ "schema_version": "fparkan-stage4-capture-v1",
+ "capture_kind": "frame-trace | animation-pose | fx-lifecycle | render-frame",
+ "game_part": "part1 | part2",
+ "mission": "MISSIONS/.../data.tma",
+ "frame_id": 123,
+ "tick": 123,
+ "module_hashes": {
+ "World3D.dll": "sha256...",
+ "Terrain.dll": "sha256...",
+ "AniMesh.dll": "sha256...",
+ "Effect.dll": "sha256..."
+ },
+ "tool_version": "codex/manual/fixture version",
+ "notes": []
+}
+```
+
+## Capture kinds
+
+### `frame-trace`
+
+Используется для порядка фаз и внешних вызовов.
+
+Required fields:
+
+- `events`: ordered list of `{ phase, symbol, sequence, object_id?, fx_id?, camera_id? }`
+- `queue_counters`: deferred operations, visible objects, emitted FX, UI callbacks
+- `rng_state`: optional, if recoverable
+
+### `animation-pose`
+
+Используется для x87 / portable sampler parity.
+
+Required fields:
+
+- `clip_id`
+- `node_index`
+- `sample_time`
+- `numeric_profile`
+- `translation`
+- `rotation_quat`
+- `scale`
+- `matrix_hash`
+
+### `fx-lifecycle`
+
+Используется для create/update/emit/stop parity.
+
+Required fields:
+
+- `fx_id`
+- `instance_id`
+- `time`
+- `opcode_events`
+- `rng_calls`
+- `resource_refs`
+- `emissions`
+
+### `render-frame`
+
+Связывает backend-neutral snapshot с live Vulkan output.
+
+Required fields:
+
+- `camera`
+- `visible_object_ids`
+- `draws`
+- `pipeline_keys`
+- `resource_ids`
+- `validation`
+- `pixel_artifact`
+
+## Stability rules
+
+1. Не записывать абсолютные host paths.
+2. Не записывать raw pointer addresses как identity fields.
+3. `frame_id` должен совпадать между trace, command capture и pixel artifact.
+4. GPU-specific transient handles допустимы только внутри diagnostics fields и
+ не участвуют в canonical equality.
+5. Любой capture without `module_hashes` считается informational, а не
+ acceptance-grade.
+
+## Acceptance mapping
+
+- `S4-TRACE-*` rows читают `frame-trace`
+- `S4-ANIM-*` rows читают `animation-pose`
+- `S4-FX-*` rows читают `fx-lifecycle`
+- `S4-VK-*` и `S4-PIXEL-*` rows читают `render-frame`
+
+Эта схема intentionally минимальна. Новые поля можно добавлять, но нельзя
+ломать перечисленные identity and parity anchors без смены `schema_version`.
diff --git a/docs/rendering/renderer_truth_table.md b/docs/rendering/renderer_truth_table.md
new file mode 100644
index 0000000..6969a81
--- /dev/null
+++ b/docs/rendering/renderer_truth_table.md
@@ -0,0 +1,39 @@
+# Renderer Truth Table
+
+Эта страница нужна для одной вещи: не позволять путям smoke, planning и capture
+выглядеть как «почти готовый renderer». Каждый путь доказывает разный класс
+свойств, и acceptance не должен смешивать их.
+
+## Краткая матрица
+
+| Path | Native window / swapchain | Draws pixels | Uses original assets | Acceptance class | Что доказывает | Чего не доказывает |
+| --- | --- | --- | --- | --- | --- | --- |
+| `fparkan-vulkan-smoke` / `VulkanSmokeRenderer` | Yes | Yes | No | `covered-gpu` for Stage 0 smoke-only IDs | Loader, instance, surface, swapchain, submit/present, validation-clean triangle path | Model upload, texture sampling, descriptors, terrain, gameplay rendering |
+| `VulkanPlanningBackend` | No | No | Optional CPU-side IDs only | `covered-planning` | Deterministic command validation, canonical capture, frame submission planning | Любой live GPU draw, pixel parity, validation-clean asset frame |
+| `RecordingBackend` | No | No | Optional CPU-side IDs only | `covered-planning` | Stable command capture for backend-neutral tests | Native window, Vulkan, GPU resource lifetime, pixels |
+| `NullBackend` | No | No | Optional CPU-side IDs only | Usually `covered` for validation-only rows | Command stream framing and bounds validation | Capture stability, GPU execution, pixels |
+| `VulkanAssetRenderer` | Yes | Yes | Yes | `covered-gpu` | Static original asset rendering: MSH/Texm/WEAR/MAT0/terrain through Vulkan | Animation/FX parity unless explicitly wired |
+| Future rendered `fparkan-game` mode | Yes | Yes | Yes | `covered-gpu` plus original-evidence IDs | Mission-driven render snapshot execution and pixel capture | Original-runtime parity for animation/FX/x87 without dedicated captures |
+
+## Rules
+
+1. IDs со смыслом `VK`, `GPU`, `DRAW`, `PIXEL`, `VALIDATION` или `RENDERED`
+ на Stage 3+ не могут закрываться через `NullBackend`, `RecordingBackend`
+ или `VulkanPlanningBackend`.
+2. `covered-planning` означает command planning/capture evidence. Этот статус
+ никогда не считается доказательством draw пикселей.
+3. `covered-stub` зарезервирован для явно помеченных `STUB` acceptance rows и
+ не считается compatibility closure для FX lifecycle.
+4. `covered-gpu` требует live native handles, реальный draw path и связанный
+ renderer artifact: report, capture или approved pixel.
+
+## Current repository status
+
+- Реальный Vulkan в репозитории есть, но только как smoke triangle path.
+- `apps/fparkan-game` сейчас выдает `render-planning` JSON report поверх
+ synthetic window descriptor и `VulkanPlanningBackend`.
+- `apps/fparkan-viewer` сейчас inspection-only CLI и не открывает live Vulkan
+ asset viewer.
+- Следующий реальный milestone для rendered acceptance: `VulkanAssetRenderer`
+ с upload/draw/capture path для хотя бы одной оригинальной модели и одного
+ terrain slice.
diff --git a/docs/tomes/07-implementation.md b/docs/tomes/07-implementation.md
index 49c21e4..6c6f610 100644
--- a/docs/tomes/07-implementation.md
+++ b/docs/tomes/07-implementation.md
@@ -219,6 +219,13 @@ graph.
текстурированную статическую модель из исходного архива. Красивый viewer всё ещё
означает только asset compatibility, а не готовую игру.
+Текущее состояние репозитория нужно формулировать строже. `apps/fparkan-viewer`
+сейчас является inspection CLI и synthetic command producer, а не live Vulkan
+asset viewer. Реальный Vulkan в репозитории сегодня доказан только через
+Stage 0 smoke triangle path; Stage 3 GPU vertical slice для оригинального
+`MSH` + `Texm` + `WEAR/MAT0` + terrain остаётся блокером. Для различения
+smoke, planning и live GPU путей используйте [таблицу правды renderer paths](../rendering/renderer_truth_table.md).
+
### Этап 4. Анимация и эффекты
- реализовать MSH type 8/type 19 sampling и hierarchy;
@@ -232,6 +239,13 @@ graph.
923/1 065 FXID создаются без parser errors; перезапуск одинакового effect seed
даёт идентичный список emitted primitives.
+Текущее состояние репозитория опять же уже, чем целевой этап. В коде есть
+portable reference sampler и детерминированный FX reference stub, но нет
+runtime-captured parity для lifecycle/opcode semantics и нет Stage 4 rendered
+acceptance поверх live Vulkan asset renderer. Поэтому rendered Stage 4 следует
+считать заблокированным входным gate Stage 3, а parallel Stage 4 work вести
+через captures, schemas и backend-neutral snapshots.
+
### Этап 5. Карта и мир
- реализовать `Land.msh` и corrected `TerrainFace28` layout;
diff --git a/docs/tomes/08-evidence.md b/docs/tomes/08-evidence.md
index fab5805..3eabd71 100644
--- a/docs/tomes/08-evidence.md
+++ b/docs/tomes/08-evidence.md
@@ -215,6 +215,13 @@ RVA используются только для сопоставления и
implementation не должна встраивать их как постоянные игровые идентификаторы.
Таблица внутренних RVA хранится по SHA-256 конкретного модуля.
+Операционные evidence-артефакты, которые должны оставаться синхронизированными
+с кодом и acceptance, вынесены в отдельные страницы:
+
+- [Hashes и import/export summary оригинального движка](../evidence/original_engine_hashes.md)
+- [Stage 4 capture schema](../evidence/stage4_capture_schema.md)
+- [Renderer truth table](../rendering/renderer_truth_table.md)
+
Подтверждённые hashes неизменённых DLL:
```text
diff --git a/mkdocs.yml b/mkdocs.yml
index 0f2fa41..1357ca4 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -73,6 +73,9 @@ nav:
- WEAR и MAT0: reference/materials.md
- Texm: reference/texm.md
- Render frame: reference/render-frame.md
+ - Renderer Truth Table: rendering/renderer_truth_table.md
+ - Original Engine Hashes: evidence/original_engine_hashes.md
+ - Stage 4 Capture Schema: evidence/stage4_capture_schema.md
- Приложения:
- Глоссарий: appendices/glossary.md
- Границы знания: appendices/knowledge-boundaries.md