# ARCHI_MESH_MATERIAL.md ## La nouvelle vision architecturale : L'Atelier de Rendu Pour comprendre notre structure, imagine que tu veux peindre 10 tableaux différents. **Avant :** Chaque tableau possédait sa propre cuisine et ses propres outils. C'était inefficace. **Après :** Tu as un Atelier (`Renderer`) qui orchestre le dessin et possède les outils de base (`Device`, `Queue`, `Format`). Il utilise des Recettes (`Material` + `PipelineCache`) pour définir l'apparence et traite des Toiles (`Mesh`) pour la géométrie. --- ## 1. Le Mesh (La Géométrie) Il est purement passif. Il ne sait pas comment il est affiché, il sait seulement ce qu'il est. - **Contenu :** `vertex_buffer`, optionnellement `index_buffer`, et les compteurs (`num_vertices`, `num_indices`). - **Rôle :** Fournir les données brutes au GPU. --- ## 2. Le Material & PipelineCache (Le Look & La Recette) Le look est découplé de la géométrie via une gestion centralisée. - **PipelineCache :** Bibliothèque de recettes. Il charge les shaders (WGSL), compile les `RenderPipeline`, et les met en cache (via `HashMap` + `Arc`) pour éviter de dupliquer les ressources GPU. - **Material :** Instance légère qui pointe vers une recette compilée. Il contient un `shader_id` et une référence partagée (`Arc`) vers le `RenderPipeline`. - **Rôle :** Garantir la réutilisation. Si 100 objets partagent le même shader, ils pointent tous vers la même instance compilée. --- ## 3. Le Renderer (L'Orchestrateur propriétaire) Le `Renderer` a été promu au rang de propriétaire des ressources matérielles. - **Contenu :** `device`, `queue`, `format`. - **Rôle :** 1. **Initialisation :** Reçoit le `Context` au démarrage et s'approprie ses ressources. 2. **Exécution :** Orchestre les appels GPU en utilisant ses ressources internes. Il expose une API simplifiée qui ne demande plus à l'utilisateur de manipuler le `device` ou la `queue`. 3. **Présentation :** Possède la méthode `present(frame)` qui utilise sa `queue` interne pour afficher l'image. ```rust // Exemple d'orchestration simplifiée dans main.rs renderer.render(frame.view(), &mesh, &material); renderer.present(frame); // Plus besoin de passer la queue !