Aller au contenu

Modules SIECS

Un module est une unité d’importation qui regroupe les enregistrements d’une fonctionnalité. Il peut capturer les composants, relations, systèmes et observateurs créés pendant son import.

ECS_MODULE_DECLARE(physics, { float gravity; });
ECS_MODULE_DEFINE(physics);
void physics_import(const physics_props_t *props) {
ECS_COMPONENT_REGISTER(Position);
(void)props;
ecs_system({ /* ... */ });
}
ecs_module_id_t physics_id = ECS_MODULE_IMPORT(physics, {
.gravity = 9.81f,
});

L’import est idempotent dans un monde : le premier ensemble de propriétés reste celui utilisé si le module est importé plusieurs fois.

Le module C++ natif est l’équivalent typé d’un import C sans propriétés :

ECS_MODULE_DECLARE(rendering, {});
ECS_MODULE_DEFINE(rendering);
void rendering_import(const rendering_props_t *props) {
(void)props;
ecs_system({ .name = "Render", .callback = render_system });
}
ECS_MODULE_IMPORT(rendering, {});

Les modules natifs C++ reçoivent les arguments de ecs::import<T>(args...) dans leur méthode statique import.

ecs_module_disable(physics_id);
ecs_module_enable(physics_id);

Désactiver un module désactive les systèmes et observateurs qu’il a capturés. Les composants, relations et données existantes restent valides.

Les modules sans paramètres utilisent une structure de propriétés vide :

ECS_MODULE_DECLARE(rendering, {});
ECS_MODULE_DEFINE(rendering);
void rendering_import(const rendering_props_t *props) {
(void)props;
ecs_system({ /* ... */ });
}
ECS_MODULE_IMPORT(rendering, {});

Pendant ECS_MODULE_IMPORT, les enregistrements effectués avec l’API publique normale sont associés au module :

ECS_COMPONENT_REGISTER(Position);
ecs_system({ /* ... */ });
ecs_observer({ /* ... */ });

Les imports imbriqués sont autorisés. Les enregistrements effectués après un import imbriqué restent associés au module parent.

Désactiver un module ne désactive que ses systèmes et observateurs. Les composants, relations et hooks restent enregistrés :

ecs_module_disable(physics_id);
ecs_module_enable(physics_id);

Un import est idempotent dans le monde actif. Le premier import fixe les propriétés ; les imports suivants retournent le même identifiant et ne créent pas de doublons. Un module typé ne doit pas être utilisé simultanément dans deux mondes actifs.

La capture a lieu uniquement pendant l’enregistrement. Elle n’ajoute pas de recherche ou de branchement à l’itération des requêtes. Activer ou désactiver un module parcourt ses systèmes et observateurs enregistrés ; l’opération est donc proportionnelle à la taille du module.