Перейти к содержанию

Scene Extensions

tc_scene_extension позволяет подключать stateful-модули к сцене без изменения core-структур.

Что даёт extension-слой

  • Отдельный реестр типов расширений.
  • Экземпляры расширений на конкретных сценах.
  • Хуки update / before_render, вызываемые в потоке кадра.
  • Сериализация/десериализация по persistence_key.

Базовый поток работы

1. Зарегистрировать тип

tc_scene_ext_type_id type_id = tc_scene_ext_register(&(tc_scene_ext_type_desc){
    .name = "MyExtension",
    .persistence_key = "my_ext",
    .create = my_ext_create,
    .destroy = my_ext_destroy,
    .on_scene_update = my_ext_update,
    .on_scene_before_render = my_ext_before_render,
    .serialize = my_ext_serialize,
    .deserialize = my_ext_deserialize,
});

2. Подключить к сцене

tc_scene_ext_attach(scene, type_id);

3. Получить instance

void* ext = tc_scene_ext_get(scene, type_id);

4. Отключить

tc_scene_ext_detach(scene, type_id);
// или отключить все:
tc_scene_ext_detach_all(scene);

Хуки расширения

Хук Когда вызывается
on_scene_update(ext, dt, userdata) В конце tc_scene_update, после update компонентов
on_scene_before_render(ext, userdata) В конце tc_scene_before_render
serialize(ext, out_data, userdata) При сериализации сцены
deserialize(ext, in_data, userdata) При десериализации сцены

Формат сериализации

Сериализация сцены формирует словарь, где ключ — persistence_key расширения:

{
  "my_ext": { ... },
  "physics": { ... }
}

Когда использовать

Extensions подходят для систем, которые:

  • Работают на уровне всей сцены, а не отдельной сущности.
  • Имеют собственное состояние, которое нужно сохранять.
  • Должны обновляться каждый кадр.

Примеры: физический мир, навигационная сетка, аудио-менеджер, система частиц.