Architecture
Envy est organisé en un petit ensemble de couches ciblées.
1. Coeur ECS
Le coeur ECS vit dans src/core.
src/core/component/contient les classes de base des composantssrc/core/system/contient le contrat des systèmessrc/core/world/contient le monde d'exécution
Les types principaux sont:
World, qui stocke les entités, les composants et les systèmesEntity, qui expose directement les opérations sur les composantsComponent, qui est la classe de base des objets de données ECSSystem, qui définit la logique exécutée à chaque étape
2. Intégration Three.js
La couche Three.js vit dans src/three.
src/three/components.tscontient les composants partagés côté rendusrc/three/systems/contient les systèmes spécifiques à Three.jssrc/three/world/contient l'aide de démarrage pour une seule scènesrc/three/scenes/contient le gestionnaire multi-scènessrc/three/canvas/contient le gestionnaire du canvas du renderersrc/three/ui/contient les composants et systèmes d'UI Three.js
Les types principaux sont:
TransformComponent, qui stocke la position, la rotation et l'échelleObject3DComponent, qui encapsule unObject3DThree.jsTransformSyncSystem, qui interrogeTransformComponentetObject3DComponentSceneAttachmentSystem, qui attache et détache des instances deObject3DThreeSceneManager, qui gère plusieurs scènes indépendantesThreeCanvasManager, qui contrôle la taille du canvas, le ratio et le centrageUIPanelComponent,UITextComponentetUIElementComponent, qui composent les interfaces rendues directement dans Three.js
Flux d'exécution
- Crée un
Worldou unThreeSceneManager - Crée une entité
- Instancie les composants et attache-les avec
entity.addComponent(...) - Enregistre les systèmes dont tu as besoin
- Laisse les systèmes interroger le monde avec
world.query(...) - Appelle
step(deltaTime)ouupdate(deltaTime)
Philosophie
La bibliothèque privilégie une API petite et explicite.
- pas de magie cachée
- pas de couches d'abstraction inutiles
- un modèle de données facile à tester
- des systèmes faciles à composer
Le but est de garder le framework modulaire afin de pouvoir remodeler le comportement en ajoutant ou en déplaçant des composants plutôt qu'en réécrivant des objets entiers.
En pratique, cela signifie que tu dois pouvoir déplacer le comportement d'un objet avec seulement quelques lignes modifiées, tout en gardant le code simple, maintenable et réutilisable.