La documentation reflète désormais uniquement ce qui *est* et ce qu'on
envisage de faire, pas ce qui aurait pu être (changements d'avis retirés) :
ROADMAP.md
- 1.2 : remplacé le récit de décision 'transform sur Mesh' (DRAFT Étape 8,
déviation) par l'énoncé de l'état actuel : Mesh porte son matériau + sa
Geometry CPU partagée, pas de transform (porté par Entity).
- Phase 2 réécrite : suppression des 'Arènes complètes' (SlotMap) et de la
struct Entity { mesh_id, material_id } contredite par l'Étape 7 (material
déplacé sur Mesh) et le choix String IDs ; migration 'handles typés'
conservée comme unique pointeur (1.4 / Notes de Décision).
- 4.2 : 'Lumières hémisphériques' cochée (déjà dans standard_shader).
- Notes de Décision : retiré 'UVs en Phase 4' (caduque, UVs implémentés dès
Geometry).
PLAN.md
- Statut réel condensé et mis à jour jusqu'à l'Étape 10 (textures).
- Phase 4 : Textures cochée (faite), Lumières laissée en plan (ROADMAP 4.2).
- Check-list pollster dé-obsolétisée ; suppression de la 'Note pour mémoire'
décrivant le module-pivot exec.rs qu'on a décidé de ne pas construire.
DRAFT.md
- Vidé (fin de l'Étape 10) en préparation de l'étape suivante.
7.0 KiB
type, title, description, tags, status, generated
| type | title | description | tags | status | generated | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Plan | Implementation Plan for wsg_lib Engine Consolidation and Finalization | Implementation plan defining priority steps to finalize the current architecture, making the API intuitive for standard users while maintaining power for advanced users |
|
stable |
|
Plan d'Implémentation : Consolidation et Finalisation du Moteur wsg_lib
Ce plan définit les étapes prioritaires pour finaliser l'architecture actuelle. L'objectif est de rendre l'API intuitive pour l'utilisateur standard tout en conservant la puissance de contrôle pour l'utilisateur avancé.
Statut réel (à jour au 2026-09-18). La phase de consolidation (Phases 1 à 3 de ce plan) est terminée ; la source de vérité sur l'état actuel est README.md et le code. Depuis la révision du 2026-09-14, le rendu de la
Sceneest automatisé en une passe groupée (App::render_scene(frame.view()), appelée par défaut dansAppHandler::render) etsimple.rs(APIAppBuilder, sanswinit/wgpu) déclare un quad rendu automatiquement. Les étapes suivantes ont ensuite : posé l'infrastructure 3D (bind groups uniformes frame+object partagés, caméra active, matrices monde par entité — Étapes 3+4, 2026-09-16) ; atteint le MVP 3D Phong (Étape 5, 2026-09-17 : l'exemplecube; le 2D plat = variante unlit destandardviaRenderer::set_unlit) ; rattaché lePipelineCacheà laSceneet fait référencer sonMaterialpar chaqueMesh(Étape 7) ; donné àMeshune source de vérité CPU partagée (geometry: Arc<Geometry>, Étape 8) ; activé un depth buffer sur toutes les passes (Étape 9) ; et ajouté les textures diffuses (Étape 10, 2026-09-18 :resources::Texture+ bind group @2 +Material.texture).
Phase 1 : Finalisation et Nettoyage de l'Existant (Priorité Absolue)
Cette phase vise à supprimer la dette technique et à unifier les accès.
Uniformisation des Modules
- Vérifier que tous les traits (
AppHandler) et structures (App,Context) sont explicitement marquéspubdans leurs fichiers sources. - Ré-exporter l'API dans
lib.rspour permettre des imports simplifiés (ex :use wsg_lib::{App, AppHandler}). - Nettoyer les accès internes pour que l'utilisateur n'ait pas à importer les modules système (
core,pipeline) sauf besoin spécifique.
Abstraction de la Boucle (App::run)
- Déplacer la gestion de
winit::event_loopet desFrameà l'intérieur de la méthoderun()deApp. - Garantir que le trait
AppHandlerreçoit une référence àApppermettant d'appelerapp.rendererouapp.scene. - Supprimer toute gestion de
FrameouEventLoopmanuelle des exemples utilisateurs (simple.rs).
Correction du Builder et Initialisation
- Standardiser la création de
Appvia unAppBuilderrobuste. - Gérer les
dev-dependenciesdanslib/Cargo.toml(notammentpollsteravec la featuremacro) pour permettre la compilation des exemples sans polluer les dépendances finales de la librairie.
Phase 2 : Structure de Rendu et Scène
Une fois la plomberie encapsulée, nous devons rendre l'assemblage des objets cohérent.
Intégration de la Scene
- Formaliser la structure
Scene: un conteneur qui liste les Entities. - Associer le
PipelineCacheà la Scene pour que la gestion des matériaux soit entièrement portée par la scène (actuellement le cache est porté parApp, indépendant de la Scene — le rendu de la scène est, lui, déjà automatisé depuis 2026-09-16). (fait — 2026-09-17, DRAFT Étape 7 :Scene::init_gpudétient device+format+PipelineCache;Appn'a plus de champcache) - Implémenter la logique de rendu de la scène :
App::render_scene(view)parcourt la scène, récupère les matériaux et soumet tous les draw calls en une seule passe groupée (Renderer::render_scene), appelée automatiquement chaque frame par l'implémentation par défaut deAppHandler::render(Scene auto-render — réalisé 2026-09-16). Reste à brancher : associé auPipelineCacheporté par laScene(cf. ligne précédente).
Gestion des Matériaux et Shaders
- S'assurer que chaque Mesh possède une référence vers un Material (à l'heure actuelle le lien est porté par l'entité
(mesh_id, material_id)de la Scene, pas par le Mesh lui-même). (fait — 2026-09-17, DRAFT Étape 7 :Mesh.material: Option<Arc<Material>>;Entity { mesh_id, transform }, plus dematerial_id) - Implémenter le comportement par défaut : si aucun matériau n'est assigné, le moteur injecte automatiquement le
standard_shader(variante unlit) (non implémenté). (fait — 2026-09-17, DRAFT Étape 7.3.5 :Scene::default_material()injectestandard; le flat reste piloté parRenderer::set_unlit)
Phase 3 : Documentation et Interface (API "User-Friendly")
Refonte des Exemples
simple.rsdoit devenir le modèle : 15 lignes de code, pas de manipulation WGPU explicite (mis en conformité :AppBuilder, compile sanswinit/wgpu).manual.rsdoit rester disponible en tant que tutoriel pour ceux qui veulent contourner l'abstraction App.
Nettoyage du Code Interne
- Vérifier les durées de vie (lifetimes) et les Arc pour s'assurer qu'aucune fuite mémoire ou accès concurrentiel invalide ne survient lors des changements de frame.
Phase 4 : Nouvelles Fonctionnalités (Planification Future)
Une fois les phases 1 à 3 validées, nous pourrons introduire :
- Système de Lumières : Ajout de buffers d'uniformes dans le PipelineCache (planifié — ROADMAP 4.2, Éclairage avancé).
- Textures : Intégration d'un module de chargement d'images et de BindGroups (fait 2026-09-18,
Étape 10, ROADMAP 4.1 :
resources::Texture, bind group @2,Material.texture). - Caméras : Gestion des matrices de projection/vue dans la Scene (fait 2026-09-16, Étape 4.3 —
Scene::set_camera/camera()porte une caméra active ;render_sceneécrit view/proj/cam_pos réels dans le buffer frame chaque frame, aspect calculé depuis la fenêtre).
Check-list de Vérification pour le LLM d'Assistance
- Est-ce que
simple.rscompile sans importerwinitouwgpu? (oui — modèle 15 lignes, APIAppBuilder) - Est-ce que
App::rungère bien le cycle update → render → present ? (oui — la vue de frame est exposée viaFrame::view(),render()dessine la scène automatiquement en une passe viaApp::render_scene(frame.view()), la présentation est faite parApp::run) - Les modules sont-ils bien exposés via
lib.rs? pollsterest-il isolé de l'utilisateur final ? — résolu : depuis winit 0.30 (2026-09-16),pollsterest endependenciesde la lib ; leblock_onde l'init GPU est appelé une seule fois danslib/src/app.rs(resumed()). Les exemples compilent sans le connaître (crates séparées).