Files
Learn_System/plans/lab-content-engine/CONTEXT.md
T
Maxim Dolgolyov 410eb8a862 fix(biochem 3D): корректная глубина + объёмные связи-цилиндры
Два дефекта, из-за которых 3D читался как плоская диаграмма:
- painter-сортировка была по возрастанию z (ближние первыми) — дальние
  атомы рисовались поверх ближних. Теперь единый список примитивов
  (атомы + половинки связей) сортируется по убыванию z (дальние первыми).
- связи были тонкими плоскими линиями. Теперь — затенённые «цилиндры»:
  толстый штрих с поперечным градиентом (центр светлее, края темнее),
  двухцветные (каждая половина под цвет своего атома) — фирменный вид
  ball-and-stick. Ширина зависит от перспективы (ближе — толще).
- усилена перспектива (fov 900→700), добавлен тёмный ободок сфер для объёма.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 12:58:39 +03:00

62 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Feature Context: Контент-движок лаборатории
## Current State
- Лаборатория работает на захардкоженной регистрации (см. PLAN.md Summary).
- Ветка `feature/lab-content-engine` создана от `master`.
## Architecture map (как было ДО рефактора)
- `frontend/lab.html` — sim-тела `<div id="sim-xxx">` (inline HTML, ~3000 строк) + 58 `<script>` тегов (4800-4861) + three.js.
- `frontend/js/labs/lab-glue.js`:
- `_catFilter`, `_disabledSimIds`, `_simModuleDisabled` (вкл/выкл из админки)
- `filterSims()`, `renderSims()` (карточки каталога)
- preview-хелперы `_grid/_axes/_svg` + ~60 констант `P_*`
- массив `SIMS` (821-866), `window.SIMS`/`window.LAB_SIMS`
- `frontend/js/labs/lab-init.js`:
- объявления переменных симуляций (gSim, pSim, …)
- `ALL_SIM_BODIES` / `ALL_CTRL_BARS` (33-48)
- `_pauseAllSims()` (54-91), `openSim(id)` if-цепочка (93-160), `closeSim()` (212-258)
- `_simShow()`, `_addTouchSupport()` (touch-bridge + ResizeObserver)
- объект `THEORY` + `loadTheory()` + `_theoryToggle()`
- функции `_openXxx()` (603-756) — единый шаблон: `_simShow('sim-xxx')` + ленивое `new XxxSim(...)` + показ `ctrl-xxx`
- `frontend/js/admin/sections/sims.js` — админ-секция (пока только вкл/выкл, `_disabledSimIds`).
## Загрузочный порядок (КРИТИЧНО)
В lab.html: движки `_fx_*`, `_phys_visuals`, `_graph_panel`, `_chem_visuals` грузятся ПЕРЕД симуляциями.
`lab-init.js` (4826) грузится ПЕРЕД `lab-glue.js` (4827). `renderSims()` вызывается в конце lab-glue.
Некоторые sim-файлы (graph.js) грузятся РАНЬШЕ lab-glue.js → preview `P_*` ещё не определены на момент исполнения их тел.
=> В манифестах `preview` поддерживает функцию (ленивое вычисление в renderSims), не только строку.
## Контракт LabRegistry (Фаза 0)
```
LabRegistry.register(manifest) // manifest.id уникален; повторная регистрация перезаписывает
LabRegistry.get(id) // по base-id (без ':arg')
LabRegistry.has(id)
LabRegistry.all() // в порядке регистрации
LabRegistry.setActive(sim) / stopActive() / destroyActive() // менеджер жизненного цикла
```
manifest: `{ id, cat, title, desc, preview(string|fn), theory?, bodyId?, mount?(host), open(ctx), stop?(), destroy?(), subject?, grade?, topics? }`
## Адаптер (Фаза 0): реестр в приоритете, иначе legacy
- `renderSims()` — порядок берём из исходного `SIMS`; для id, который есть в реестре, используем манифест (resolve preview), иначе legacy-запись; в конце добавляем registry-only записи, которых нет в SIMS.
- `openSim(id)``base = id.split(':')[0]`; если `LabRegistry.has(base)``stopActive()`; `get(base).open({arg})`; `setActive`; иначе старый if-путь.
- `loadTheory(id)` — если `get(base).theory` есть → рендерим из него; иначе `THEORY[base]`.
- `closeSim()`/`_pauseAllSims()` — дополнительно `LabRegistry.stopActive()` / `destroyActive()`.
## Temporary Workarounds
- (пока нет)
## Cross-Phase Dependencies
- Фаза 1 опирается на ядро реестра из Фазы 0.
- Фаза 3 (ленивая загрузка) опирается на манифесты с зависимостями движков (Фаза 1/2).
- Фаза 4 (БД) мёржит код-манифесты Фазы 1 с оверрайдами.
- Фаза 5 использует поля subject/grade/topics из манифестов.
## Deep-links (сохранить!)
`openSim('stereo:figure')`, `?stereofig=`, обратная совместимость `magnetic/coulomb→emfield`, `thinlens/mirrors/refraction→opticsbench`.
## Проектные правила (НЕ нарушать)
- Иконки: только inline SVG `.ic`, НЕ эмоджи.
- Поиск по коду: ast-index, НЕ Grep tool.
- БД: встроенный `node:sqlite` DatabaseSync, НЕ better-sqlite3.
- Git: коммитить только изменённые файлы.