Migration Checklist: termin -> termin-scene¶
Дата среза: March 3, 2026.
Цель¶
Вынести tc_scene, tc_entity (entity pool/handles), tc_component и минимально необходимые зависимости в отдельную библиотеку termin-scene, чтобы:
termin-sceneсодержал ядро ECS/lifecycle;terminподключал это ядро как внешнюю зависимость;- subsystem-specific runtime state (render/collision/editor) жил в extension-ах и/или в
termin.
Текущее состояние (факт)¶
termin-sceneинициализирован и собирается как отдельная C-библиотека.- В
termin-sceneуже перенесен базовый scene-core набор (tc_scene,tc_entity_pool,tc_component,tc_type_registry,tc_archetype,tc_hash_map,tc_scene_extension). tc_types/tc_value/tc_dlistвынесены вtermin-base; вterminиtermin-sceneоставлены совместимые thin-wrapper заголовки.- В перенесенной версии
tc_sceneудалены прямые зависимости на render/collision shim API. - В
terminextension-инфраструктура уже реализована (tc_scene_ext_*). - В
termin/core_cпока остается legacy-реализация до переключенияterminна внешнийtermin-scene.
Definition of Done (миграция завершена)¶
termin-sceneсобирается и ставится как отдельная библиотека.terminне содержит исходниковtc_scene/tc_entity_pool/tc_component(берет их изtermin-scene).- В публичном API scene-core нет subsystem-specific API (collision/render shims).
terminпроходит сборку и smoke-тесты со внешнимtermin-scene.- Legacy fallback-десериализация удалена только после перевода потребителей.
Этап 0. Bootstrap termin-scene¶
- [x] Инициализировать репозиторий
termin-sceneрабочим содержимым (не пустой gitdir). - [x] Добавить
CMakeLists.txtдля сборкиtermin_scene. - [x] Добавить install/export (
termin_sceneConfig.cmake) по аналогии сtermin-base/termin-graphics. - [x] Подключить
termin-sceneв верхнеуровневые скрипты окружения (build-and-install.shи Windows-скрипт).
Критерий готовности:
rg --files /home/mirmik/project/termin-env/termin-sceneвозвращает исходники/заголовки.
Этап 1. Выделить минимальный scene-core набор¶
Переносимый минимум (из termin/core_c):
- [x]
tc_scene.[ch] - [x]
tc_scene_pool.h - [x]
tc_entity_pool.[ch] - [x]
tc_entity_pool_registry.[ch] - [x]
tc_component.[ch] - [x]
tc_type_registry.[ch] - [x]
tc_archetype.[ch] - [x]
tc_hash_map.[ch](или зависимость наtermin-base, см. decision gate ниже) - [x]
tc_types.h(или эквивалентный shared base import)
Что уходит в termin-base:
- [x]
tc_value.[ch](общий контейнерный тип для C API; вынесен вtermin-base) - [x]
tc_dlist.h(общая intrusive list utility; вынесена вtermin-base)
Минимальные внешние зависимости:
- [x]
tcbase(tc_log,tc_binding_types) - [x]
tgfx/tc_resource_map(нужно для type maps вsceneиtype_registry)
Decision gate по tc_hash_map:
- [x] Оценить абстрактность
tc_hash_map: - если API и семантика общие (не scene-specific), переносим в
termin-base; - если есть привязка к ECS/scene данным, оставляем в
termin-scene. - [x] Зафиксировать решение и обновить зависимости в CMake.
- Решение: пока оставляем
tc_hash_mapвtermin-sceneдо отдельного выноса утилит вtermin-base.
Критерий готовности:
- Сборка
termin-sceneуспешна без линковки наrender,physics,editorмодули.
Этап 2. Убрать subsystem-specific связность из tc_scene¶
Обязательные изменения перед/во время выноса:
- [x] Убрать из
tc_scene.cпрямые include: core/tc_scene_render_mount.hcore/tc_scene_render_state.hphysics/tc_collision_world.h- [x] Убрать прямую инициализацию built-in extension-ов из
tc_scene_pool_init(). - [x] Убрать auto-attach built-in extension-ов из
tc_scene_pool_alloc(). - [x] Удалить legacy shim API:
tc_scene_get_collision_worldtc_scene_set_collision_world
Критерий готовности:
- Команды ниже не находят совпадений:
rg -n "tc_scene_render_mount|tc_scene_render_state|tc_collision_world" core_c/src/tc_scene.c
rg -n "tc_scene_get_collision_world|tc_scene_set_collision_world" core_c/include/core/tc_scene.h core_c/src/tc_scene.c
Этап 3. Инициализация extension-ов переносится в termin¶
После удаления из scene-core:
- [ ] Регистрация built-in extension-типов (
render_mount,render_state,collision_world) выполняется вterminstartup слое. - [ ] Attach нужных extension-ов при создании сцены выполняется в
termin(C++/scene manager слой), а не в scene-core.
Критерий готовности:
- Scene-core не знает о конкретных extension type id.
Этап 4. Подключить termin к внешнему termin-scene¶
- [x] В
termin/cpp/CMakeLists.txtубратьadd_subdirectory(${TERMIN_ROOT}/core_c ...)для перенесенных модулей. - Реализовано через
TC_USE_EXTERNAL_SCENE=ON:termin_coreсобирается без scene-core исходников и линкуется с внешнимtermin_scene. - [x] Линковать
terminна установленный пакетtermin_scene. - [x] Поправить include paths/exports для заголовков scene-core.
Критерий готовности:
termin/build.sh --cleanпроходит, и бинарники используют внешнююtermin_sceneбиблиотеку.
Этап 5. ABI/Bindings cleanup¶
- [ ] Проверить внешние ABI-слои (в т.ч. C# P/Invoke), что нет ссылок на удаленный legacy API.
- [ ] Проверить Python/C++ биндинги на отсутствие прямой зависимости от удаленных shim-функций.
Критерий готовности:
rg -n "tc_scene_get_collision_world|tc_scene_set_collision_world" /home/mirmik/project/termin-env
должен вернуть 0 совпадений.
Этап 6. Удаление legacy fallback в десериализации¶
Только после полного перевода потребителей:
- [ ] Удалить fallback чтение legacy top-level полей в
TcSceneRef::load_from_data(): viewport_configs/scene_pipelinesbackground_color,ambient_*,shadow_settings,skybox_*
Критерий готовности:
- Scene JSON использует только
extensions.*для subsystem state.
Быстрый pre-flight перед началом фактического переноса¶
- [ ] Зафиксировать текущий baseline сборки
termin. - [ ] Добавить smoke-тест: создать сцену, добавить сущность и компонент, прогнать
update()/before_render(). - [ ] Прогнать сериализацию/десериализацию сцены с
extensions.
Дополнение: План выноса tc_inspect / tc_kind / component runtime¶
Контекст: для полезного termin-scene недостаточно только C scene-core. Нужны:
- CxxComponent / PythonComponent;
- сериализация/десериализация через tc_inspect + tc_kind;
- регистрация компонентных фабрик.
Наблюдаемая граница (по состоянию на March 4, 2026)¶
Уже scene-core и переносимо в termin-scene:
- core_c/include/inspect/tc_inspect.h, core_c/src/tc_inspect.c (C dispatcher)
- core_c/include/inspect/tc_kind.h, core_c/src/tc_kind.c (C dispatcher)
- termin-scene C registry/factory (tc_component_registry_*) уже вынесен.
Сейчас смешано с termin runtime:
- core_c/src/tc_inspect_instance.cpp тянет CxxComponent, CxxFramePass, mesh/material и C++ runtime.
- cpp/termin/inspect/tc_kind_cpp.cpp регистрирует tc_mesh и tc_material через TcMesh/TcMaterial.
- Python kind/inspect bridge (bindings/inspect/*) завязан на nanobind и модули termin.*.
Решение по границе¶
Что уходит в termin-scene:
- tc_inspect/tc_kind C dispatcher;
- C++ inspect/kind scene-level registry (InspectRegistry, KindRegistryCpp);
- CxxComponent / tc_component_python runtime;
- scene-level component factory flow (C++/Python компоненты, без render/editor pass API).
Что остается в termin:
- pass-specific inspect (tc_pass_inspect_*);
- render/editor-specific kinds (tc_mesh, tc_material, и т.п.) как extension registration;
- C#-specific glue (если не переносится отдельным шагом).
Этап 7. Разрезать inspect API на scene-level и pass-level¶
- [ ] Убрать
tc_pass_inspect_get/setиз переносимогоtc_inspectAPI (оставить вtermin-слое). - [ ] Оставить в
termin-sceneтолько inspect API, относящийся к компонентам/типам сцены.
Критерий:
- termin-scene не содержит зависимостей на tc_pass/render frame pass.
Этап 8. Перенос tc_inspect/tc_kind (C dispatcher) в termin-scene¶
- [ ] Перенести
tc_inspect.[ch],tc_kind.[ch]вtermin-scene. - [ ] Подключить в
termin-scene/CMakeLists.txt, install/export. - [ ] Удалить дубли/старые копии в
termin/core_c.
Критерий:
- termin-scene собирает inspect/kind dispatcher без зависимостей на termin/cpp.
Этап 9. Перенос C++ inspect/kind registry в termin-scene¶
- [ ] Перенести
tc_inspect_cpp.hppи C++ реализацию registry. - [ ] Перенести
tc_kind_cpp.*вtermin-sceneC++ слой. - [ ] Убрать из core-инициализации auto-registration
tc_mesh/tc_material; перенести их регистрацию вtermin.
Критерий:
- KindRegistryCpp и InspectRegistry доступны из termin-scene без include на termin/mesh и termin/material.
Этап 10. Перенос CxxComponent / PythonComponent runtime¶
- [ ] Перенести
entity/component.[hc]ppиtc_component_python.*вtermin-scene. - [ ] Перенести/адаптировать
ComponentRegistrybridge на новую границу. - [ ] Для Python class resolution ввести callback/resolver (убрать hardcoded import списки из scene-core).
Критерий:
- базовый жизненный цикл C++/Python компонентов работает при линковке только с termin-scene.
Этап 11. Тесты для inspect/kind/component runtime¶
- [ ] Добавить C тесты:
tc_kind_parse,tc_kind_*dispatcher (mock lang registries),tc_inspect_serialize/deserializeчерез mock vtable.- [ ] Добавить C++ тесты:
- roundtrip для
InspectRegistry + KindRegistryCpp(int/float/string/vec3). - [ ] Добавить Python smoke:
- регистрация
PythonComponent, - фабричное создание через registry,
- serialize/deserialize поля через inspect.
Критерий:
- тесты переехавших слоев запускаются в CI termin-scene.