Skip to main content

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 composants
  • src/core/system/ contient le contrat des systèmes
  • src/core/world/ contient le monde d'exécution

Les types principaux sont:

  • World, qui stocke les entités, les composants et les systèmes
  • Entity, qui expose directement les opérations sur les composants
  • Component, qui est la classe de base des objets de données ECS
  • System, 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.ts contient les composants partagés côté rendu
  • src/three/systems/ contient les systèmes spécifiques à Three.js
  • src/three/world/ contient l'aide de démarrage pour une seule scène
  • src/three/scenes/ contient le gestionnaire multi-scènes
  • src/three/canvas/ contient le gestionnaire du canvas du renderer
  • src/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'échelle
  • Object3DComponent, qui encapsule un Object3D Three.js
  • TransformSyncSystem, qui interroge TransformComponent et Object3DComponent
  • SceneAttachmentSystem, qui attache et détache des instances de Object3D
  • ThreeSceneManager, qui gère plusieurs scènes indépendantes
  • ThreeCanvasManager, qui contrôle la taille du canvas, le ratio et le centrage
  • UIPanelComponent, UITextComponent et UIElementComponent, qui composent les interfaces rendues directement dans Three.js

Flux d'exécution

  1. Crée un World ou un ThreeSceneManager
  2. Crée une entité
  3. Instancie les composants et attache-les avec entity.addComponent(...)
  4. Enregistre les systèmes dont tu as besoin
  5. Laisse les systèmes interroger le monde avec world.query(...)
  6. Appelle step(deltaTime) ou update(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.