diff --git a/README.md b/README.md index 220d029..2cc390f 100644 --- a/README.md +++ b/README.md @@ -145,7 +145,7 @@ pollster = "0.4" # only if you use the async AppBuilder | Run the working example | `cargo run -p wsg-lib --example manual` | | Check everything (incl. examples) | `cargo check --all-targets` | -The `manual` example is the reference for the working workflow. The `simple` example (App facade) is work in progress and currently does not compile. +The `manual` example is the reference for the working, pixel-rendering workflow. The `simple` example (App facade) now compiles and opens a window with a running update → render → present loop, but it does not draw a scene yet (see [Roadmap](#roadmap)). ## Documentation diff --git a/docs/PLAN.md b/docs/PLAN.md index 58fd6c1..7f3a1c1 100644 --- a/docs/PLAN.md +++ b/docs/PLAN.md @@ -13,9 +13,9 @@ Ce plan définit les étapes prioritaires pour finaliser l'architecture actuelle > **Statut réel (à jour au 2026-09-14).** Ce plan couvre la phase de *consolidation* passée ; la source > de vérité sur l'état actuel est **README.md** et le code. Plusieurs cases `[X]` ci-dessous ont été -> re-corrigées car elles ne reflétaient plus la réalité : notamment l'exemple `simple` **ne compile pas** -> actuellement (`App::new()` obsolète, à remplacer par `AppBuilder`) et le rendu de la `Scene` n'est -> **pas automatisé** (items Phase 2 et Check-list concernés). +> re-corrigées car elles ne reflétaient plus la réalité : notamment le rendu de la `Scene` n'est +> **pas automatisé** (items Phase 2 et Check-list concernés). Depuis, `simple.rs` a été mis en +> conformité (API `AppBuilder`, ~15 lignes, compilation sans importer `winit`/`wgpu`). ## Phase 1 : Finalisation et Nettoyage de l'Existant (Priorité Absolue) @@ -57,7 +57,7 @@ Une fois la plomberie encapsulée, nous devons rendre l'assemblage des objets co ### Refonte des Exemples -- [ ] `simple.rs` doit devenir le modèle : **15 lignes** de code, pas de manipulation WGPU explicite (actuellement ne compile pas — API obsolète `App::new()` → `AppBuilder`). +- [X] `simple.rs` doit devenir le modèle : **15 lignes** de code, pas de manipulation WGPU explicite (mis en conformité : `AppBuilder`, compile sans `winit`/`wgpu`). - [X] `manual.rs` doit rester disponible en tant que tutoriel pour ceux qui veulent contourner l'abstraction App. ### Nettoyage du Code Interne @@ -74,7 +74,7 @@ Une fois les phases 1 à 3 validées, nous pourrons introduire : ## Check-list de Vérification pour le LLM d'Assistance -- [ ] Est-ce que `simple.rs` compile sans importer `winit` ou `wgpu` ? (ne compile pas actuellement ; `App::new()` → `AppBuilder`) +- [X] Est-ce que `simple.rs` compile sans importer `winit` ou `wgpu` ? (oui — modèle 15 lignes, API `AppBuilder`) - [ ] Est-ce que `App::run` gère bien le cycle update → render → present ? (boucle + présentation OK, mais `render()` ne peut pas encore dessiner — vue de frame non exposée) - [X] Les modules sont-ils bien exposés via `lib.rs` ? - [X] `pollster` est-il uniquement en dev-dependencies ? diff --git a/lib/examples/simple.rs b/lib/examples/simple.rs index 1dd59a2..a43f5f9 100644 --- a/lib/examples/simple.rs +++ b/lib/examples/simple.rs @@ -1,59 +1,19 @@ -use wsg_lib::resources::{Material, Mesh, Vertex}; -use wsg_lib::utils; +//! Workflow déclaratif minimal (~15 lignes), sans manipulation WGPU explicite. +//! `AppBuilder` ouvre la fenêtre, construit le `Context`/`Renderer` et fait tourner la boucle +//! update → render → present. Le rendu automatisé de la scène n'est pas encore en place +//! (README, Roadmap étape 1) : `render()` est donc vide pour l'instant. +use wsg_lib::app::AppBuilder; +use wsg_lib::utils::WsgError; use wsg_lib::{App, AppHandler}; -// 1. On définit notre "Jeu" qui implémente le comportement -struct MonQuad { - mesh: Mesh, - material: Material, -} +struct MonQuad; impl AppHandler for MonQuad { - fn render(&mut self, app: &mut App) {} + fn render(&mut self, _app: &mut App) {} } #[pollster::main] -async fn main() -> Result<(), wsg_lib::utils::WsgError> { - // 2. Initialisation via le Builder - let mut app = App::new().await?; - - // 3. Setup des ressources (déclaration) - app.cache - .register_shader("basic", utils::BASIC_SHADER_PATH) - .unwrap(); - - let vertices: [Vertex; 4] = [ - Vertex { - position: [-0.5, 0.5, 0.0], - normal: [0.0, 0.0, 1.0], - uv: [0.0, 0.0], - color: [1.0, 0.0, 0.0, 1.0], - }, - Vertex { - position: [0.5, 0.5, 0.0], - normal: [0.0, 0.0, 1.0], - uv: [1.0, 0.0], - color: [0.0, 1.0, 0.0, 1.0], - }, - Vertex { - position: [0.5, -0.5, 0.0], - normal: [0.0, 0.0, 1.0], - uv: [1.0, 1.0], - color: [0.0, 0.0, 1.0, 1.0], - }, - Vertex { - position: [-0.5, -0.5, 0.0], - normal: [0.0, 0.0, 1.0], - uv: [0.0, 1.0], - color: [1.0, 1.0, 0.0, 1.0], - }, - ]; - let indices: [u16; 6] = [0, 1, 2, 0, 2, 3]; - - let mesh = Mesh::new(app.context.device(), &vertices, Some(&indices)); - let material = Material::new(app.renderer.format(), "basic", &mut app.cache); - - // 4. Lancement de la boucle (la magie opère ici) - let handler = MonQuad { mesh, material }; - app.run(handler) +async fn main() -> Result<(), WsgError> { + let app = AppBuilder::new().title("WSG Simple").build().await?; + app.run(MonQuad) }