Коммит 8928c4da создал по автору Nikitos's avatar Nikitos
Просмотр файлов

§11: закрываю оставшиеся враки в доке и расширяю стража

§12.16 требовал «сначала §11.1–11.2 — они активно врут». Шесть системных враний
были закрыты раньше, но таблица §6.1/6.2 перечисляла места, которые страж
(doc_claims_test.py) НЕ проверял — и они всё ещё врали. Нашёл четыре:

1. HIGH_LEVEL_API_PERF.md перечислял как «настоящие дыры» пользовательские
   шейдеры, слои коллизий, фигурный свип, Curve/Gradient, сеть, скелет и render
   target — ВСЁ это реализовано (проверено по коду: defineShader, layerBits,
   castShape, loadCurve/loadGradient, net.js, $.mesh/.zone, viewport);
2. там же: «слои коллизий — .mask()/.layerBits() — пустышки» и «фигурный
   свип/CastShape — в биндингах нет» — неверно;
3. VFX_PLAN.md: «viewport.js перестаёт быть заглушкой» — уже не заглушка;
4. render.md: «заглушка engine.viewport» в описании src/render.c.

Список «осталось незакрытым» переписан ЧЕСТНО и проверен по коду: в нём теперь
только то, чего действительно нет — IK, z_as_relative и наследование
visible/modulate родителем, приоритеты и stealing голосов, seek у звука. Это
удобства, а не блокеры.

СТРАЖ РАСШИРЕН с 10 утверждений до 18: добавлены проверки на слои коллизий,
фигурный свип, Curve/Gradient (две формулировки), мипмапы, обрезку, зоны тела и
«viewport не заглушка». Именно поэтому враки и жили: страж их не знал.

Заодно убрана устаревшая строка в §12.15 («Осталось из §2: формы на тело» —
формы сделаны) и §12.16 отмечен сделанным.

Полный qjs, агентские тесты, doc_claims (28 проверок), doc_coverage,
duplicate_keys, быстрый набор — зелёные.
владелец d16306fe
......@@ -63,10 +63,13 @@ python3 tools/bench_highlevel.py --only churn,batch --ns 5000 --repeat 3 # ц
размера API покрыт хорошо. Из **168** уникальных биндингов `engine.*` обёрнуто
**138 (82 %)**; не обёрнуто 30, но по-настоящему нужен игре из них **один** —
`engine.keyName` (без него `$.input.on('key')` отдаёт код числом). Остальное —
геттеры состояния звука/физики, BSP, легаси-отрисовка и заглушки render target.
Настоящие дыры как игрового API (не как «необёрнутый биндинг»): пользовательские
шейдеры, слои коллизий, фигурный свип, `Curve`/`Gradient`, сеть, скелет/IK,
render target. Отдельно — **три мёртвых куска и врущие доки** (см. §4.4).
геттеры состояния звука/физики, BSP и легаси-отрисовка.
**Настоящих дыр в игровом API больше нет** — то, что перечислялось здесь раньше,
закрыто (проверено по коду, см. §4.4): пользовательские шейдеры, слои коллизий,
фигурный свип (`engine.castShape`), `Curve`/`Gradient` как ресурсы, сеть,
скелет (`.zone()` и `$.mesh`), render target, мипмапы, обрезка (scissor).
Отдельно — **мёртвый код и врущие доки** (см. §4.4).
**Что делать.** Восемь правок уровня «несколько строк» снимают ≈85 % цены кадра:
`worldEvents` → поля узла вместо `Map`; fast-path `#id` и компиляция селектора в
......@@ -899,24 +902,31 @@ parallax, UI-контролы (контейнеры, скролл, фокус,
слайдеры, списки, диалоги), локализация, состояния/потоки, экраны, шрифты,
сохранения, CSV/сетки, сигналы. Это 30+ подсистем и около 30 тыс. строк.
**Осталось незакрытым:**
* **пользовательские шейдеры** — **закрыто**: `$.gfx.defineShader(name, { frag })`
компилирует фрагментный шейдер в рантайме, `.shader(name)`/`.shaderParam()`
работают (при `R2D_ENABLE_LIVE_SHADERS=ON`);
* **слои коллизий** — `.mask()/.layerBits()/.collidesWith()` пустышки
(`api.js:806-808`); в `GAP_ANALYSIS.md` §2 при этом написано «layerBits/mask
есть у тел» — неверно;
* **фигурный свип/CastShape** — в биндингах нет (есть только луч и точечный
запрос);
* **`Curve`/`Gradient` как ресурсы** — рампы зашиты внутри `particles.js:226-228`;
* **скелет/IK**, **NinePatchRect и импорт атласа**,
`z_as_relative` и наследование `visible`/`modulate` родителем, приоритеты и
stealing голосов, `seek` у звука.
Для «2D-игры среднего размера» вердикт: **покрытие достаточное**, но
перечисленное выше — это ровно те пункты, которые всплывают на второй-третьей
неделе разработки (слои коллизий и шейдеры — первыми).
**Закрыто с этого аудита** (проверено по коду, а не по доке):
* **пользовательские шейдеры** — `$.gfx.defineShader(name, { frag })` компилирует
фрагментный шейдер в рантайме, `.shader(name)`/`.shaderParam()` работают
(при `R2D_ENABLE_LIVE_SHADERS=ON`);
* **слои коллизий** — `.mask()/.layerBits()/.collidesWith()` работают;
* **фигурный свип/CastShape** — `engine.castShape` и `$.world.castShape` есть;
* **`Curve`/`Gradient` как ресурсы** — виды `curve` и `gradient` в `$.resource`
(resource.md §1.1);
* **скелет** — `$.mesh` (кости, веса, UV) и зоны тела `.zone()`;
* **импорт атласа** — `$.atlas`, включая слайсы Aseprite с пивотами;
* **NinePatchRect** — nine-slice у узла;
* **render target** — `$.viewport` (render.md §3);
* **мипмапы и обрезка** — `engine.loadTexture(..., { mipmaps: true })`,
`$.gfx.clip` / `.clip()`.
**Осталось незакрытым** (проверено: в коде этого нет):
* **IK** — обратной кинематики нет;
* **`z_as_relative`** и **наследование `visible`/`modulate`** родителем;
* **приоритеты и stealing голосов** у звука;
* **`seek`** у звука (перемотка внутри проигрываемого звука).
Для «2D-игры среднего размера» вердикт: **покрытие достаточное**; перечисленное
выше — удобства, а не блокеры.
### 4.4. Врущие доки и мёртвый код
......
......@@ -736,7 +736,14 @@ API (по числу упоминаний `Node`/`Resource`/`Vector2`/`signal`/`
| «сетевая игра — не мультиплеер» | [GAP_ANALYSIS.md](GAP_ANALYSIS.md), [net.md](highlevel/net.md) |
| «нет фигурного свипа» | [GAP_ANALYSIS.md](GAP_ANALYSIS.md) |
Ниже — что ещё оставалось неверным на момент аудита (часть уже закрыта выше).
**Второй проход (§12.16).** Проверены не только «шесть системных», но и вся
таблица §6.1/6.2: цитаты исправлены, а четыре места, где доки продолжали врать,
поправлены в этом проходе — `HIGH_LEVEL_API_PERF.md` (список «настоящих дыр»,
«слои коллизий — пустышки», «фигурный свип в биндингах нет»), `VFX_PLAN.md`
(`viewport.js` больше не заглушка) и `render.md` (`engine.viewport`).
Страж `tests/doc_claims_test.py` расширен с 10 до 18 утверждений.
Ниже — что ещё оставалось неверным на момент первого аудита (закрыто выше).
### 6.1. Описано как заглушка, а реализовано (v0.1.10–0.1.13)
......@@ -908,11 +915,23 @@ bootstrap, index, script).
состояние, которое плавно догоняет симуляционное, поэтому коррекции не дёргают
картинку; `visualError()` для отладки, `resetVisual()` для смены сцены.
Чистая часть — `smoothState` (tests/js/net_test.mjs, 40 проверок),
в движке — tests/agent/net_smooth_test.py. Осталось из §2: формы на тело (§1.3).
в движке — tests/agent/net_smooth_test.py. Формы на тело (§1.3) тоже
сделаны — зоны `.zone()`.
Только авторитарная модель: сервер считает, клиент рисует подтверждённое.
Катсцены при этом серверные: хост проигрывает и рассылает как авторитет.
16. **Документация (§11):** сначала §11.1–11.2 — они активно врут, потом страницы
модулей (§11.4).
16. **Документация (§11): СДЕЛАНО.** Шесть системных враний закрыты раньше, и на
них стоит страж `tests/doc_claims_test.py`. Аудит §12.16 нашёл ещё четыре,
которые страж НЕ ловил (он их не знал), и они исправлены:
`HIGH_LEVEL_API_PERF.md` перечислял как «настоящие дыры» шейдеры, слои
коллизий, фигурный свип, `Curve`/`Gradient`, сеть, скелет и render target —
всё это реализовано; там же «слои коллизий — пустышки» и «фигурный свип в
биндингах нет»; `VFX_PLAN.md` писал, что `viewport.js` «перестаёт быть
заглушкой» (уже не заглушка); `render.md` называл `engine.viewport`
заглушкой. Страж расширен восемью проверками, чтобы это не вернулось.
Осталось незакрытым из §11 (проверено по коду): IK, `z_as_relative` и
наследование `visible`/`modulate`, приоритеты и stealing голосов, `seek`
у звука — это удобства, а не блокеры; они перечислены в
`HIGH_LEVEL_API_PERF.md` §4.3.
**Правило на будущее:** каждый закрытый пункт этого файла должен в том же
коммите исчезать из документации — именно рассинхрон доков и кода породил
......
......@@ -78,10 +78,11 @@ Tier 1 частично сделан: offscreen-проход и пост-обр
## 3. Tier 1 — render target и пост-обработка
Требуется перестроить [render.c](../src/render.c) и точку открытия прохода в
`main.c`: сцена рисуется в offscreen-текстуру, затем один-два полноэкранных
прохода. После этого [viewport.js](../src/highlevel/viewport.js) перестаёт быть
заглушкой (дизайн уже описан в `docs/highlevel/render.md`).
Перестройка [render.c](../src/render.c) и точки открытия прохода в `main.c`
**сделана**: сцена рисуется в offscreen-текстуру, затем полноэкранные проходы, а
[viewport.js](../src/highlevel/viewport.js) больше не заглушка (см.
`docs/highlevel/render.md` §3–4). Ниже — что это открыло и что из этого уже
использовано (`$.gfx.post` с bloom и искажениями).
Что открывается:
......
......@@ -715,6 +715,6 @@ $('#panel').clip(false); // снять
| Файл | Что там |
|---|---|
| `src/render.h` | `R2DBlendMode`, `pipelines[]`, поля `blend` у команд и диапазонов треугольников |
| `src/render.c` | конвейеры по режимам, `blend_state`, переключение в `r2d_render_draw`, биндинги `submitSprites`/`submitTriangles`, заглушка `engine.viewport` |
| `src/render.c` | конвейеры по режимам, `blend_state`, переключение в `r2d_render_draw`, биндинги `submitSprites`/`submitTriangles`, обрезка (scissor) и `engine.viewport` |
| `src/highlevel/viewport.js` | `$.blend`, `$.viewport`, чистые хелперы `normalizeBlend`/`nodeBlendMode`/`resolveBlend`/`blendRuns` |
| `tests/fixtures/render/` | фикстура агентского теста |
......@@ -76,6 +76,31 @@ CLAIMS = [
("фигурный свип",
"src/script.c", r"castShape",
"docs/GAP_ANALYSIS.md", r"нет фигурного свипа"),
# --- добавлено после аудита §12.16: эти враки страж не ловил ---
("слои коллизий в PERF",
"src/highlevel/world.js", r"layerBits",
"docs/HIGH_LEVEL_API_PERF.md", r"слои коллизий.*пустышк"),
("фигурный свип в PERF",
"src/script.c", r"castShape",
"docs/HIGH_LEVEL_API_PERF.md", r"фигурный свип/CastShape.*в биндингах нет"),
("Curve/Gradient как ресурсы",
"src/highlevel/resource.js", r"loadGradient",
"docs/HIGH_LEVEL_API_PERF.md", r"Curve.*Gradient.*рампы зашиты"),
("Curve/Gradient в списке дыр",
"src/highlevel/resource.js", r"loadCurve",
"docs/HIGH_LEVEL_API_PERF.md", r"Настоящие дыры[^\n]*Curve"),
("мипмапы",
"src/render.c", r"SDL_GenerateMipmapsForGPUTexture",
"docs/API.md", r"мипмап[^\n]*не поддержан"),
("обрезка (scissor)",
"src/render.c", r"SDL_SetGPUScissor",
"docs/highlevel/render.md", r"scissor/clip нет|обрезка[^\n]*не сделана"),
("зоны тела",
"src/physics.c", r"r2d_physics_add_shape",
"docs/highlevel/world.md", r"форм[^\n]*не сделаны|недостижимо"),
("viewport не заглушка",
"src/render.c", r"r2d_render_viewport_target",
"docs/VFX_PLAN.md", r"viewport\.js[^\n]*перестаёт быть\s+заглушкой"),
]
NO_CALLS = [
......
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать