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>
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
# 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: коммитить только изменённые файлы.
|
||||
Reference in New Issue
Block a user