410eb8a862
Два дефекта, из-за которых 3D читался как плоская диаграмма: - painter-сортировка была по возрастанию z (ближние первыми) — дальние атомы рисовались поверх ближних. Теперь единый список примитивов (атомы + половинки связей) сортируется по убыванию z (дальние первыми). - связи были тонкими плоскими линиями. Теперь — затенённые «цилиндры»: толстый штрих с поперечным градиентом (центр светлее, края темнее), двухцветные (каждая половина под цвет своего атома) — фирменный вид ball-and-stick. Ширина зависит от перспективы (ближе — толще). - усилена перспектива (fov 900→700), добавлен тёмный ободок сфер для объёма. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4.5 KiB
4.5 KiB
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:sqliteDatabaseSync, НЕ better-sqlite3. - Git: коммитить только изменённые файлы.