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

4.5 KiB
Raw Blame History

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 из манифестов.

openSim('stereo:figure'), ?stereofig=, обратная совместимость magnetic/coulomb→emfield, thinlens/mirrors/refraction→opticsbench.

Проектные правила (НЕ нарушать)

  • Иконки: только inline SVG .ic, НЕ эмоджи.
  • Поиск по коду: ast-index, НЕ Grep tool.
  • БД: встроенный node:sqlite DatabaseSync, НЕ better-sqlite3.
  • Git: коммитить только изменённые файлы.